Читалка логов Databricks
zencity/databricks-logs-readerCLI-инструмент для чтения логов Databricks-заданий из Unity Catalog Volumes. Объединяет логи драйвера и исполнителей в хронологическом порядке, поддерживает фильтрацию и интеграцию с Claude Code для анализа ошибок прямо в чате.
Установка
git clone https://github.com/zencity/databricks-logs-reader.gitREADME
dbr-logs
Получение и отображение логов Databricks-заданий из Unity Catalog Volumes.
Объединяет логи драйвера и исполнителей в хронологическом порядке с метками источника — можно передавать в grep, jq или отправлять в LLM.
Зачем это нужно
Отладка упавшего Databricks-задания требует навигации по глубоко вложенной, непоследовательно структурированной директории логов:
dbfs:/Volumes/catalog/schema/logs/prod/my-spark-job/0311-170011-t5450avl/
├── driver/
│ ├── stderr
│ ├── stderr--2026-03-11--18-00 # ротированный, plain text
│ ├── stderr--2026-03-11--19-00 # ротированный, plain text
│ ├── stdout
│ ├── log4j-active.log
│ └── log4j-2026-03-11-17.log.gz # ротированный, gzipped
├── executor/
│ └── app-20260311170849-0000/ # непрозрачный app ID
│ ├── 0/
│ │ ├── stderr
│ │ ├── stderr--2026-03-11--18.gz # ротированный, gzipped
│ │ └── stdout
│ ├── 1/
│ ├── 2/
│ ...
│ └── 8/
└── eventlog/
Ручной процесс поиска причины сбоя:
- Найти запуск — идентификаторы запусков — непрозрачные строки вида
0311-170011-t5450avl, не читаемые человеком - Навигация по дереву — логи драйвера, исполнителей или оба? У какого из 9 исполнителей возникла ошибка?
- Смешанное сжатие — ротированные файлы драйвера — plain text, ротированные файлы исполнителей —
.gz. Нужно выполнитьdatabricks fs cp+gunzipдля чтения - Конкатенация ротированных файлов — один поток разбит на активный файл и несколько ротированных, которые нужно читать в хронологическом порядке
- Повторение для каждого исполнителя — для задания с 9 исполнителями это потенциально 9 × 4 файла для проверки
- Сопоставление временных меток — первопричина часто в одном источнике, а симптомы проявляются в другом
О том, как работает Python-логирование в Databricks и почему оно приводит к такой структуре, читайте в статье Everything You Wanted to Know About Python Logging in Databricks.
Существуют более тяжёлые альтернативы — Practitioner's Ultimate Guide to Scalable Logging от Databricks описывает полный пайплайн логирования, а также можно направлять логи Databricks в Datadog или аналогичные платформы наблюдаемости. Но эти решения несут значительные постоянные затраты и инфраструктурные накладные расходы для задачи, которая большинству команд нужна лишь изредка при отладке упавшего задания. dbr-logs — бесплатная альтернатива без инфраструктуры: установите CLI-инструмент, выполните одну команду, получите ответ.
dbr-logs заменяет ручной процесс одной командой. Инструмент обнаруживает структуру логов, скачивает и распаковывает все файлы, объединяет всё хронологически с метками источника и позволяет фильтровать по уровню, источнику или регулярному выражению.
Требования
- Python 3.11+ (протестировано на 3.11, 3.12, 3.13, 3.14)
- Databricks CLI с настроенным хотя бы одним профилем в
~/.databrickscfg(руководство по настройке) - Unity Catalog Volumes в качестве назначения логов, настроенного для ваших Databricks-заданий (
cluster_log_conf, указывающий на путь в Volumes)
Установка
# Установка как CLI-инструмент через uv (рекомендуется)
uv tool install dbr-logs
# Или через pipx (изолированное окружение)
pipx install dbr-logs
# Или через pip (используйте --user для глобальной установки без влияния на venv)
pip install --user dbr-logs
# Или запуск без установки
uvx dbr-logs <job-name>Использование
# Получить логи последнего запуска задания
dbr-logs my-job-name
# Получить логи конкретного запуска
dbr-logs my-job-name --run-id 12345
# Использовать URL рабочего пространства Databricks
dbr-logs "https://dbc-xxx.cloud.databricks.com/jobs/12345/runs/67890?o=123"
# Показать только ошибки
dbr-logs my-job-name --level ERROR
# Сосредоточиться на логах приложения (подавить шум Spark/JVM)
dbr-logs my-job-name --focus
# Показать только логи исполнителей
dbr-logs my-job-name --source executor
# Показать последние 50 строк конкретного исполнителя
dbr-logs my-job-name --source executor:3 --tail 50
# Вывод в формате JSONL для передачи в jq
dbr-logs my-job-name --format jsonl | jq '.level'
# Логи за последний час
dbr-logs my-job-name --since 1hИнтеграция с Claude Code
dbr-logs включает плагин для Claude Code, позволяющий получать и анализировать логи прямо из диалога с Claude.
Установка плагина
# Вариант 1: плагин Claude Code
/marketplace add https://github.com/zencity/databricks-logs-reader
/plugin add dbr-logs
# Вариант 2: skills.sh (работает с Claude Code, Cursor, Windsurf и др.)
npx skills add zencity/databricks-logs-readerCLI-инструмент всё равно нужно устанавливать отдельно (pip install dbr-logs или uv tool install dbr-logs), однако скилл также может использовать uvx как запасной вариант без установки.
Пример взаимодействия
Вы: проверь логи для my-spark-job
Claude:
Выполняет: dbr-logs my-spark-job --level ERROR,WARN --focus --format jsonl
Анализирует вывод, затем отвечает:
«Последний запуск (0311-170011-t5450avl) содержит 3 ошибки:
- driver/stderr: TransportChannelHandler connection timeout to 10.177.10.232 after 600s
- executor/0-7 stderr: HangingTaskDetector сообщает о зависших задачах 140953, 140957 на 10+ мин
Первопричина: зависание чтения shuffle — исполнители зависают на получении удалённых блоков.
Рекомендуемые действия:
- Проверить исполнитель на 10.177.10.232 на предмет нехватки ресурсов
- Включить spark.shuffle.io.retryWait / spark.shuffle.io.maxRetries
- Пересмотреть количество shuffle-партиций для уменьшения объёма данных на задачу»
Параметры
| Параметр | Краткий | Описание |
|---|---|---|
--run-id | -r | Числовой идентификатор запуска Databricks. По умолчанию — последний запуск. |
--env | -e | Окружение: prod, staging, ondemand. По умолчанию: prod. |
--dbr-profile | -p | Имя профиля Databricks CLI. |
--source | -s | driver, executor, executor:N или all (по умолчанию). |
--stream | stderr, stdout или all (по умолчанию). | |
--level | -l | Точное совпадение, через запятую: ERROR, WARN, INFO, DEBUG. |
--include-log4j | Включить log4j-файлы (по умолчанию исключены). | |
--focus | -f | Подавить шум Spark/JVM, показать только логи приложения. |
--filter | Регулярное выражение для фильтрации строк. | |
--tail | -t | Показать последние N строк. |
--since | Показать логи начиная с указанного времени (например, 1h, 30m). | |
--format | text (по умолчанию) или jsonl. | |
--no-color | Отключить цветной вывод. | |
--verbose | -v | Подробный вывод для отладки. |