Apache Zeppelin
Zeppelin — интерактивные data-блокноты с интерпретаторами: SQL, Python, Scala, Spark, Hive и живыми графиками прямо в браузере.
1. Что такое Zeppelin
Как Jupyter Notebook, но сфокусирован на данных: каждый блок (paragraph) — самостоятельная ячейка с кодом/запросом, результат отображается сразу (таблицы, графики, map). Идеален для совместной аналитики.
2. Установка
docker run -d --name zepp -p 8080:8080 \
apache/zeppelin:0.11Интерфейс: http://localhost:8080.
3. Анатомия блокнота
- Note — как файл ноутбука (набор блоков).
- Paragraph — ячейка с интерпретатором и результатом.
- Interpreters — бэкенды: spark, python, jdbc, markdown, shell.
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. Публикация и шеринг
- Публичная ссылка (аутентификация/анонимный доступ).
- Экспорт: Markdown, HTML, JSON.
- Интеграция с Spark, Presto, JDBC, Flink, Coral.
9. Многоинтерпретаторная аналитика
%spark.ndfSpark-интерпретатор открывает .ndf — DataFrame доступен между параграфами, что удобно для многошаговых конвейеров.
10. Настройка окружений и interpreter groups
Zeppelin поддерживает группы интерпретаторов — наборы, которым можно задать разные параметры для разных задач. Например, отдельные spark-сессии для dev и prod-окружений.
%spark.prod
# интерпретатор с master=spark://prod:7077
spark.range(5).show()- новая группа создаётся в меню интерпретатора: Angular → +Create new;
- каждой группе свои
spark.master, память, пароли; - переключение в параграфе — через
%<группа>.
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.
- свяжи каталог ноутбуков с репозиторием (
ZEPPELIN_NOTEBOOK_DIR); - перед публикацией прогоняй проверки:
zeppelin-daemon.sh restart; - в CI добавляй этап
generate— HTML-отчёты на основе параграфов; - для постоянных дашбордов переключай «Publish as a web page».
0 8 * * * /opt/zeppelin/bin/zeppelin-export.sh --note daily-report \
--png /srv/reports/daily.png13. 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 3014. Динамические параметры и формы
Параграфы могут принимать параметры от пользователя: выбор города, диапазон дат, сегмент. Так один блокнот превращается в интерактивный дашборд, который не требует правки кода.
%sql
SELECT date, revenue
FROM sales
WHERE city = '${city}'
AND date >= '${from}'
AND date <= '${to}'
ORDER BY date- ${var} — простое поле ввода;
- ${var=опция1|опция2} — выпадающий список;
- ${var=default} — значение по умолчанию;
- параметры передаются и между параграфами в одной сессии.
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- драйвер кладётся в папку
$ZEPPELIN_HOME/interpreter/jdbc; - для каждой БД — свой интерпретатор/URL;
- пароли лучше хранить через vault/файлы с правами;
- результаты можно конвертировать в Pandas (%python) для анализа.
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()- ввод данных в поток — маппинг в DataFrame;
- окна агрегации: как в обычном Spark, но в режиме реального времени;
- визуализация «живых» метрик в дашборде блокнота;
- осторожно с бесконечными запросами — следите за ресурсами узла.
17. Резервирование и обновление Zeppelin
Блокноты — ценные активы, а конфигурация — залог стабильной работы. Настройте резервное копирование и порядок обновления, чтобы не потерять месяцы аналитики.
- блокноты: папка
$ZEPPELIN_HOME/notebook— бэкап по cron в S3/NAS; - конфиг:
conf/zeppelin-site.xmlиzeppelin-env.sh; - версии в Git: блокноты — это JSON, их можно коммитить;
- перед апгрейдом прочитайте release notes и сделайте снапшот;
- тестируйте новую версию на тестовом инстансе до прод.
# Бэкап блокнотов каждую ночь
0 2 * * * tar -czf /backup/zeppelin-notebooks.tgz \
/opt/zeppelin/notebook18. Дашборды и публикация отчётов
Zeppelin превращает блокноты в визуальные дашборды и экспортирует их для регулярных отчётов: PDF, HTML, копирование на страницы. Результат удобно держать под рукой команде и клиентам.
- результат параграфа публикуется отдельной ссылкой с правами;
- параграфы с визуализациями собираются на общую страницу;
- экспорт PDF фиксирует выполненный блокнот в одном файле;
- автоматическая пересылка — cron + скрипт или Git-коммит.
19. Оптимизация запросов и производительность
Медленный запрос чаще проблема плана запроса, а не Zeppelin: партиционирование, индексы и фильтрация сразу влияют на время ответа. Быстрый отчёт — в навыке писать запросы, а не менять железо.
- фильтруйте по датам и ключам в самом запросе, а не после выгрузки;
- кэшируйте повторяющиеся источники: кэш Spark или materialized-представления;
- explain плана показывает, почему запрос дорогой;
- избегайте select *, выбирайте только нужные колонки.
20. Интеграция с Git и контроль версий
Блокнот — это код: история изменений, ревью и откат нужны и анализам. Git-интеграция Zeppelin позволяет хранить заметки в репозитории и синхронизировать их между инстансами.
- налицо ноутбуки — в репозиторий: метадата и код в одной системе;
- автопубликация по расписанию обновляет прод-отчёты из Git;
- конфликты правок решаются через обычные merge-процедуры;
- важна дисциплина коммитов: имя задачи и описание изменения.
21. Автоматизация регулярных отчётов
Ежедневные отчёты не должны собираться вручную: cron в Zeppelin, перезапуск параграфов и рассылка результатов выводят аналитику на автопилот.
- настройте параметры и даты в параграфе — отчёт подставляется автоматически;
- cron-задача обновляет результат по расписанию;
- публикация или экспорт складывает итоговый файл;
- рассылка: почта, мессенджер или внешний скрипт после завершения.
Что дальше
Zeppelin часто берут как фронт к Spark и Presto; альтернатива блокнотов — Jupyter для Python-EDA.