Перейти к основному содержимому

Введение в Netflix Genie

· 5 мин. чтения

1. Обзор

В этом руководстве мы собираемся изучить движок Genie, который Netflix разработал для абстрактной отправки заданий в кластеры .

Для этого руководства рекомендуются базовые знания об обработке больших данных, например, с помощью Hadoop и Spark .

2. Почему Джинн?

Давайте представим, что у нас есть много пользователей, которым нужно отправлять различные задачи в облако, содержащее большое количество кластеров Hadoop разных размеров . В то время как некоторые кластеры создаются для обработки данных в определенное время, другие сосредоточены на отключении служб для высвобождения ресурсов. Таким образом, пользователи столкнутся с проблемой поиска подходящего кластера для своей работы.

Если предположить, что многие пользователи даже не хотят создавать кластеры или знать о конфигурации, это может стать реальной проблемой. Как насчет того, чтобы предоставить пользователям возможность просто отправлять свои задания и получать результаты без необходимости заниматься настройкой инфраструктуры?

3. Что такое джинн?

Netflix создал Genie как распределенный движок, чтобы точно решить вышеупомянутые проблемы. Механизм, предоставляющий унифицированные RESTful API для автономной отправки заданий . Genie отделяет запуск заданий от конфигурации, что позволяет гибко масштабировать кластеры. ****

Однако Genie не масштабирует кластеры сама по себе — она просто выполняет задачи пользователей, запуская их работу в кластере, соответствующем их потребностям.

Планирование — это не то, для чего Genie был создан. Основная цель — управление заданиями на уровне одного задания.

Для планирования рабочего процесса следует использовать другие инструменты, такие как Apache Oozie . Фактически, Netflix ясно заявляет, что:

Genie не является планировщиком рабочих процессов, как Oozie. Единицей выполнения Genie является одно задание Hadoop, Hive или Pig. Genie не планирует и не запускает рабочие процессы — на самом деле мы используем корпоративный планировщик (UC4) в Netflix для запуска нашего ETL.

Тем не менее Genie предлагает API для управления такими ресурсами, как кластеры, приложения и команды. После регистрации ресурсов пользователи могут обнаружить их и начать отправлять свои задания.

Наконец, стоит отметить, что Genie — это проект с открытым исходным кодом, более или менее адаптированный к конкретным потребностям Netflix. Он играет важную роль в быстро меняющейся облачной среде Netflix и интегрируется со стеком технологий Netflix.

4. Джинн в действии

Теперь давайте посмотрим на Genie в действии, чтобы лучше понять, как мы можем использовать его для отправки заданий. В качестве введения мы будем работать с демо-версией Genie, доступной на GitHub.

4.1. Предпосылки

Этот пример требует:

  • последние версии Docker и Docker Compose (или Docker Desktop, который включает обе версии)
  • следующие свободные порты: 8080, 8088, 19888, 19070, 19075, 8089, 19889, 19071 и 19076
  • относительно мощная машина с оперативной памятью не менее 8 ГБ, из которых 4 ГБ должны быть выделены для докера
  • не менее 4 ГБ дискового пространства

4.2. Настройка кластера

Прежде всего, мы должны позаботиться о настройке наших кластеров с помощью Docker Compose , загрузив docker-compose.yml в папку по нашему выбору. Для этого создадим новый каталог с именем demoDir . Файл компоновки определяет пять сервисов, которые мы собираемся исследовать один за другим.

Во-первых, давайте взглянем на сервер Genie, который будет работать в контейнере с именем genie_demo_app_3.3.9 , который сопоставляет порт 8080 с пользовательским интерфейсом Genie:

genie:
image: netflixoss/genie-app:3.3.9
ports:
- "8080:8080"
depends_on:
- genie-hadoop-prod
- genie-hadoop-test
- genie-apache
tty: true
container_name: genie_demo_app_3.3.9

Второй сервис — genie_demo_apache_3.3.9 , который используется для загрузки файлов, необходимых для демонстрации:

genie-apache:
image: netflixoss/genie-demo-apache:3.3.9
tty: true
container_name: genie_demo_apache_3.3.9

Далее идет клиент Genie, который содержит примеры сценариев для отправки заданий с помощью Genie. Имя его контейнера — genie_demo_client_3.3.9 :

genie-client:
image: netflixoss/genie-demo-client:3.3.9
depends_on:
- genie
tty: true
container_name: genie_demo_client_3.3.9

Наш производственный (SLA) кластер Hadoop следующий. Эта служба будет получать наши представленные вакансии. Диспетчер ресурсов кластера сопоставляется с портом 8088, тогда как сервер истории получает 19888.

Здесь мы внесем небольшую корректировку и сопоставим узлы named и data с портами 19070 и 19075 соответственно:

genie-hadoop-prod:
image: sequenceiq/hadoop-docker:2.7.1
command: /bin/bash -c "/usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver
&& /etc/bootstrap.sh -bash"
ports:
- "19888:19888"
- "19070:50070"
- "19075:50075"
- "8088:8088"
tty: true
container_name: genie_demo_hadoop_prod_3.3.9

Наконец, давайте рассмотрим тестовый контейнер Hadoop, представляющий тестовый кластер. Как и производственному кластеру, ему назначаются порты 8089 (менеджер ресурсов), 19889 (сервер истории), 19071 (именованный узел) и 19076 (узел данных):

genie-hadoop-test:
image: sequenceiq/hadoop-docker:2.7.1
command: /bin/bash -c "/usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver
&& /etc/bootstrap.sh -bash"
ports:
- "19889:19888"
- "19071:50070"
- "19076:50075"
- "8089:8088"
tty: true
container_name: genie_demo_hadoop_test_3.3.9

Давайте запустим вышеупомянутые контейнеры, запустив docker-compose из demoDir. Это займет больше времени при первом запуске, так как необходимо загрузить демонстрационные изображения:

cd demoDir
docker-compose up -d

Мы можем убедиться, что кластер запущен и готов, проверив:

  • Пользовательский интерфейс Genie: http://localhost:8080
  • Пользовательский интерфейс менеджера ресурсов кластера SLA: http://localhost:8088
  • Пользовательский интерфейс диспетчера ресурсов кластера TEST: http://localhost:8089

4.3. Начальная демонстрация

Теперь, после запуска демонстрационных контейнеров, мы можем войти в клиентский контейнер с помощью команды docker exec :

docker exec -it genie_demo_client_3.3.9 /bin/bash

Теперь внутри клиентского контейнера мы выполняем сценарий инициализации, чтобы подготовить кластеры к принятию наших заданий :

./init_demo.py

Если демонстрация прошла успешно, пользовательский интерфейс Genie отобразит данные в кластерах, командах и вкладках приложений.

4.4. Отправка работы

В качестве другого примера давайте отправим задание Spark для вычисления первых 10 десятичных цифр числа π. Мы можем отправить задание либо на тест, либо на SLA, передав соответствующий литерал в качестве аргумента сценарию:

./run_spark_submit_job.py sla 2.0.1
./run_spark_submit_job.py test 2.0.1

На вкладке Jobs в пользовательском интерфейсе Genie мы можем щелкнуть значок папки в описании каждого задания, чтобы перейти к выходной папке. Оттуда, в случае успешного завершения, мы можем найти вычисленное значение в stdout.

./b607faaa215ed581686c5d41be7fbb89.png

Пользовательский интерфейс диспетчера ресурсов Hadoop также отображает кластерные задания.

./9c1c7f9a55cc4f9edba630a6644370be.png

Наконец, мы выходим из клиентского контейнера, останавливаем и удаляем все демонстрационные контейнеры, выполнив:

docker-compose down

Образы по-прежнему будут доступны на диске, и мы можем снова запустить демонстрационные контейнеры в любое время.

5. Вывод

В этом руководстве мы представили Genie, инструмент управления заданиями, разработанный Netflix.

Затем мы просмотрели демонстрацию, которая дала нам практический пример того, как мы можем использовать Genie в реальных сценариях.

Как всегда, пример кода есть на GitHub .