Пятая статья цикла о построении CDC-пайплайна с нуля. HDFS и Hive работают, но управлять ими через консоль неудобно. Сегодня поднимаем веб-интерфейс Hue и разбираемся, почему в 2026 году сборка из исходников требует Python 2.7.


Зачем я это пишу

Честно: в первую очередь это мои заметки. На работе я поддерживаю CDC-пайплайны, но там веб-интерфейсы уже настроены. Хочу понять, как это делается с нуля и какие подводные камни ждут.

Во вторую очередь — портфолио. Борьба с CSRF заняла несколько часов, и без возможности гуглить и экспериментировать я бы не справился. В закрытой рабочей среде такие проблемы решать сложнее.

И в третью — мотивация не бросить. Пайплайн почти готов, осталось сделать его удобным.


Что уже есть

В предыдущих статьях я поднял:

  1. Budget Parser — Telegram-бот для парсинга банковских скриншотов

  2. PostgreSQL с logical replication — источник данных для CDC

  3. Kafka + Debezium — захват изменений в реальном времени

  4. 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
Ошибки Tether и Shepherd
Ошибки 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!

Hive Editor с автодополнением
Hive Editor с автодополнением

Грабля #4: WebHDFS 403 Forbidden

Hive Editor работает, но File Browser показывает ошибку:

WebHDFS отклоняет запросы
WebHDFS отклоняет запросы
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.

File Browser показывает структуру HDFS
File Browser показывает структуру 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

Budget Parser: Telegram + Claude Vision

2

PostgreSQL для CDC

3

Kafka + Debezium

4

HDFS + Hive

5

Hue: веб-интерфейс

✅ Эта статья

6

Consumer: Kafka → HDFS

⏳ Следующая


Ссылки


Вопросы — в комментарии. Если у вас получилось настроить Hue проще или вы нашли другие грабли — расскажите, интересно сравнить опыт.