Superset 在 CDH/Kerberos (Cloudera CMP 7.3(或类 CDP 的 CMP 7.13 平台,如华为鲲鹏 ARM 版))环境下的完整 Dockerfile 代码配置示例

Apache Superset 在 CDH + Kerberos 环境下 的完整 Dockerfile 及配套配置示例,适用于连接启用了 Kerberos 认证的 Hive(HiveServer2Impala。该方案已在多个生产环境(包括 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),其他配置完全一致。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐