BigПочта
Алексей Вовченко
Кейс из жизни
2012 год – посылка из США под новый год, с
подарками всем друзьям
•27 ноября - экспорт из США
•25 декабря - появилась у нас на границе
•30 декабря – поездка в центральный офис EMS
вызволять (5 часов)
Ответ – Матрешка
Что такое
почта?
Ритейл
Логистика
Нельзя терять данные
47 тыс. отделений
2 млн. новых отправлений в день
200-400 млн. событий в сутки
Данные
Почты
России
Задача - Построить отказоустойчивую
инфраструктуру для решения задач почты
Получение Хранение Очистка Валидация
Обработка Аналитика Экспорт
Требования
• OpenSource
• Exadata + OracleBI
• уже работает, нужно лучше
Задачи на релиз 0
1. Получить данные от всех логистических систем
2. Построить модель данных (матрешка)
3. Построить отчет «Остатки» состояние на вчера
4. Предоставить доступ к отчету пользователям
Front REST
(in)
Map-
Reduce
Front REST
(in)
Map-
Reduce
Oozie
Front REST
(in)
Map-
Reduce
Oozie
Front REST
(in)
SQL
Релиз 0
Map-
Reduce
Oozie
Front REST
(in)
SQL
Новые задачи • Нагрузка
пользователей
• Доступ к данным
по ключу
• Обработки данных
не укладываются в
реляционную
логику
Выбор SQL движка
• Загрузка из HDFS
• Нагрузка – много пользователей
• Тяжелые OLAP запросы
Выбор SQL движка – выводы:
Все SQL движки над HDFS – медленные
Лидеры
Map-
Reduce
Oozie
Front REST
(in)
SQL
было
Map-
Reduce
Oozie
Front REST
(in)
стало
• Доступ к данным
по ключу
Доступ к данным по ключу
по ID из 100млрд записей найти 10-100 нужных (pochta.ru)
• Решение key-value базы
• Пробовали SparkSQL
• Пробовали Hadoop/Hive/in-memory/Vertica
• Кандидаты:
Релиз 1
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
Новые задачи
• А теперь давайте считать real-time…
Выбор streaming
Задачи:
• Kafka -> Kafka
• Kafka -> Cassandra
• Kafka -> Hadoop (Hive)
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
Проблемы
Spark
Streaming
Producer ?? Consumer
Producer Message Message Consumer
Producer Message Consumer
At-Most-Once
At-Least-Once
Exactly-Once
Проблемы Spark Streaming
Producer Message Message Consumer
• Spark checkpoint
когда изменился
код• Offsets Zookeeper – медленно
• Spark Kafka Direct API
• Spark checkpoint
• Реализовали свой механизм
• PostgreSQL (ключ: topic, clientid, partition id, value: offset)
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
• Данные в batch !=
streaming
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
было
Релиз 2
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
• Pentaho не
держит нагрузку
• Прием не
держит пики
• SparkThrift +
Cassandra – не
стабильны
• Spark Streaming -
высокодоступность
Масштабируемость фронтов
Map-
Reduce
Oozie
Cluster
DockerFront REST
(out)
REST
(in)
Высокодоступность SparkStreaming
• Ночью кластер занят на 100%
• Если streaming-job падает, он не может подняться
• Yarn очереди – жалко терять ресурсы
Map-
Reduce
Sqoop
Oozie
Job1
JobN
Cluster
DockerFront REST
(out)
REST
(in)
Релиз 3
Map-
Reduce
Oozie
Cluster
Spark SQL Thrift
Front REST
(in)
Map-
Reduce
Sqoop
Oozie
Job1
JobN
Cluster
DockerFront REST
(out)
REST
(in)
Релиз 3
Пилотирование Yandex ClickHouse
• Очень быстрая база
• ClickHouse + docker
• Универсальный загрузчик данных
(Spark+Scala+local-table+paritions)
Пилотирование Yandex ClickHouse
• Провели нагрузочное тестирование
• Результат – для наших задач не подходит
• Под нагрузкой – 100% (3600%)CPU
• Скорость сопоставима с Vertica, но очень большая
нагрузка на оборудование
Пилотирование Flink
• Flume не всегда стабилен
• Flume сложно мониторить
• Шаг влево-вправо – сложно
• Решение – Flink
• Пробовали NiFi – не понравился
Map-
Reduce
Sqoop
Oozie
Job1
JobN
Cluster
DockerFront REST
(out)
REST
(in)
Релиз 3
Map-
Reduce
Sqoop
Oozie
Job1
JobN
ClickHouse
Cluster
CH Front
DockerFront REST
(out)
REST
(in)
Flink
Релиз 3.5
Путь данных: Прием
data
Путь данных: Онлайн обработка
data data
Job1
data data
Путь данных: Снова онлайн обработка
data data
Job1
data data
data data
JobN
data data
JobM
Cluster
data
Путь данных: онлайн сохранение в Cassandra
Путь данных: вся онлайн обработка
data data
JobN
data data
JobM
Cluster
data
export
Путь данных: batch обработка
Oozie
data
data
data
data
Oozie
data
data
Cluster
data
Click
House
data
data
Путь данных: batch экспорт
Front+Docker+
nginx Node
(0.5X)
DataCloud front docker
(Pentaho, rest, DC services)
KafkaVertica
Node (SAS 10k)
Kafka Cluster + Vertica Cluster +
ClickHouse Cluster + Spark
Streaming Cluster
Cassandra
(SSD)
Cassandra
(SSD)
Cassandra Cluster +
HadoopControl (main ring)
DataNode
(SATA)
DataNode
(SATA)
DataNode
(SATA)
DataNode
(SATA)
DataNode
(SATA)
Hadoop Cluster
DataNode
(SATA)
А как же инфраструктура?
Одна инфраструктура
• DataLake (for RAW data)
• Batch ETL
• Real-time processing
• Analytics OLAP/OLTP processing
• High-load rest (export)
• High-load rest (input)
• DataBus
• BI
• ML
• Hortonworks HDP+HDF
• Hadoop
• Yarn
• Hive(tez)
• Spark (+streaming)
• Flume
• Kafka
• Vertica
• ClickHouse
• PostgreSQL
• Cassandra
• Pentaho BI
• Docker (scalable rest)
Можно миксовать
Map-
Reduce
Sqoop
Oozie
Job1
JobN
ClickHouse
Cluster
CH Front
DockerFront REST
(out)
REST
(in)
Flink
Нет свободной аналитики
CH Front
ClickHouse
Map-
Reduce
Sqoop
Oozie
Job1
JobN
Cluster
DockerFront REST
(out)
REST
(in)
Flink
Streaming only, no Hadoop
Map-
Reduce
Sqoop
Oozie
Flink
Job1
JobN
ClickHouse
Cluster
CH Front
DockerFront REST
(out)
REST
(in)
Hadoop only, no Streaming
Job1
JobN
Map-
Reduce
Sqoop
Oozie
ClickHouse
Cluster
CH Front
DockerFront REST
(out)
REST
(in)
Flink
Нет задач доступа по ключу
REST
(out)
Cluster
Job1
JobN
Map-
Reduce
Sqoop
Oozie
ClickHouse
CH Front
DockerFront REST
(in)
Flink
Hadoop only, нет задачи и BI
ClickHouse
CH Front
REST
(out)
Cluster
Job1
JobN
Map-
Reduce
Sqoop
Oozie
DockerFront REST
(in)
Flink
Что осталось?
• Flink->prod
• More data -> more nodes
• CI/CD full automatic
• Monitoring/puppet everything
• Sleep at the nights!
Что дальше?
• DataLab (Spark ML, …)
• IgNite
• Spark structured streaming
Выводы
• Не нужно останавливаться на достигнутом
• Каждую задачу должен решать свой инструмент
• Не надо бояться расширять архитектуру за счет хороших и
подходящих инструментов
BigПочта – вопросы?
Алексей Вовченко
AVovchenko@luxoft.com
Skype: itsnein
https://www.linkedin.com/comm/in/alexey-vovchenko-3a1b6744

BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)