文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
Apache Superset™ 是一个开源的现代数据探索和可视化平台。对于许多团队来说,Superset 可以取代或增强专有的商业智能工具。Superset 可以与各种数据源很好地集成。
在 Kubernetes 上安装
在 Kubernetes 上运行 Superset 已获支持,可使用官方 Superset helm 仓库 中提供的 Helm chart。
前置条件
- 一个 Kubernetes 集群
- 已安装 Helm
对于更简单的单机环境,我们推荐使用 minikube,它在多种平台上都易于设置,并且与这里引用的 Helm chart 配合得非常好。
运行
- 添加 Superset helm 仓库
helm repo add superset https://apache.github.io/superset
"superset" has been added to your repositories
- 查看仓库中的 chart
helm search repo superset
NAME CHART VERSION APP VERSION DESCRIPTION
superset/superset 0.1.1 1.0 Apache Superset is a modern, enterprise-ready b...
- 配置您的设置覆盖
就像任何典型的 Helm chart 一样,您需要编写一个 values.yaml
文件,该文件将定义/覆盖默认 values.yaml 中公开的任何值,或其依赖 chart 中的值:
下文将提供有关您可能需要的一些重要覆盖的更多信息。
- 安装并运行
helm upgrade --install --values my-values.yaml superset superset/superset
您应该会看到各种 pod 启动,例如:
kubectl get pods
NAME READY STATUS RESTARTS AGE
superset-celerybeat-7cdcc9575f-k6xmc 1/1 Running 0 119s
superset-f5c9c667-dw9lp 1/1 Running 0 4m7s
superset-f5c9c667-fk8bk 1/1 Running 0 4m11s
superset-init-db-zlm9z 0/1 Completed 0 111s
superset-postgresql-0 1/1 Running 0 6d20h
superset-redis-master-0 1/1 Running 0 6d20h
superset-worker-75b48bbcc-jmmjr 1/1 Running 0 4m8s
superset-worker-75b48bbcc-qrq49 1/1 Running 0 4m12s
确切的列表将取决于您的特定配置覆盖,但您通常应该预期:
- N 个
superset-xxxx-yyyy
和superset-worker-xxxx-yyyy
pod(取决于您的supersetNode.replicaCount
和supersetWorker.replicaCount
值) - 1 个
superset-postgresql-0
(取决于您的 postgres 设置) - 1 个
superset-redis-master-0
(取决于您的 redis 设置) - 1 个
superset-celerybeat-xxxx-yyyy
pod(如果您在值覆盖中设置了supersetCeleryBeat.enabled = true
)
- 访问它
该 chart 将发布适当的服务以在您的 k8s 集群内部公开 Superset UI。要在外部访问它,您必须:
- 将 Service 配置为
LoadBalancer
或NodePort
- 为其设置一个
Ingress
- chart 包含一个定义,但需要根据您的需求进行调整(主机名、tls、注释等…) - 运行
kubectl port-forward superset-xxxx-yyyy :8088
以直接将一个 pod 的端口隧道到您的本地主机
根据您配置外部访问的方式,URL 会有所不同。一旦您确定了适当的 URL,您可以使用以下凭据登录:
- 用户名:
admin
- 密码:
admin
重要设置
安全设置
包含默认安全设置和密码,但您 必须 更新它们以运行 prod
实例,特别是:
postgresql:
postgresqlPassword: superset
确保为您设置了一个唯一且强的复杂字母数字字符串作为 SECRET_KEY,并使用工具帮助您生成一个足够随机的序列。
- 要生成一个好的密钥,您可以运行
openssl rand -base64 42
configOverrides:
secret: |
SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'
如果您想更改之前的密钥,那么您应该轮换密钥。
Kubernetes 部署的默认密钥为 thisISaSECRET_1234
configOverrides:
my_override: |
PREVIOUS_SECRET_KEY = 'YOUR_PREVIOUS_SECRET_KEY'
SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'
init:
command:
- /bin/sh
- -c
- |
. {{ .Values.configMountPath }}/superset_bootstrap.sh
superset re-encrypt-secrets
. {{ .Values.configMountPath }}/superset_init.sh
Superset 使用 Scarf Gateway 收集遥测数据。了解不同 Superset 版本的安装计数有助于项目决定修补和长期支持。Scarf 会清除个人身份信息 (PII) 并仅提供聚合统计。
要在基于 Helm 的安装中选择退出此数据收集,请编辑您的 helm/superset/values.yaml
文件中的 repository:
行,将 apachesuperset.docker.scarf.sh/apache/superset
替换为 apache/superset
以直接从 Docker Hub 拉取镜像。
依赖项
在引导脚本中安装附加包并执行任何其他引导配置。
对于生产集群,建议在 CI 中构建自己的镜像并完成此步骤。
Superset 需要为每个您想要连接的数据存储安装一个 Python DB-API 数据库驱动程序和一个 SQLAlchemy 方言。
有关更多信息,请参阅安装数据库驱动程序。
建议您参考 pyproject.toml 中列出的版本,而不是在引导脚本中硬编码它们,如下所示。
以下示例安装 BigQuery 和 Elasticsearch 的驱动程序,允许您在 Superset 设置中连接到这些数据源:
bootstrapScript: |
#!/bin/bash
uv pip install .[postgres] \
.[bigquery] \
.[elasticsearch] &&\
if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi
superset_config.py
默认的 superset_config.py
非常简洁,您很可能需要扩展它。这可以通过在 configOverrides
中指定一个或多个键/值条目来完成,例如:
configOverrides:
my_override: |
# 这将确保即使使用 SSL 卸载也能正确计算 redirect_uri
ENABLE_PROXY_FIX = True
FEATURE_FLAGS = {
"DYNAMIC_PLUGINS": True
}
这些将作为 Helm 模板进行求值,因此将能够引用其他 values.yaml
变量,例如 {{ .Values.ingress.hosts[0] }}
将解析为您的 ingress 外部域。
整个 superset_config.py
将作为密钥安装,因此直接传递敏感参数是安全的…但是使用密钥环境变量可能更具可读性。
可以通过运行 helm upgrade --install --values my-values.yaml --set-file configOverrides.oauth=set_oauth.py
来提供完整的 python 文件。
环境变量
这些可以作为键/值通过 extraEnv
传递,如果它们是敏感的,则通过 extraSecretEnv
传递。然后可以从 superset_config.py
中使用例如 os.environ.get("VAR")
引用它们。
extraEnv:
SMTP_HOST: smtp.gmail.com
SMTP_USER: user@gmail.com
SMTP_PORT: "587"
SMTP_MAIL_FROM: user@gmail.com
extraSecretEnv:
SMTP_PASSWORD: xxxx
configOverrides:
smtp: |
import ast
SMTP_HOST = os.getenv("SMTP_HOST","localhost")
SMTP_STARTTLS = ast.literal_eval(os.getenv("SMTP_STARTTLS", "True"))
SMTP_SSL = ast.literal_eval(os.getenv("SMTP_SSL", "False"))
SMTP_USER = os.getenv("SMTP_USER","superset")
SMTP_PORT = os.getenv("SMTP_PORT",25)
SMTP_PASSWORD = os.getenv("SMTP_PASSWORD","superset")
系统包
如果需要新的系统包,可以通过覆盖容器的 command
在应用程序启动前安装它们,例如:
supersetWorker:
command:
- /bin/sh
- -c
- |
apt update
apt install -y somepackage
apt autoremove -yqq --purge
apt clean
# 运行 celery worker
. {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker
数据源
数据源定义可以通过在 extraConfigs
中提供键/值 yaml 定义来自动声明:
extraConfigs:
import_datasources.yaml: |
databases:
- allow_file_upload: true
allow_ctas: true
allow_cvas: true
database_name: example-db
extra: "{\r\n \"metadata_params\": {},\r\n \"engine_params\": {},\r\n \"\
metadata_cache_timeout\": {},\r\n \"schemas_allowed_for_file_upload\": []\r\n\
}"
sqlalchemy_uri: example://example-db.local
tables: []
这些也将作为密钥挂载,并且可以包含敏感参数。
配置示例
设置 OAuth
:::note
OAuth 设置需要安装 authlib Python 库。这可以通过更新 bootstrapScript
使用 pip
来完成。有关更多信息,请参阅依赖项部分。
:::
extraEnv:
AUTH_DOMAIN: example.com
extraSecretEnv:
GOOGLE_KEY: xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
GOOGLE_SECRET: xxxxxxxxxxxxxxxxxxxxxxxx
configOverrides:
enable_oauth: |
# 这将确保即使使用 SSL 卸载也能正确计算 redirect_uri
ENABLE_PROXY_FIX = True
from flask_appbuilder.security.manager import AUTH_OAUTH
AUTH_TYPE = AUTH_OAUTH
OAUTH_PROVIDERS = [
{
"name": "google",
"icon": "fa-google",
"token_key": "access_token",
"remote_app": {
"client_id": os.getenv("GOOGLE_KEY"),
"client_secret": os.getenv("GOOGLE_SECRET"),
"api_base_url": "https://www.googleapis.com/oauth2/v2/",
"client_kwargs": {"scope": "email profile"},
"request_token_url": None,
"access_token_url": "https://accounts.google.com/o/oauth2/token",
"authorize_url": "https://accounts.google.com/o/oauth2/auth",
"authorize_params": {"hd": os.getenv("AUTH_DOMAIN", "")}
},
}
]
# 将 Authlib 角色映射到 superset 角色
AUTH_ROLE_ADMIN = 'Admin'
AUTH_ROLE_PUBLIC = 'Public'
# 将允许用户自我注册,允许从授权用户创建 Flask 用户
AUTH_USER_REGISTRATION = True
# 默认的用户自我注册角色
AUTH_USER_REGISTRATION_ROLE = "Admin"
启用警报和报告
为此,根据警报和报告文档,您将需要:
在 Celery worker 中安装支持的 webdriver
这可以通过使用预安装了 webdriver 的自定义镜像来完成,或通过覆盖 command
在启动时安装。以下是 chromedriver
的工作示例:
supersetWorker:
command:
- /bin/sh
- -c
- |
# 安装 chrome webdriver
# 请参阅 https://github.com/apache/superset/blob/4fa3b6c7185629b87c27fc2c0e5435d458f7b73d/docs/src/pages/docs/installation/email_reports.mdx
apt-get update
apt-get install -y wget
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb
wget https://chromedriver.storage.googleapis.com/88.0.4324.96/chromedriver_linux64.zip
apt-get install -y zip
unzip chromedriver_linux64.zip
chmod +x chromedriver
mv chromedriver /usr/bin
apt-get autoremove -yqq --purge
apt-get clean
rm -f google-chrome-stable_current_amd64.deb chromedriver_linux64.zip
# 运行
. {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker
运行 Celery beat
此 pod 将触发在警报和报告 UI 部分中配置的预定任务:
supersetCeleryBeat:
enabled: true
配置适当的 Celery 作业和 SMTP/Slack 设置
extraEnv:
SMTP_HOST: smtp.gmail.com
SMTP_USER: user@gmail.com
SMTP_PORT: "587"
SMTP_MAIL_FROM: user@gmail.com
extraSecretEnv:
SLACK_API_TOKEN: xoxb-xxxx-yyyy
SMTP_PASSWORD: xxxx-yyyy
configOverrides:
feature_flags: |
import ast
FEATURE_FLAGS = {
"ALERT_REPORTS": True
}
SMTP_HOST = os.getenv("SMTP_HOST","localhost")
SMTP_STARTTLS = ast.literal_eval(os.getenv("SMTP_STARTTLS", "True"))
SMTP_SSL = ast.literal_eval(os.getenv("SMTP_SSL", "False"))
SMTP_USER = os.getenv("SMTP_USER","superset")
SMTP_PORT = os.getenv("SMTP_PORT",25)
SMTP_PASSWORD = os.getenv("SMTP_PASSWORD","superset")
SMTP_MAIL_FROM = os.getenv("SMTP_MAIL_FROM","superset@superset.com")
SLACK_API_TOKEN = os.getenv("SLACK_API_TOKEN",None)
celery_conf: |
from celery.schedules import crontab
class CeleryConfig:
broker_url = f"redis://{env('REDIS_HOST')}:{env('REDIS_PORT')}/0"
imports = (
"superset.sql_lab",
"superset.tasks.cache",
"superset.tasks.scheduler",
)
result_backend = f"redis://{env('REDIS_HOST')}:{env('REDIS_PORT')}/0"
task_annotations = {
"sql_lab.get_sql_results": {
"rate_limit": "100/s",
},
}
beat_schedule = {
"reports.scheduler": {
"task": "reports.scheduler",
"schedule": crontab(minute="*", hour="*"),
},
"reports.prune_log": {
"task": "reports.prune_log",
'schedule': crontab(minute=0, hour=0),
},
'cache-warmup-hourly': {
"task": "cache-warmup",
"schedule": crontab(minute="*/30", hour="*"),
"kwargs": {
"strategy_name": "top_n_dashboards",
"top_n": 10,
"since": "7 days ago",
},
}
}
CELERY_CONFIG = CeleryConfig
reports: |
EMAIL_PAGE_RENDER_WAIT = 60
WEBDRIVER_BASEURL = "http://{{ template "superset.fullname" . }}:{{ .Values.service.port }}/"
WEBDRIVER_BASEURL_USER_FRIENDLY = "https://www.example.com/"
WEBDRIVER_TYPE= "chrome"
WEBDRIVER_OPTION_ARGS = [
"--force-device-scale-factor=2.0",
"--high-dpi-support=2.0",
"--headless",
"--disable-gpu",
"--disable-dev-shm-usage",
# 这是必需的,因为我们的进程以 root 身份运行(为了安装 pip 包)
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-extensions",
]
加载示例数据和仪表板
如果您正在试用 Superset 并希望有一些数据和仪表板可供探索,您可以通过创建 my_values.yaml
并将其部署到上述运行部分的配置您的设置覆盖步骤中所述来加载一些示例。
要加载示例,请将以下内容添加到 my_values.yaml
文件中:
init:
loadExamples: true
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。