Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2018. Павел Димитрюк (Beeline) — Обработка и хранение потоковых данных в Apache Ignite

CodeFest 2018. Павел Димитрюк (Beeline) — Обработка и хранение потоковых данных в Apache Ignite

Посмотрите выступление Павла: https://2018.codefest.ru/lecture/1288/

Хочу поделиться опытом применения Apache Ignite в обработке потоковых данных больших объемов (500К/sec). Показать какие дополнительные возможности появляются в случае хранения окна потоковых данных в in-memory. Рассказать какие бизнес-кейсы мы решили на базе Apache Ignite. Показать на проблемы с которыми мы сталкивались в процессе эксплуатации.

CodeFest

April 05, 2018
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. Обработка и хранение потоковых данных в Apache Ignite Хочу поделиться

    опытом применения технологии In-Memory Data Grid в потоковой обработке данных (500К/sec) Павел Димитрюк Программист Beeline
  2. Это моё личное мнение • Я показываю только суть и

    применяемые подходы • Реализация имеет право отличаться • Не согласны? Давайте спорить! 2
  3. Кому интересно? • Разработчики ◦ JVM languages ◦ C++ ◦

    .NET ◦ JDBC, ODBC ◦ ... • Архитекторы 4
  4. Немного о нас Нам департамент занимается развитием технологий больших данных

    в Билайн. Данное подразделение образовано в 2012 году в Новосибирске. Уже как 6 лет мы занимается opensource технологиями связанными с BigData. 6
  5. Немного о нас Нам департамент занимается развитием технологий больших данных

    в Билайн. Данное подразделение образовано в 2012 году в Новосибирске. Уже как 6 лет мы занимается opensource технологиями связанными с BigData. Мы занимается развитием и сопровождением core-части Data Management Platform. Стараемся использовать только opensource 7
  6. План доклада • Текущую архитектуру BigData платформы • Почему начали

    смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite 9
  7. План доклада • Текущую архитектуру BigData платформы • Почему начали

    смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? 10
  8. План доклада • Текущую архитектуру BigData платформы • Почему начали

    смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? • Особенности эксплуатации Apache Ignite 11
  9. Ну, поехали! • Текущую архитектуру BigData платформы • Почему начали

    смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? • Особенности эксплуатации Apache Ignite 12
  10. 21

  11. Цель кластера • Запросы на данных больших объемов (источники по

    2TB в день) • Объединение данных из различных источников (> 50 источников) 23
  12. Цель кластера • Запросы на данных больших объемов (источники по

    2TB в день) • Объединение данных из различных источников (> 50 источников) • Анализ показателей мобильной сети 24
  13. Цель кластера • Запросы на данных больших объемов (источники по

    2TB в день) • Объединение данных из различных источников (> 50 источников) • Анализ показателей мобильной сети • Построение витрин данных 25
  14. Цель кластера • Запросы на данных больших объемов (источники по

    2TB в день) • Объединение данных из различных источников (> 50 источников) • Анализ показателей мобильной сети • Построение витрин данных • Аналитические запросы 26
  15. Цель кластера • Запросы на данных больших объемов (источники по

    2TB в день) • Объединение данных из различных источников (> 50 источников) • Анализ показателей мобильной сети • Построение витрин данных • Аналитические запросы • Машинное обучение 27
  16. Какие данные собираем? Данные поступают более чем из 50 источников

    Природа данных: • События с телекоммуникационного оборудования • Логи • Информация из различных информационных систем • Справочники 28
  17. Немного цифр 29 Hadoop: Серверов: более 250 node CPU: более

    6000 core HDD: более 10 PB RAM: более 25 TB Ежедневный прирост: 15 TB Kafka: Серверов: более 15 node Input: 1’700’000 rec/sec (240 MB/sec) Output: 530 MB/sec NoSQL: 350K req/sec NiFi: Серверов: более 20 node Output: 1’400’000 rec/sec Ignite: Серверов: около 10 node RAM: 900 GB Input: 500’000 rec/sec
  18. Немного цифр 30 Hadoop: Серверов: более 250 node CPU: более

    6000 core HDD: более 10 PB RAM: более 25 TB Ежедневный прирост: 15 TB Kafka: Серверов: более 15 node Input: 1’700’000 rec/sec (240 MB/sec) Output: 530 MB/sec NoSQL: 350K req/sec NiFi: Серверов: более 20 node Output: 1’400’000 rec/sec Ignite: Серверов: около 10 node RAM: 900 GB Input: 500’000 rec/sec
  19. Немного цифр 31 Hadoop: Серверов: более 250 node CPU: более

    6000 core HDD: более 10 PB RAM: более 25 TB Ежедневный прирост: 15 TB Kafka: Серверов: более 15 node Input: 1’700’000 rec/sec (240 MB/sec) Output: 530 MB/sec NoSQL: 350K req/sec NiFi: Серверов: более 20 node Output: 1’400’000 rec/sec Ignite: Серверов: около 10 node RAM: 900 GB Input: 500’000 rec/sec
  20. Немного цифр 32 Hadoop: Серверов: более 250 node CPU: более

    6000 core HDD: более 10 PB RAM: более 25 TB Ежедневный прирост: 15 TB Kafka: Серверов: более 15 node Input: 1’700’000 rec/sec (240 MB/sec) Output: 530 MB/sec NoSQL: 350K req/sec NiFi: Серверов: более 20 node Output: 1’400’000 rec/sec Ignite: Серверов: около 10 node RAM: 900 GB Input: 500’000 rec/sec
  21. Batch vs Stream processing • Пакетная обработка данных (batch processing)

    ◦ off-line ◦ большие пачки данных • Потоковая обработка данных (stream processing) ◦ on-line ◦ данные поступают непрерывно ◦ интересно каждое событие в отдельности 34
  22. Ей, что дальше? • Текущую архитектуру BigData платформы • Почему

    начали смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? • Особенности эксплуатации Apache Ignite 38
  23. Какие задачи? • Обработка потоковых данных с “какой-то” бизнес логикой

    ◦ Обогащение потока данных ◦ Создание триггерной системы (реагирование на определенные события происходящие в рамках одного ключа) 40
  24. Какие задачи? • Обработка потоковых данных с “какой-то” бизнес логикой

    ◦ Обогащение потока данных ◦ Создание триггерной системы (реагирование на определенные события происходящие в рамках одного ключа) ◦ Актуализация профиля в realtime 41
  25. Какие задачи? • Обработка потоковых данных с “какой-то” бизнес логикой

    ◦ Обогащение потока данных ◦ Создание триггерной системы (реагирование на определенные события происходящие в рамках одного ключа) ◦ Актуализация профиля в realtime • Доступ по REST API 42
  26. В чем сложность? • Поток данных в 500’000 в сек

    • 90’000’000 пар ключ-значение 44
  27. В чем сложность? • Поток данных в 500’000 в сек

    • 90’000’000 пар ключ-значение • Реагирование на изменение в атрибутах 45
  28. В чем сложность? • Поток данных в 500’000 в сек

    • 90’000’000 пар ключ-значение • Реагирование на изменение в атрибутах • Расчет “оконных метрик” 46
  29. Эти задачи сводятся к ... Некоему гибриду из: • Потоковой

    обработки • Накопления стейта из потока данных 48
  30. Эти задачи сводятся к ... Некоему гибриду из: • Потоковой

    обработки • Накопления стейта из потока данных • Получение данных из стейта по ключу ◦ Данные можно привести в виду key -> value 49
  31. Эти задачи сводятся к ... Некоему гибриду из: • Потоковой

    обработки • Накопления стейта из потока данных • Получение данных из стейта по ключу ◦ Данные можно привести в виду key -> value • Job-ы на этом стейте 50
  32. На кой черт тебе это надо? • Текущую архитектуру BigData

    платформы • Почему начали смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? • Особенности эксплуатации Apache Ignite 51
  33. Зачем тут распределенные системы? • Как выдержать такой поток обновлений?

    • Горизонтальное масштабирование • Сохранность данных 54
  34. Зачем тут распределенные системы? • Как выдержать такой поток обновлений?

    • Горизонтальное масштабирование • Сохранность данных • Логика обработки отправляется к данным 55
  35. Зачем тут распределенные системы? • Как выдержать такой поток обновлений?

    • Горизонтальное масштабирование • Сохранность данных • Логика обработки отправляется к данным • Ночью нужно спать! 56
  36. Что такое распределенные системы? 63 • Шардирование данных • Избыточность

    в хранении ◦ Достижение консенсуса • Распределенные вычисления
  37. Неужели… дошли до Ignite! • Текущую архитектуру BigData платформы •

    Почему начали смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? • Особенности эксплуатации Apache Ignite 66
  38. Внимание Мное что будет рассказано о возможностях Apache Ignite, актуально

    и для других IMDG систем На время доклада это все одно и тоже: • Apache Ignite • IMDG (In-Memory Data Grid) • IMDF (In-Memory Data Fabric) 67
  39. Что такое Apache Ignite? (Key, Value) -> 68 p/s Так

    происходило мое осознание :)
  40. Что такое Apache Ignite? (Key, Value) -> HashMap -> get(),

    put() 69 p/s Так происходило мое осознание :)
  41. Что такое Apache Ignite? (Key, Value) -> HashMap -> get(),

    put() ConcurrentHashMap -> JCache, transaction 70 p/s Так происходило мое осознание :)
  42. Что такое Apache Ignite? (Key, Value) -> HashMap -> get(),

    put() ConcurrentHashMap -> JCache, transaction Distributed Cache -> peer-to-peer communication 71 p/s Так происходило мое осознание :)
  43. Что такое Apache Ignite? (Key, Value) -> HashMap -> get(),

    put() ConcurrentHashMap -> JCache, transaction Distributed Cache -> peer-to-peer communication Distributed computing -> tasks, map-reduce 72 p/s Так происходило мое осознание :)
  44. Что такое Apache Ignite? (Key, Value) -> HashMap -> get(),

    put() ConcurrentHashMap -> JCache, transaction Distributed Cache -> peer-to-peer communication Distributed computing -> tasks, map-reduce Distributed DataBase -> SQL, Table, Indexes 73 p/s Так происходило мое осознание :)
  45. Что такое Apache Ignite? (Key, Value) -> HashMap -> get(),

    put() ConcurrentHashMap -> JCache, transaction Distributed Cache -> peer-to-peer communication Distributed computing -> tasks, map-reduce Distributed DataBase -> SQL, Table, Indexes Distributed services -> Service grid 74 p/s Так происходило мое осознание :)
  46. Еще что-то есть…? • Текущую архитектуру BigData платформы • Почему

    начали смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? • Особенности эксплуатации Apache Ignite 79
  47. Следующий шаг эволюции 88 • Affinity collocation ◦ Данные и

    вычисления радом ◦ Связанные данные рядом
  48. Следующий шаг эволюции 89 • Affinity collocation ◦ Данные и

    вычисления радом ◦ Связанные данные рядом • P2P коммуникация узлов
  49. Как готовим Ignite? • Ignite развернут в Kubernetes • Данные

    из Kafka вычитываются каждой серверной Ignite нодой ◦ Часть данных через клиентские Ignite ноды 91
  50. Как готовим Ignite? • Ignite развернут в Kubernetes • Данные

    из Kafka вычитываются каждой серверной Ignite нодой ◦ Часть данных через клиентские Ignite ноды • Данные распределяются по узлам кластера согласно Affinity function 92
  51. Как готовим Ignite? • Ignite развернут в Kubernetes • Данные

    из Kafka вычитываются каждой серверной Ignite нодой ◦ Часть данных через клиентские Ignite ноды • Данные распределяются по узлам кластера согласно Affinity function • На нодах происходит обработка бизнес логикой ◦ Все данные по одному ключу находятся на одной ноде 93
  52. Как готовим Ignite? • Ignite развернут в Kubernetes • Данные

    из Kafka вычитываются каждой серверной Ignite нодой ◦ Часть данных через клиентские Ignite ноды • Данные распределяются по узлам кластера согласно Affinity function • На нодах происходит обработка бизнес логикой ◦ Все данные по одному ключу находятся на одной ноде • Персистентном для Ignite служит Cassandra 94
  53. Какой API для загрузки данных? • DataStreamer ◦ StreamReceiver ▪

    данные сохранять не обязательно 95
  54. Какой API для загрузки данных? • DataStreamer ◦ StreamReceiver ▪

    данные сохранять не обязательно • Загрузка данных их kafka реализована на reartive-kafka ◦ Мы отказались от KafkaStreamer и DataStreamer ▪ когда сдвигать offset в kafka? 96
  55. Какой API для загрузки данных? • DataStreamer ◦ StreamReceiver ▪

    данные сохранять не обязательно • Загрузка данных их kafka реализована на reartive-kafka ◦ Мы отказались от KafkaStreamer и DataStreamer ▪ когда сдвигать offset в kafka? ◦ Используем reactive-kafka и обычный putAll() ▪ offset сдвигаем после успешной записи 97
  56. Подписываемся на поток изменений 102 • Использование continuous query ◦

    LocalListener ◦ RemoteFilter ◦ initial QueryCursor • Использование services ◦ Логика на том же узле где происходят изменения
  57. Идем дальше... • Текущую архитектуру BigData платформы • Почему начали

    смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? • Особенности эксплуатации Apache Ignite 112
  58. In-memory… а где гарантии? 114 • Ignite Native Persistence ◦

    почти все хорошо ;) • 3rd party persistent storage ◦ дополнительные накладные расходы ◦ прогрев кешей
  59. - Я так сильно потерялась, что потеряла то место, где

    я потерялась... 116 Возможна ли потеря данных при аварийном выключении нод? • Синхронная запись
  60. - Я так сильно потерялась, что потеряла то место, где

    я потерялась... 117 Возможна ли потеря данных при аварийном выключении нод? • Синхронная запись • Фоновая запись ◦ batch - операции
  61. - Я так сильно потерялась, что потеряла то место, где

    я потерялась... 118 Возможна ли потеря данных при аварийном выключении нод? • Синхронная запись • Фоновая запись ◦ batch - операции • Write-Ahead Log?
  62. Прогрев caches в Ignite 120 • Загрузка данных при старте

    нод, без неё: ◦ Нельзя SQL, task и map-reduce ◦ Можно только get*(), put*()
  63. Прогрев caches в Ignite 121 • Загрузка данных при старте

    нод, без неё: ◦ Нельзя SQL, task и map-reduce ◦ Можно только get*(), put*() • Предопределили LifeCycle ◦ Ожидание топологии в N нод
  64. Прогрев caches в Ignite 122 • Загрузка данных при старте

    нод, без неё: ◦ Нельзя SQL, task и map-reduce ◦ Можно только get*(), put*() • Предопределили LifeCycle ◦ Ожидание топологии в N нод • Использование нового персистента Apache Ignite
  65. Ignite Native Persistence 123 • Durable Memory ◦ SQL и

    Map-Reduce без прогрева ◦ Часть в памяти, чать на диске
  66. Ignite Native Persistence 124 • Durable Memory ◦ SQL и

    Map-Reduce без прогрева ◦ Часть в памяти, чать на диске • Write-Ahead Log ◦ медленная синхронная запись
  67. Ignite Native Persistence 125 • Durable Memory ◦ SQL и

    Map-Reduce без прогрева ◦ Часть в памяти, чать на диске • Write-Ahead Log ◦ медленная синхронная запись • Index
  68. Ignite Native Persistence 126 • Durable Memory ◦ SQL и

    Map-Reduce без прогрева ◦ Часть в памяти, чать на диске • Write-Ahead Log ◦ медленная синхронная запись • Index • Данные на том же узле кластера
  69. Формат хранения данных 127 • Как Java Class ◦ Должен

    быть в CLASSPATH на каждом узле ◦ Что будет если отличаются версии класса?
  70. Формат хранения данных 128 • Как Java Class ◦ Должен

    быть в CLASSPATH на каждом узле ◦ Что будет если отличаются версии класса? • BinaryObject ◦ Для cassandra конвертируем к виду Map[String, Object]
  71. Формат хранения данных 129 • Как Java Class ◦ Должен

    быть в CLASSPATH на каждом узле ◦ Что будет если отличаются версии класса? • BinaryObject ◦ Для cassandra конвертируем к виду Map[String, Object] • Есть ли проблема эволюции структуры данных?
  72. Обновление только одного атрибута в значении 131 • lock ->

    get() -> modify -> put() -> unlock • invoke() + EntryProcessor
  73. Обновление только одного атрибута в значении 132 • lock ->

    get() -> modify -> put() -> unlock • invoke() + EntryProcessor • put() + CacheInterceptor
  74. Оно точно надо? • Текущую архитектуру BigData платформы • Почему

    начали смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? • Особенности эксплуатации Apache Ignite 133
  75. Какие возможности дает “окно” данных? 134 • Запуск Tasks или

    SQL слепке данных ◦ Нужно избавиться от сетевого взаимодействия при JOIN ◦ JDBC, ODBC ◦ Интеграция с Apache Zeppelin
  76. Какие возможности дает “окно” данных? 135 • Запуск Tasks или

    SQL слепке данных ◦ Нужно избавиться от сетевого взаимодействия при JOIN ◦ JDBC, ODBC ◦ Интеграция с Apache Zeppelin • Расчет оконных метрик
  77. Какие возможности дает “окно” данных? 136 • Запуск Tasks или

    SQL слепке данных ◦ Нужно избавиться от сетевого взаимодействия при JOIN ◦ JDBC, ODBC ◦ Интеграция с Apache Zeppelin • Расчет оконных метрик • Агрегация данных в удобном разрезе
  78. Как организовать “окно” данных? 138 • Вытеснение по объему ◦

    Page-based eviction ◦ Entry-based eviction • Вытеснение по времени (TTL)
  79. Ну почти… • Текущую архитектуру BigData платформы • Почему начали

    смотреть на IMDG? ◦ Распределенные системы ◦ Немного об Apache Ignite • Задачи решаемые на Apache Ignite ◦ Как реализована обработка потоковых данных? ◦ Хранение данных в Apache Ignite ◦ Зачем хранить окна потоковых данных в памяти? • Особенности эксплуатации Apache Ignite 139
  80. Особенности эксплуатации 144 • BinaryObject и его SerialVersionUID • -Djava.net.preferIPv4Stack=true

    • Корректный shutdown. SIGKILL + Docker • Thread pools ◦ Простая логика в EntryProcessor или Deadlock
  81. Особенности эксплуатации 145 • BinaryObject и его SerialVersionUID • -Djava.net.preferIPv4Stack=true

    • Корректный shutdown. SIGKILL + Docker • Thread pools ◦ Простая логика в EntryProcessor или Deadlock • Ребалансировка
  82. Особенности эксплуатации 146 • BinaryObject и его SerialVersionUID • -Djava.net.preferIPv4Stack=true

    • Корректный shutdown. SIGKILL + Docker • Thread pools ◦ Простая логика в EntryProcessor или Deadlock • Ребалансировка • Деплой новой версии
  83. Основные плюсы для нас 150 • Ignite Native Persistence ◦

    SQL и Map-Reduce без прогрева Cache • Данные и логика обработка живут в одной JVM ◦ Это и плюс и минус ◦ Именно нужные данные рядом!
  84. Основные плюсы для нас 151 • Ignite Native Persistence ◦

    SQL и Map-Reduce без прогрева Cache • Данные и логика обработка живут в одной JVM ◦ Это и плюс и минус ◦ Именно нужные данные рядом! • Хранение данных в offHeap
  85. Основные плюсы для нас 152 • Ignite Native Persistence ◦

    SQL и Map-Reduce без прогрева Cache • Данные и логика обработка живут в одной JVM ◦ Это и плюс и минус ◦ Именно нужные данные рядом! • Хранение данных в offHeap • Наличие вторичных индексов ◦ Key-value недостаточно, нужны вторичные индексы
  86. Минусы • Медленный персистент в случае WAL + FSYNC mode

    • Критичны “тормоза” в коммуникации узлов кластера ◦ Одна нода может влиять на весь кластер 154
  87. Минусы • Медленный персистент в случае WAL + FSYNC mode

    • Критичны “тормоза” в коммуникации узлов кластера ◦ Одна нода может влиять на весь кластер • Деплоймент новой версии приложения 155
  88. Минусы • Медленный персистент в случае WAL + FSYNC mode

    • Критичны “тормоза” в коммуникации узлов кластера ◦ Одна нода может влиять на весь кластер • Деплоймент новой версии приложения • Прогревание caches в случае “3rd party persistent storage” 156
  89. Минусы • Медленный персистент в случае WAL + FSYNC mode

    • Критичны “тормоза” в коммуникации узлов кластера ◦ Одна нода может влиять на весь кластер • Деплоймент новой версии приложения • Прогревание caches в случае “3rd party persistent storage” • Нет возможности управления правами доступа 157