Superset 在 CDH/Kerberos (Cloudera CMP 7.3(类 CDP 的 CMP 7.13 平台,如华为鲲鹏 ARM 版))docker-compose.yml 示例 与 Redis/Celery 集成方案

完整的 docker-compose.yml 示例,包含 Apache Superset + Redis(作为 Celery Broker/Result Backend)+ 自动 Kerberos 认证支持,适用于 CDH 或华为 MRS 环境下连接 Hive/Impala 的生产级部署。


📁 推荐项目结构

Text:

superset-cdh-kerberos/

├── docker-compose.yml

├── superset/

│   ├── Dockerfile

│   ├── krb5.conf

│   ├── superset.keytab          # 由集群管理员生成

│   ├── superset_config.py

│   └── entrypoint.sh

└── .env                         # 环境变量(可选)


✅ docker-compose.yml

Yaml:

version: '3.8'

services:

  redis:

    image: redis:7-alpine

    container_name: superset-redis

    restart: unless-stopped

    networks:

      - superset-net

  superset:

    build:

      context: ./superset

      dockerfile: Dockerfile

    container_name: superset-app

    restart: unless-stopped

    ports:

      - "8088:8088"

    environment:

      - BROKER_URL=redis://redis:6379/0

      - RESULT_BACKEND=redis://redis:6379/0

      - SUPERSET_SECRET_KEY=your_strong_secret_key_here_2025!

    volumes:

      - superset_home:/app/superset

      - ./superset/logs:/app/logs

    depends_on:

      - redis

    networks:

      - superset-net

  superset-worker:

    build:

      context: ./superset

      dockerfile: Dockerfile

    container_name: superset-worker

    restart: unless-stopped

    command: celery --app=superset.tasks.celery_app:celery worker --pool=prefork -O fair -l INFO

    environment:

      - BROKER_URL=redis://redis:6379/0

      - RESULT_BACKEND=redis://redis:6379/0

    volumes:

      - superset_home:/app/superset

      - ./superset/logs:/app/logs

    depends_on:

      - redis

    networks:

      - superset-net

  superset-beat:

    build:

      context: ./superset

      dockerfile: Dockerfile

    container_name: superset-beat

    restart: unless-stopped

    command: celery --app=superset.tasks.celery_app:celery beat --max-interval 10 -l INFO

    environment:

      - BROKER_URL=redis://redis:6379/0

      - RESULT_BACKEND=redis://redis:6379/0

    volumes:

      - superset_home:/app/superset

      - ./superset/logs:/app/logs

    depends_on:

      - redis

    networks:

      - superset-net

volumes:

  superset_home:

networks:

  superset-net:

    driver: bridge

💡 说明

  • superset:主 Web 应用(Gunicorn)
  • superset-worker:执行异步查询、邮件发送、缓存预热等后台任务
  • superset-beat:定时调度器(用于定期刷新缓存、发送报表等)
  • 所有服务共享同一个镜像,确保依赖一致

🔧 补充:superset_config.py(增强 Celery 配置)

在 ./superset/superset_config.py 中添加:

Python:

import os

from celery.schedules import crontab

# 启用异步查询和告警

FEATURE_FLAGS = {

    "ALERT_REPORTS": True,

    "ENABLE_TEMPLATE_PROCESSING": True,

    "DYNAMIC_PLUGINS": False,

}

# Celery 配置

class CeleryConfig:

    broker_url = os.getenv("BROKER_URL", "redis://redis:6379/0")

    result_backend = os.getenv("RESULT_BACKEND", "redis://redis:6379/0")

    accept_content = ["json"]

    task_serializer = "json"

    result_serializer = "json"

    worker_prefetch_multiplier = 1

    task_acks_late = True

    beat_schedule = {

        # 每5分钟检查一次待发送的报表

        "reports.scheduler": {

            "task": "reports.scheduler",

            "schedule": crontab(minute="*/5"),

        },

        # 每小时预热常用图表缓存

        "cache-warmup": {

            "task": "cache-warmup",

            "schedule": crontab(minute=0, hour="*"),

            "kwargs": {"strategy_name": "top_views"},

        },

    }

CELERY_CONFIG = CeleryConfig

# 安全密钥(建议通过环境变量传入)

SECRET_KEY = os.getenv("SUPERSET_SECRET_KEY", "this-is-insecure-change-it")

# 可选:设置 SQL Lab 查询超时(秒)

SQLLAB_ASYNC_TIME_LIMIT_SEC = 3600


🛠️ 构建与启动

1. 准备文件

  • 确保 ./superset/superset.keytab 和 krb5.conf 已就位;
  • 修改 krb5.conf 中的 Realm 和 KDC 地址;
  • 设置强密码 SUPERSET_SECRET_KEY(至少 32 位随机字符串);

2. 构建并启动

Bash:

# 构建镜像

docker-compose build

# 启动服务

docker-compose up -d

# 查看日志

docker-compose logs -f superset

3. 首次初始化(可选)

如果未在 entrypoint.sh 中自动初始化,可手动执行:

Bash:

docker exec -it superset-app superset fab create-admin

docker exec -it superset-app superset init


🔌 连接 Hive/Impala(Kerberos 方式)

在 Superset Web UI 中添加数据源:

Hive (CDH / MRS)

Text:

hive://superset@YOUR.REALM@hive-server-host:10000/default?auth=KERBEROS;kerberos_service_name=hive

Impala (CDH / MRS)

Text:

impala://impala-host:21050/default?auth_mechanism=GSSAPI;kerberos_service_name=impala

✅ 此时无需用户名密码,Superset 进程已通过 keytab 自动获取 TGT。


📊 异步查询验证

  • 进入 SQL Lab
  • 选择 Hive/Impala 数据库;
  • 勾选 “Run as asynchronous query”
  • 执行长查询 → 应显示“Query submitted”并进入后台执行;
  • 查看 superset-worker 日志确认任务被消费。

🔄 自动续期 Kerberos Ticket(已在 entrypoint.sh 实现)

Bash:

# 在 entrypoint.sh 中加入后台循环

(

  while true; do

    sleep 25200  # 7 小时

    kinit -R || kinit -k -t /home/superset/superset.keytab superset@YOUR.REALM

  done

) &

⚠️ 注意:TGT 默认有效期通常为 10 小时,renewable 为 7 天。每 7 小时续期一次可确保长期运行不中断。


适用场景

  • CDH 5.16 / 6.x / CDP
  • 华为云 MRS 3.x(启用了 Kerberos + Hive/Impala)
  • 政务、金融、电信等高安全要求场景

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐