Пятая статья цикла о построении CDC-пайплайна с нуля. HDFS и Hive работают, но управлять ими через консоль неудобно. Сегодня поднимаем веб-интерфейс Hue и разбираемся, почему в 2026 году сборка из исходников требует Python 2.7.
Зачем я это пишу
Честно: в первую очередь это мои заметки. На работе я поддерживаю CDC-пайплайны, но там веб-интерфейсы уже настроены. Хочу понять, как это делается с нуля и какие подводные камни ждут.
Во вторую очередь — портфолио. Борьба с CSRF заняла несколько часов, и без возможности гуглить и экспериментировать я бы не справился. В закрытой рабочей среде такие проблемы решать сложнее.
И в третью — мотивация не бросить. Пайплайн почти готов, осталось сделать его удобным.
Что уже есть
В предыдущих статьях я поднял:
Budget Parser — Telegram-бот для парсинга банковских скриншотов
PostgreSQL с logical replication — источник данных для CDC
Kafka + Debezium — захват изменений в реальном времени
HDFS + Hive — хранилище с SQL-доступом
Всё работает, но управлять приходится через консоль. Команда hdfs dfs -ls показывает структуру директорий, beeline позволяет выполнять SQL-запросы к Hive. Работает, но хочется нормальный веб-интерфейс с автодополнением, визуализацией и возможностью быстро просматривать файлы.
Для этого существует Hue (Hadoop User Experience) — веб-интерфейс для экосистемы Hadoop от Cloudera.
Почему отдельный контейнер
Первая мысль была поставить Hue на ту же VM, где работают HDFS и Hive. Но быстрая прикидка по ресурсам показала, что это рискованно.
На VM hadoop (192.168.0.229) уже работают:
Процесс | Примерное потребление RAM |
NameNode | ~1 GB |
DataNode | ~1 GB |
SecondaryNameNode | ~0.5 GB |
Hive Metastore | ~0.5 GB |
HiveServer2 | ~1 GB |
PostgreSQL | ~0.2 GB |
Итого | ~4.5 GB |
Из 8 GB выделенных свободно около 3.5 GB. Hue добавит ещё 0.5-1 GB, и мы окажемся на грани. Если что-то пойдёт не так, начнётся swap, и вся система станет непригодной для работы.
Второй аргумент за отдельный контейнер — изоляция. Hue это Python приложение, а не Java как остальной Hadoop-стек. Если при обновлении или настройке Hue что-то сломается, HDFS и Hive продолжат работать.
Создаём LXC-контейнер:
Параметр | Значение |
CT ID | 305 |
Hostname | hue |
IP | 192.168.0.155 |
RAM | 2 GB |
Disk | 10 GB |
OS | Ubuntu 22.04 |
Попытка первая: сборка из исходников
Официальная документация Hue предлагает собрать его из исходников. Звучит солидно — полный контроль над версиями, никаких чёрных ящиков.
apt update && apt upgrade -y apt install -y python3 python3-pip python3-venv libsasl2-dev libldap2-dev \ libssl-dev libxml2-dev libxslt1-dev libffi-dev libkrb5-dev libpq-dev \ postgresql postgresql-contrib git build-essential cd /opt git clone --depth 1 --branch release-4.11.0 https://github.com/cloudera/hue.git cd /opt/hue make apps
Первая ошибка:
"PYTHON_VER is python2.7." Error: must have python development packages for python2.7.
В 2026 году Hue 4.11 всё ещё требует Python 2.7 для сборки. Ставим:
apt install -y python2.7 python2.7-dev make apps
Следующая ошибка:
sh: 1: mysql_config: not found EnvironmentError: mysql_config not found
Hue хочет собрать MySQL-python, хотя мы планируем использовать PostgreSQL. Ставим зависимости MySQL:
apt install -y default-libmysqlclient-dev make apps
И снова ошибка:
mysql.c:44:10: fatal error: myconfig.h: No such file or directory
На этом месте я понял, что сборка Hue из исходников на Ubuntu 22 — это путь в никуда. Старые зависимости, несовместимые версии библиотек, Python 2.7, который я уже не думал скачивать в 2026 году. Можно потратить ещё несколько часов на поиск правильных версий пакетов, но есть способ проще.
Попытка вторая: Docker
Docker-образ Hue поддерживается официально и избавляет от проблем с зависимостями:
apt install -y docker.io systemctl enable --now docker docker run -d \ --name hue \ --restart unless-stopped \ -p 8888:8888 \ gethue/hue:latest
Контейнер запустился. Открываю в браузере... и получаю:
CSRF error. Sorry, your session is invalid or has expired.
Это был первый из нескольких кругов конфигурационного ада.
Грабля #1: CSRF и reverse proxy
У меня настроен reverse proxy с клиентским сертификатом: внешние запросы приходят по HTTPS, проходят через несколько слоёв проксирования и попадают на Hue уже по HTTP. Hue видит HTTP-запрос, а CSRF-токен был создан для HTTPS. Django отказывается принимать такой запрос.
Создаём конфигурационный файл /opt/hue-conf/hue.ini:
[desktop] secret_key=<your-secret-key-here> http_host=0.0.0.0 http_port=8888 allowed_hosts=* secure_csrf_cookie=false csrf_trusted_origins=<your-domain> [hadoop] [[hdfs_clusters]] [[[default]]] fs_defaultfs=hdfs://192.168.0.229:9000 webhdfs_url=http://192.168.0.229:9870/webhdfs/v1 [beeswax] hive_server_host=192.168.0.229 hive_server_port=10000
Перезапускаем контейнер с монтированием конфига:
docker stop hue && docker rm hue docker run -d \ --name hue \ --restart unless-stopped \ -p 8888:8888 \ -v /opt/hue-conf/hue.ini:/usr/share/hue/desktop/conf/hue.ini \ gethue/hue:latest
Та же ошибка. Добавляю X-Forwarded-Proto https в nginx — всё ещё CSRF error. Пробую отключить secure cookies, добавить use_x_forwarded_host, разные комбинации настроек — ничего не помогает.
После часа экспериментов решаю попробовать более старую версию. Hue 4.10.0 вышел раньше и может быть менее строгим к CSRF:
docker stop hue && docker rm hue docker run -d \ --name hue \ --restart unless-stopped \ -p 8888:8888 \ -v /opt/hue-conf/hue.ini:/usr/share/hue/desktop/conf/hue.ini \ gethue/hue:4.10.0
Открываю браузер, ввожу логин и пароль первого пользователя (он становится админом)... и попадаю внутрь)
Грабля #2: Database is locked
После создания пользователя вижу белый экран и сообщение: «database is locked».
Hue по умолчанию использует SQLite для хранения своих метаданных. SQLite не рассчитан на конкурентный доступ, и при нескольких одновременных запросах начинает блокироваться.
Правильное решение — перевести Hue на PostgreSQL. Но PostgreSQL работает на хосте контейнера, а Docker-контейнер изолирован от хостовой сети.
Простой путь — запустить контейнер с --network host:
docker stop hue && docker rm hue docker run -d \ --name hue \ --restart unless-stopped \ --network host \ -v /opt/hue-conf/hue.ini:/usr/share/hue/desktop/conf/hue.ini \ gethue/hue:4.10.0
С --network host контейнер использует сетевой стек хоста напрямую. Теперь localhost внутри контейнера — это localhost хоста, и Hue может подключиться к PostgreSQL.
Создаём базу данных для Hue:
sudo -u postgres psql -c "CREATE USER hue WITH PASSWORD '<hue-db-password>';" sudo -u postgres psql -c "CREATE DATABASE hue OWNER hue;"
Обновляем /opt/hue-conf/hue.ini, добавляя секцию database:
[desktop] secret_key=<your-secret-key-here> http_host=0.0.0.0 http_port=8888 allowed_hosts=* [[database]] engine=postgresql_psycopg2 host=localhost port=5432 user=hue password=<hue-db-password> name=hue [[auth]] backend=desktop.auth.backend.AllowFirstUserDjangoBackend
Перезапускаю контейнер, открываю браузер — белый экран пропал, но появился onboarding-тур, кото��ый после прохождения приводит к... белому экрану.
Грабля #3: Сломанный onboarding tour
Открываю консоль браузера (F12) и вижу JavaScript-ошибки:

Ошибки Tether и Shepherd
Uncaught Error: Tether Error: Both element and target must be defined
The element for this Shepherd step was not found .hue-sidebar
Onboarding-тур Hue использует библиотеку Shepherd для показа подсказок. Тур пытается найти элемент .hue-sidebar, но не находит его, потому что интерфейс ещё не загрузился полностью. JavaScript падает, и весь UI ломается.
Решение — отключить тур через базу данных. Заходим в Django shell внутри контейнера:
docker exec -it hue bash
cd /usr/share/hue
./build/env/bin/hue shell
В открывшемся Python-интерпретаторе выполняем построчно:
from django.contrib.auth.models import User from desktop.models import UserPreferences user = User.objects.get(username='admin') UserPreferences.objects.update_or_create( user=user, key='is_welcome_tour_seen', defaults={'value': 'true'} ) exit()
Выходим из контейнера, обновляем страницу — и наконец видим полноценный интерфейс Hue!

Грабля #4: WebHDFS 403 Forbidden
Hive Editor работает, но File Browser показывает ошибку:

403 Client Error: Forbidden for url: http://192.168.0.229:9870/webhdfs/v1/user/admin User: hue is not allowed to impersonate admin
WebHDFS отклоняет запросы, потому что Hue пытается выполнять операции от имени пользователя admin, а HDFS не разрешает такую имперсонацию.
Нужно настроить proxy user на стороне Hadoop. На VM hadoop (192.168.0.229) редактируем /opt/hadoop/etc/hadoop/core-site.xml, добавляя внутри <configuration>:
<property> <name>hadoop.proxyuser.hue.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hue.groups</name> <value>*</value> </property>
Эти настройки разрешают пользователю hue выполнять операции от имени любого пользователя с любого хоста(не безопасно конечно, для дома пойдет)
Также создаём директории для пользователей в HDFS:
hdfs dfs -mkdir -p /user/admin hdfs dfs -chown admin:admin /user/admin hdfs dfs -mkdir -p /user/hue hdfs dfs -chown hue:hue /user/hue Перезапускаем HDFS: stop-dfs.sh start-dfs.sh
Обновляем File Browser в Hue — теперь он показывает структуру директорий HDFS.

Финальная конфигурация
После всех итераций конфиг /opt/hue-conf/hue.ini выглядит так:
[desktop] secret_key=<your-secret-key-here> http_host=0.0.0.0 http_port=8888 time_zone=Europe/Moscow allowed_hosts=* [[database]] engine=postgresql_psycopg2 host=localhost port=5432 user=hue password=<hue-db-password> name=hue [[auth]] backend=desktop.auth.backend.AllowFirstUserDjangoBackend [hadoop] [[hdfs_clusters]] [[[default]]] fs_defaultfs=hdfs://192.168.0.229:9000 webhdfs_url=http://192.168.0.229:9870/webhdfs/v1 [beeswax] hive_server_host=192.168.0.229 hive_server_port=10000 hive_metastore_host=192.168.0.229 hive_metastore_port=9083
Команда запуска контейнера:
docker run -d \ --name hue \ --restart unless-stopped \ --network host \ -v /opt/hue-conf/hue.ini:/usr/share/hue/desktop/conf/hue.ini \ gethue/hue:4.10.0
Грабли, на которые можно наступить
1. Сборка из исходников требует Python 2.7
Симптом: Error: must have python development packages for python2.7
Причина: Hue 4.11 всё ещё использует старый build-процесс.
Решение: Использовать Docker-образ.
2. CSRF error с reverse proxy
Симптом: CSRF error. Sorry, your session is invalid or has expired.
Причина: CSRF-токен привязан к протоколу (HTTPS), а Hue видит HTTP.
Решение: Откат на версию 4.10.0, которая менее строга к проверке.
3. Database is locked (SQLite)
Симптом: Белый экран, ошибка «database is locked» в логах.
Причина: SQLite не поддерживает конкурентный доступ.
Решение: Перейти на PostgreSQL + --network host.
4. Белый экран после onboarding
Симптом: JavaScript-ошибки Tether Error, Shepherd step not found.
Причина: Onboarding-тур ломает интерфейс из-за race condition.
Решение: Отключить тур через Django shell.
5. WebHDFS 403 Forbidden
Симптом: User: hue is not allowed to impersonate admin
Причина: HDFS не разрешает proxy-пользователю выполнять операции от чужого имени.
Решение: Настроить hadoop.proxyuser.hue.* в core-site.xml.
Итоговая архитектура
Компонент | Хост | Порт | Назначение |
Budget Parser | CT 301, 192.168.0.150 | — | Telegram-бот |
PostgreSQL (source) | CT 302, 192.168.0.151 | 5432 | Источник данных |
Kafka | CT 303, 192.168.0.153 | 9092 | Брокер сообщений |
Debezium | CT 304, 192.168.0.154 | 8083 | CDC-коннектор |
Hue | CT 305, 192.168.0.155 | 8888 | Веб-интерфейс |
Kafka UI | CT 306, 192.168.0.160 | 8080 | Мониторинг Kafka |
HDFS + Hive | VM 400, 192.168.0.229 | 9000, 10000 | Хранилище |
Что дальше
Hue работает, можно просматривать HDFS и выполнять SQL-запросы к Hive через веб-интерфейс.
Следующий этап — написать Consumer, который будет читать CDC-события из Kafka и складывать в HDFS. Тогда цепочка замкнётся: скриншот → PostgreSQL → Kafka → HDFS → Hive → SQL-запросы через Hue.
# | Статья | Статус |
1 | ✅ | |
2 | ✅ | |
3 | ✅ | |
4 | ✅ | |
5 | Hue: веб-интерфейс | ✅ Эта статья |
6 | Consumer: Kafka → HDFS | ⏳ Следующая |
Ссылки
Вопросы — в комментарии. Если у вас получилось настроить Hue проще или вы нашли другие грабли — расскажите, интересно сравнить опыт.
