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

Odnoklassniki DWH evolving

150

Odnoklassniki DWH evolving

Denis M. Gabaydulin

May 11, 2019
Tweet

Transcript

  1. 3 Что я делаю в OK? • Делаю инфраструктурные задачи

    • Копаюсь в распределенных системах ◦ базы данных, Spark, Hadoop • Решаю проблемы производительности
  2. 4 Что такое DWH в Одноклассниках? Мы помогаем нашим заказчикам

    получать ответы на вопросы и принимать решения на основе данных.
  3. 5 Кто наши заказчики? • Менеджеры (включая топ-менеджмент и CEO)

    • Разработчики • Аналитики • Продуктовые менеджеры • Маркетинг и PR • Другие компании в Mail Ru Group
  4. 12 DWH сегодня • 5000+ ядер • 40+ TB памяти

    • 11+ PB хранилище • 1000+ регулярных расчетов
  5. 13 О чем сегодня поговорим? Поговорим о таком важном компоненте

    как планировщик задач и его роли в инфраструктуре.
  6. 15 Определения Расчет (задача) - это какие то вычисления на

    Hive или Spark. Воркер - программа, которая запускает расчет. Воркер запускает расчеты последовательно. Параллельный запуск расчетов требует n воркеров.
  7. 16 Как выполнять 1000+ регулярных расчетов Если у вас 10-100

    регулярных расчетов, можно поддерживать граф вычислений вручную. У нас было именно так. К каждому воркеру статически были привязаны конкретные расчеты.
  8. 18 Что с ресурсами? Ресурсов у нас было достаточно, но

    мы не умели использовать их эффективно.
  9. 23 Проблемы • Значительная часть расчетов не готова к утру

    • При добавлении расчета надо руками определять, где он будет запускаться • Разные системы имеют свой механизм распределения задач • Кластер используется неэффективно
  10. 24 Сформулируем требования • Все задачи готовы до 10 утра

    (лучше раньше) • Быстрое восстановление после аварий и инцидентов • Совместимость со всеми системами расчетов (Spark, HIVE, custom) • Простое масштабирование системы
  11. 25 Теория • Сделать все воркеры одного типа равноправными •

    Выполнять расчеты в оптимальном порядке • Эффективно утилизировать доступные ресурсы
  12. 26 Оптимальный порядок выполнения • Задачи с максимальным суммарным временем

    выполнения должны выполняться первыми (жадность) • Задачи должны выполняться только тогда, когда их зависимости уже посчитаны
  13. 27 Теория В идеале нужно построить взвешенный ориентированный ациклический граф.

    И обойти его согласно топологической сортировки, по правилам описанным выше.
  14. 28 Определения • Вершина - конкретный расчет. • Ребро -

    зависимость между расчетами. • In-degree - кол-во ребер, направленных в вершину. • Вес - среднее время расчета из n-последних.
  15. 29 Определения 10 1 1 2 1 1 1 2

    B -> C = B родитель C C -> E = C родитель E или C зависит от B E зависит от C
  16. 31 Граф Вершина Вес A 10 B 9 C 5

    D 4 E 3 F 3 G 1 H 1 10 1 1 2 1 1 1 2 10 1 1 2 1 1 1 2
  17. 32 Граф Оптимальный порядок: A, B, C, D, E |

    F, G | H Вершина Вес A 10 B 9 C 5 D 4 E 3 F 3 G 1 H 1
  18. 34 Упрощенный алгоритм Используем “кучу” для того, чтобы выполнить условие:

    Задачи с максимальным суммарным временем выполнения должны выполняться первыми (жадность).
  19. 38 Упрощенный алгоритм. BFS Будем добавлять в очередь только те

    вершины, для которых in-degree становится 0.
  20. 39 Можно ли еще проще? Можно еще больше упростить сортировку,

    опираясь только на вес, а обновление in-degree убрать. Практика показала, что даже это уже дает значительное улучшение.
  21. 44 Реализация • Воркер запрашивает задачи у планировщика • Планировщик

    контролирует состояние всех расчетов • Планировщик гарантирует корректность. Одна и та же задача не достанется нескольким воркерам одновременно.
  22. 46 Почему мы не взяли Luigi? • Постепенное и бесшовное

    внедрение • Контроль над алгоритмом обхода графа (topsort) • На первом этапе достаточно библиотеки для клиента, и не нужна сложная инфраструктура в виде сервисов • Python, а у нас все на Java
  23. 53 Интеграция Spark и Scheduler Общее решение - выполнять разные

    расчеты в одном Spark context. Так же делает Spark Jobserver.
  24. 54 Интеграция Spark и Scheduler Общее решение - выполнять разные

    расчеты в одном Spark context. Несколько spark actions параллельно (CompletableFuture внутри).
  25. 55 Интеграция Spark и Scheduler • Сократили оверхед на запуск

    отдельного расчета • Сделали возможным использование shared cache между разными расчетами • Увеличили скорость расчета истории на порядок
  26. 56 Количество Spark jobs в час. До и после Было

    AVG = 72 Стало AVG = 14 Меньше лучше!
  27. 58 Выводы • Научились считать быстрее и эффективнее • Автоматизировали

    создание графа вычислений • Сделали универсальный компонент для параллельного выполнения задач • Computer science вечен ©