Data Engineering, который смог

(в DevOps)

Паша Финкельштейн, JetBrains

Кто я

  • 14 лет в IT
  • Сначала админ
  • Потом разработчик
  • Занимался DevOps до того, как это стало трендом 😉
  • Управлял разработчиками
  • А потом внезапно стал дата инженером
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Дата инженером? 😱

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Дата инженером? 😱

  • big learning
  • machine data
  • это не мы
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

А чем тогда?

  • Поддержка инфраструктуры
  • Архитектура системы хранения
  • Автоматизация рутины
  • ETL
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Вильгельм

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Это Вильгельм

Он занимается маркетингом

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Это Элеонора

Она работает SRE

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

А это бизнес, который им платит

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Что нужно бизнесу

  • Основной инструмент бизнеса — это эксель
  • Из него можно подключиться к БД
  • В него можно выгрузить данные из Google Analytics
  • В нём можно посчитать всякие аудитории
  • etc…
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Но со временем

  • Количество данных растёт
  • Становится сложно работать в одном файле
  • Становится слишком много ручной работы
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Кажется, нам нужно хранилище данных!

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Что же делать? 😱

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Hadoop!

  • Бесплатно
  • Умеет всё
  • Можно купить версию с поддержкой
  • Никто не умеет готовить
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Что значит «всё»?

  • SQL
  • NOSQL
  • Файлы
  • Движки запросов
  • Движки ETL
  • YARN!
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Шаг 1

  1. Без паники
  2. Открываем этот доклад
  3. Ищем волшебное слово «Ambari»
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Ambari

Даёт нам простой (сравнительно) способ установки и настройки хадупа

yum install ambari-server*.rpm
ambari-server setup
ambari-server start
# agents
yum install ambari-agent*.rpm
ambari-agent start
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Шаг 2

  1. Ставим HDFS
  2. Ставим YARN
  3. Ставим Hive
  4. Заливаем данные
  5. Начинаем делать запросы
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Бизнес растёт!

h:200px drop-shadow drop-shadow h:500px right

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

А что идёт рядом с бизнесом?

  • Больше пользователей
  • Больше данных
  • Дата саентисты! 😈
  • Много ручной работы и много новых инструментов 😟
  • box-shadow h:70 Нам нужны инсайты! Нам нужны эксперименты!!1 ™️

  • Дата инженеры!
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

И внезапно…

Дата саентисты генерируют много кода.

Дата инженеры часто не имеют квалификации его проверить и времени его поддерживать.

Время DevOps

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Звуки паники

Вопросы:

  • Continuous integration
  • Continuous delivery
  • Frequent releases
  • Secured Process
  • Automated rollback
  • Automated testing
  • Monitoring

Courtesy of @vvsevolovich

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Continuous integration

  • Редко много народу работает над одним куском кода
  • Все задачи достаточно сильно изолированы
  • Нет больших причин усложнять ветвление

И найти ошибки всё равно сложно

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

План по DevOps

  • ☑️ Continuous integration
  • Continuous delivery
  • Frequent releases
  • Secured Process
  • Automated rollback
  • Automated testing
  • Monitoring
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Continuous delivery

Как пространство для фантазии

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Что нужно для CD?

  • Миграция БД
  • Способ протестировать то что сделал (автоматически?)
  • Выкатывать обновления
    (без скандалов с заказчиков)
  • Откатывать обновления
  • Автоматизировать запуск
  • Всё это должны делать люди, далёкие от администрирования
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Миграция БД

Production-ready решений нет!

Есть вопрос на reddit, где нет ответа 😄

Поэтому пользуемся тем, что сделал я: asm0dey/liquibase-hive

Надеюсь что всё станет лучше 🙏

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Протестировать то, что сделал

Собрать, задеплоить, запустить

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Есть много решений

И все они плохие.

  • Netflix написал кучу велосипедов поверх JupyterHub
  • Кто-то всё делает прямо на проде
    • и планирует задачи кроном
  • Есть куча инструментов оркестрации задач (и все они с проблемами):
    • Airflow
    • Azkaban
    • Luigi
    • Oozie
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Наша связка

  • GNU make
  • Artifactory
  • Airflow
  • Docker (С хадупом внутри…)
  • Skein
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Собрать

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

GNU Make

make myApp
# sbt 'project myApp' assembly
# docker build ...
echo "To run your application run 'docker run --env-file …'"
projects = someProject1 someProject2 

define project_rule
    build-$1:
		sbt 'project $1' clean
endef

$(foreach f,$(projects),$(eval $(call project_rule,$f)))
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

12 Factor App

result=0
for var in "V1" "V2" "V3"; do
  if test -z "${!var}"; then
    echo "Variable $var is not defined"
    result=1
  fi
done
test $result = 0 || exit 1

spark-submit # args here
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Но зачем 12 факторов?

Практически любые задачи (ETL и DS) надо запускать периодически

  • Конфигурация переменными окружения
  • Один билд — много деплоев
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Задеплоить

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Airflow

  • Деление на среды
  • Программируем на Python
  • Есть глючный, но понятный UI (и становится лучше)
  • Очень много интеграций
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Программирование под Airflow

Два базовых понятия:

  • DAG
  • Task
dag = DAG(catchup=False, name="dag_name", 
          start_date="20200202", schedule="0 3 * * *")
task1 = SomeTask(dag=dag, name="somename1")
task2 = SomeTask(dag=dag, name="somename2")
task3 = SomeTask(dag=dag, name="")

task1 > task2 > task3
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Автоматизация рутины

  • Читаем все конфиги в формате HOCON из директории
  • Прогоняем их через DAG-генератор
  • регистрируем сгенерированные DAG'и в Airflow
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

HOCON

YAML на стероидах

dag {
  name = "somename"
  image = "docker-image-base"${dag.name}
  connections = [some, another]
}

Его отлично умеет Scala и хорошо умеет Python.
И читать просто

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Что мы храним в конфиге?

  1. Подключения
    1. БД
    2. GC/AWS/Azure etc
    3. Ceph
  2. Переменные окружения
  3. Расписания

0 2 * * */130_2_A_A_AD13 (потому что новое расписание — новый DAG)

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Запустить

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Альтернативы Docker'у

Для Spark существует несколько решений:

  1. Zeppelin
  2. spark-jobserver
  3. livy

Теоретически Zeppelin — альтернатива JupyterHub.
И с ним интегрируются Big Data Tools by JetBrains

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Zeppelin

Интерактивный блокнот, который может всё:

  • Scala
  • Java
  • Плагины
  • Внешний API

Но не смогли настроить так, чтобы работало для всех

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

spark-jobserver

is:issue is:open sort:updated-desc label:bug

На момент написания там 20 багов открытых багов, 3 из которых были для нас критичны.

В том числе баг работы с HOCON конфигурацией

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Livy

Livy enables programmatic, fault-tolerant, multi-tenant submission of Spark jobs from web/mobile apps (no Spark client needed). So, multiple users can interact with your Spark cluster concurrently and reliably.

Эту штуку неудобно использовать дата саентистам:

  • Нужна джава
  • Чтобы использовать сторонние библиотеки нужно укладывать их на HDFS
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

И всё хорошо пока всего хватает

Однако со временем призводят они.

Мне надо запустить расчёт, на который на моём ноуте не хватает памяти

Что делать?

  1. Запустить на кластере руками
  2. Запустить спарк, который в себе запустит приложение
  3. Написать драйвер для YARN
  4. или…
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Skein

A quantity of yarn, thread, or the like, put up together, after it is taken from the reel.

https://jcrist.github.io/skein/

Инструмент для запуска в кластере чего угодно

Форматы описания:

  1. YAML
  2. Python
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

YAML

master:
  resources:
    memory: 2 GiB
    vcores: 2
  env:
    FRIEND: Yarn
  files: ["..."]
  script: |
    echo "Hello, $FRIEND!"
    source .venv/bin/activate && python app.py
skein application submit spec.yml
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Python

app=skein.ApplicationSpec(
  master=skein.Master(
    script="""
    # script
    """,
    env={ FRIEND: "Yarn" },
    files=[…],
    resources=skein.Resources(
      memory=2,
      vcores=2 ) ) )

with skein.Client() as client:
  client.submit(app)
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Распределённое исполнение

Key/Value store

client.kv.wait['mykey']
client.kv['mykey'] = 'skein is a magic'

Сервисы
Кроме основного узла можно запускать любое количество вспомогательных

Scale

client.scale(myservice, 15)

Упаковка

https://jcrist.github.io/venv-pack/

venv-pack -o my_env.tar.gz

Skein из коробки поддерживает venv-pack

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Как тестироваться?

https://jcrist.github.io/hadoop-test-cluster/

  • Hadoop 2 и 3
  • Kerberos
  • YARN

Обёртка над docker-compose

@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

План по DevOps

  • ☑️ Continuous integration
  • ☑️ Continuous delivery
  • ☑️ Frequent releases
  • Secured Process
  • Automated rollback
  • Automated testing
  • Monitoring
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

DevSecOps

В основном нас волнует внутренняя безопасность и надёжность

  1. Все пароли хранятся в Ansible Vault
  2. Для каждого человека создаём пользователя с жёсткими квотами и ограничениями
  3. Все системы имеют своих собственных пользователей с правами пошире
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

План по DevOps

  • ☑️ Continuous integration
  • ☑️ Continuous delivery
  • ☑️ Frequent releases
  • ☑️ Secured Process
  • Automated rollback
  • Automated testing
  • Monitoring
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Automated rollback

Каждый джоб в докер
Версионированный докер
Версионированный набор DAG'ов в Airflow
Всё в Artifactory™

liquibase:

  1. Атомарные ченджи для каждой схемы
  2. Генерируем rollback-скрипт
  3. Выполняем rollback на одну версию назад
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

План по DevOps

  • ☑️ Continuous integration
  • ☑️ Continuous delivery
  • ☑️ Frequent releases
  • ☑️ Secured Process
  • ☑️ Automated rollback
  • ❓ Automated testing
  • Monitoring
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Monitoring

  1. Prometheus
  2. Grafana
  3. YARN UI
  4. Алерты в Slack
  5. Письма заинтересованным
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

План по DevOps

  • ☑️ Continuous integration
  • ☑️ Continuous delivery
  • ☑️ Frequent releases
  • ☑️ Secured Process
  • ☑️ Automated rollback
  • ❓ Automated testing
  • ☑️ Monitoring
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Mission accomplished?

На самом деле нет!

Впереди ждут:

  • Аутентификация через Kerberos
  • Автоматизированное разворачивание полного кластера
  • Интеграция с большим количеством DS-инструментов
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Чему мы научились?

  1. DevOps реально сделать!
  2. Просто не будет!
  3. И скучно тоже
  4. Но задачи решаются (иногда велосипедами)
  5. Инструментов много, экосистема богата, пространства для изучения бесконечно много
  6. Стройте стратегию развития вместе с заказчиком!
@asm0di0 at Twitter  @asm0dey at Telegram  #DevOops2020

Спасибо!

@asm0di0 🐦
@asm0dey 🌍
Подкаст: it.asm0dey.ru + t.me/ps_podcast