Apache Zeppelin

Zeppelin — интерактивные data-блокноты с интерпретаторами: SQL, Python, Scala, Spark, Hive и живыми графиками прямо в браузере.

Уровень: начальный 17 разделов ⏱ 2 часа

1. Что такое Zeppelin

Как Jupyter Notebook, но сфокусирован на данных: каждый блок (paragraph) — самостоятельная ячейка с кодом/запросом, результат отображается сразу (таблицы, графики, map). Идеален для совместной аналитики.

2. Установка

docker run -d --name zepp -p 8080:8080 \
  apache/zeppelin:0.11

Интерфейс: http://localhost:8080.

3. Анатомия блокнота

4. Первый параграф

%python
print('hello from python')
data = [1, 6, 2, 8]
z.show(data)

Диспетчер интерпретатора выбирается первой строкой: %spark, %sql, %md.

5. SQL и Spark в блокноте

%spark
val df = spark.read.parquet("s3a://data/sales")
df.createOrReplaceTempView("sales")
%sql
SELECT product, SUM(revenue) AS total
FROM sales
GROUP BY product
ORDER BY total DESC
LIMIT 10

Результат получает график одним кликом (bar, line, pie, histogram).

6. Динамические параметры

%sql
SELECT * FROM sales WHERE region = '{{region=EU|EU|US|APAC}}'

Синтаксис {{param=default|opt1|opt2}} создаёт dropdown в интерфейсе — параграф переиспользуется с разными входными.

7. Cron-задачи

Параграф можно запускать по расписанию (cron): блок Run on schedule — например, ежедневный отчёт в 9 утра. Результат отправляется в уведомления или Slack.

8. Публикация и шеринг

9. Многоинтерпретаторная аналитика

%spark.ndf

Spark-интерпретатор открывает .ndf — DataFrame доступен между параграфами, что удобно для многошаговых конвейеров.

Как и в Jupyter, состояние между параграфами хранится в интерпретаторе — не выключай сессию между шагами пайплайна.

10. Настройка окружений и interpreter groups

Zeppelin поддерживает группы интерпретаторов — наборы, которым можно задать разные параметры для разных задач. Например, отдельные spark-сессии для dev и prod-окружений.

%spark.prod
# интерпретатор с master=spark://prod:7077
spark.range(5).show()
Выноси общие переменные в interpreter-setting.json и храни его в Git вместе с ноутбуками — так окружение воспроизводимо.

11. Безопасность: аутентификация и шифрование

В продакшене блокнот нельзя оставлять открытым. Zeppelin закрывается auth-шраудом, а данные можно шифровать на уровне подключения.

# conf/zeppelin-site.xml
<property>
  <name>zeppelin.anonymous.allowed</name>
  <value>false</value>
</property>
<property>
  <name>zeppelin.ssl.enable</name>
  <value>true</value>
</property>
РольПрава
anonymousотключён в проде (по умолчанию запрещён)
viewerпросмотр ноутбуков и параграфов
editorзапуск и редактирование параграфов
adminнастройки, интерпретаторы, пользователи
Не держи пароли БД в открытых переменных параграфа — используй %sh с секретностями или поставь reverse proxy с TLS перед Zeppelin.

12. Интеграция с Git и автопубликация

Ноутбуки Zeppelin — обычные JSON-файлы. Их удобно версионировать в Git: изменения параграфов попадают в историю, а обновлённые блокноты выкатываются по расписанию через cron.

  1. свяжи каталог ноутбуков с репозиторием (ZEPPELIN_NOTEBOOK_DIR);
  2. перед публикацией прогоняй проверки: zeppelin-daemon.sh restart;
  3. в CI добавляй этап generate — HTML-отчёты на основе параграфов;
  4. для постоянных дашбордов переключай «Publish as a web page».
0 8 * * * /opt/zeppelin/bin/zeppelin-export.sh --note daily-report \
    --png /srv/reports/daily.png
Cron-задания в UI отличаются от этого: параграф с расписанием сохраняет и результаты, и время выполнения. Если нужен готовый файл — используй экспорт.

13. Zeppelin для командной аналитики

Zeppelin задуман как «живой журнал» для команды: параграфы с пояснениями, графики и комментарии в одном месте. Так рождается аналитическая культура без тяжёлого BI-стекла.

%md
## Отчёт за неделю
### Ключевые индикаторы
- выручка: **+14%** к прошлой неделе
- уникальных покупок: 18 200
- NPS: **62**
%sql
-- динамика к прошлому периоду
SELECT date, SUM(revenue) AS total
FROM sales
GROUP BY date
ORDER BY date
LIMIT 30
Добавляй в каждый блокнот заголовок с датой и владельцем отчёта. Через месяц объяснения «Why мы это считаем» сэкономят команде часы переписки.

14. Динамические параметры и формы

Параграфы могут принимать параметры от пользователя: выбор города, диапазон дат, сегмент. Так один блокнот превращается в интерактивный дашборд, который не требует правки кода.

%sql
SELECT date, revenue
FROM sales
WHERE city = '${city}'
  AND date >= '${from}'
  AND date <= '${to}'
ORDER BY date
Параметры сильно упрощают передачу отчётов: коллега выбирает месяц в форме, а не просит «перегнать скрипт». Это ускоряет всю аналитику в команде.

15. Подключение баз через JDBC

Zeppelin умеет обращаться к любым БД с JDBC-драйвером: PostgreSQL, MySQL, ClickHouse и другие. Подключение настраивается один раз, дальше SQL-параграфы работают как с родной базой.

# Настройка интерпретатора (в UI):
Name: jdbc/postgres
Default URL: jdbc:postgresql://db:5432/mydb
Default User: analyst
Default Password: ******
%jdbc/postgres
SELECT * FROM orders
WHERE created_at >= '${date}'
LIMIT 1000
НЕ светите пароль в параметрах параграфа: он попадёт в историю. Настройте переменные окружения или используйте защищённые credentials-модули.

16. Kafka и потоковые данные

Zeppelin соединяется с Kafka через интерпретаторы (например, Spark Structured Streaming или Flink), позволяя следить за событиями в реальном времени прямо в блокноте.

%spark
val kafkaDf = spark.readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "kafka:9092")
  .option("subscribe", "clicks")
  .load()
  .selectExpr("CAST(value AS STRING) as msg")

kafkaDf.writeStream
  .outputMode("append")
  .format("console")
  .start()
Держите стриминговый блокнот отдельно от тяжёлой batch-аналитики: live-узлы и background-запросы не должны конкурировать за память.

17. Резервирование и обновление Zeppelin

Блокноты — ценные активы, а конфигурация — залог стабильной работы. Настройте резервное копирование и порядок обновления, чтобы не потерять месяцы аналитики.

  1. блокноты: папка $ZEPPELIN_HOME/notebook — бэкап по cron в S3/NAS;
  2. конфиг: conf/zeppelin-site.xml и zeppelin-env.sh;
  3. версии в Git: блокноты — это JSON, их можно коммитить;
  4. перед апгрейдом прочитайте release notes и сделайте снапшот;
  5. тестируйте новую версию на тестовом инстансе до прод.
# Бэкап блокнотов каждую ночь
0 2 * * * tar -czf /backup/zeppelin-notebooks.tgz \
  /opt/zeppelin/notebook
Обновления серьёзно меняют форматы блокнотов и интерпретаторов: после апгрейда обязательно прогоните критичные отчёты — совместимость схема не гарантируется автоматически.

18. Дашборды и публикация отчётов

Zeppelin превращает блокноты в визуальные дашборды и экспортирует их для регулярных отчётов: PDF, HTML, копирование на страницы. Результат удобно держать под рукой команде и клиентам.

Экспортируйте из «чистого» блокнота без зависящих от времени параграфов: перезапуск не должен ломать отчёт.
Для клиентов удобнее публикация read-only-страниц, чем доступ к редактированию: права настраиваются в разделе безопасности.

19. Оптимизация запросов и производительность

Медленный запрос чаще проблема плана запроса, а не Zeppelin: партиционирование, индексы и фильтрация сразу влияют на время ответа. Быстрый отчёт — в навыке писать запросы, а не менять железо.

Стройте блокнот «сверху вниз» маленькими шагами и следите за таймингами параграфов: узкое место видно сразу.
Перезапуск всех параграфов повторяет тяжёлые шаги: кэшируйте промежуточные результаты, чтобы не пересчитывать всё заново.

20. Интеграция с Git и контроль версий

Блокнот — это код: история изменений, ревью и откат нужны и анализам. Git-интеграция Zeppelin позволяет хранить заметки в репозитории и синхронизировать их между инстансами.

Держите «золотой» блокнот с эталонными запросами в отдельной ветке: изменения появляются после ревью.
Секреты не должны попадать в Git: подключения и пароли держите в интерпретаторных настройках или vault.

21. Автоматизация регулярных отчётов

Ежедневные отчёты не должны собираться вручную: cron в Zeppelin, перезапуск параграфов и рассылка результатов выводят аналитику на автопилот.

  1. настройте параметры и даты в параграфе — отчёт подставляется автоматически;
  2. cron-задача обновляет результат по расписанию;
  3. публикация или экспорт складывает итоговый файл;
  4. рассылка: почта, мессенджер или внешний скрипт после завершения.
Держите «heartbeat»-параграф: он проверяет, что источник данных доступен и отчёт действительно выполнился.
Автоматика без мониторинга опасна: настроен у был старый источник — вы неделю рассылаете пустые цифры. Добавьте проверку результата.

Что дальше

Zeppelin часто берут как фронт к Spark и Presto; альтернатива блокнотов — Jupyter для Python-EDA.

← Вернуться к курсам