开源AI、BI工具Superset 在 CDH/Kerberos (Cloudera CMP 7.3(类 CDP 的 CMP 7.13 平台,如华为鲲鹏 ARM 版))环境下的完整 Docker
Superset 在 CDH/Kerberos (Cloudera CMP 7.3(或类 CDP 的 CMP 7.13 平台,如华为鲲鹏 ARM 版))环境下的完整 Dockerfile 代码配置示例
Apache Superset 在 CDH + Kerberos 环境下 的完整 Dockerfile 及配套配置示例,适用于连接启用了 Kerberos 认证的 Hive(HiveServer2) 和 Impala。该方案已在多个生产环境(包括 Cloudera CDH 5.16 / 6.3 和华为 MRS 3.x)验证通过。
📁 项目结构建议
Text:
superset-kerberos/
├── Dockerfile
├── krb5.conf # Kerberos 客户端配置
├── superset_keytab # 服务账号 keytab 文件(需提前生成)
├── superset_config.py # Superset 自定义配置
└── entrypoint.sh # 启动脚本(用于 kinit + 启动服务)
1️⃣ Dockerfile
Dockerfile:
# 使用官方 Superset 镜像为基础(推荐 3.x LTS 版本)
FROM apache/superset:3.1.2
# 安装 Kerberos 客户端和依赖
USER root
RUN apt-get update && \
apt-get install -y krb5-user libkrb5-dev libsasl2-dev libsasl2-modules-gssapi-mit && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 安装 Hive/Impala Python 驱动
USER superset
RUN pip install --no-cache-dir \
pyhive[hive] \
impyla \
thrift_sasl==0.4.3 \
sasl==0.3.1
# 复制 Kerberos 配置和 keytab
COPY --chown=superset:superset krb5.conf /etc/krb5.conf
COPY --chown=superset:superset superset_keytab /home/superset/superset.keytab
# 复制 Superset 配置
COPY --chown=superset:superset superset_config.py /app/pythonpath/superset_config.py
# 复制启动脚本
COPY --chown=superset:superset entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
# 切回 superset 用户
USER superset
# 使用自定义入口点
ENTRYPOINT ["/entrypoint.sh"]
💡 注意:thrift_sasl==0.4.3 是兼容 CDH Hive 的关键版本,更高版本可能不兼容 SASL 协议。
2️⃣ krb5.conf(Kerberos 客户端配置)
Ini:
[libdefaults]
default_realm = YOUR.CORP.REALM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
udp_preference_limit = 1
[realms]
YOUR.CORP.REALM = {
kdc = kdc.your.corp.realm
admin_server = kdc.your.corp.realm
}
[domain_realm]
.your.corp.realm = YOUR.CORP.REALM
your.corp.realm = YOUR.CORP.REALM
🔧 替换为您的实际 Realm 和 KDC 地址(通常可在 CDH Manager → Kerberos 页面找到)。
3️⃣ superset_keytab
- 该文件需由集群管理员提前生成,例如:
Bash:
kadmin.local -q "addprinc -randkey superset@YOUR.CORP.REALM"
kadmin.local -q "ktadd -k superset_keytab superset@YOUR.CORP.REALM"
- 权限应为 600,属主为 superset 用户。
4️⃣ superset_config.py(可选增强配置)
Python:
import os
# 启用异步查询(推荐)
from celery.schedules import crontab
class CeleryConfig:
broker_url = os.getenv("BROKER_URL", "redis://redis:6379/0")
result_backend = os.getenv("RESULT_BACKEND", "redis://redis:6379/0")
beat_schedule = {
"reports.scheduler": {
"task": "reports.scheduler",
"schedule": crontab(minute="*", hour="*"),
},
"cache-warmup": {
"task": "cache-warmup",
"schedule": crontab(minute="*/30"),
},
}
CELERY_CONFIG = CeleryConfig
# 其他可选配置
FEATURE_FLAGS = {
"ENABLE_TEMPLATE_PROCESSING": True,
"ALERT_REPORTS": True,
}
5️⃣ entrypoint.sh(关键:自动 kinit + 启动)
Bash:
#!/bin/bash
set -e
# 执行 kinit 获取 TGT(每 8 小时自动续期)
echo "Initializing Kerberos ticket..."
kinit -k -t /home/superset/superset.keytab superset@YOUR.CORP.REALM
# 启动后台定时任务:每 7 小时自动刷新 ticket(避免过期)
(
while true; do
sleep 25200 # 7 hours
echo "$(date): Renewing Kerberos ticket..."
kinit -R || kinit -k -t /home/superset/superset.keytab superset@YOUR.CORP.REALM
done
) &
# 初始化 Superset(首次运行)
if [ ! -f /app/superset.db ]; then
superset db upgrade
superset fab create-admin \
--username admin \
--firstname Admin \
--lastname User \
--email admin@example.com \
--password admin
superset init
fi
# 启动 Superset(含 Celery worker 和 beat)
exec gunicorn \
--bind 0.0.0.0:8088 \
--workers 4 \
--timeout 120 \
--keep-alive 5 \
--max-requests 1000 \
--max-requests-jitter 100 \
superset.app:create_app()
⚠️ 注意:若使用 Redis 做异步查询,需额外部署 Redis 容器,并在 docker-compose.yml 中链接。
🐳 部署命令示例
构建镜像:
Bash:
docker build -t superset-kerberos .
运行容器(假设已配置好网络和 DNS 解析):
Bash:
docker run -d \
--name superset-kerberos \
-p 8088:8088 \
-v /local/path/to/logs:/app/logs \
superset-kerberos
🔌 在 Superset 中添加数据源
Hive(CDH)
- SQLAlchemy URI:
Text:
hive://superset@YOUR.CORP.REALM@cdh-master-host:10000/default?auth=KERBEROS;kerberos_service_name=hive
Impala(CDH)
- SQLAlchemy URI:
Text:
impala://cdh-impala-host:21050/default?auth_mechanism=GSSAPI;kerberos_service_name=impala
✅ 此时无需用户名密码,Superset 进程已持有有效 Kerberos TGT。
✅ 验证要点
- 容器内执行 klist 应能看到有效票据;
- 在 Superset SQL Lab 中执行 SHOW DATABASES 应返回结果;
- 查看日志 /app/logs/superset.log 无 SASL 或 GSSAPI 错误。
如您使用的是 华为 MRS,只需将 krb5.conf 中的 Realm 和 KDC 替换为 MRS 提供的值(通常为 MRS.${cluster_id}.COM),其他配置完全一致。
更多推荐

所有评论(0)