文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
Apache Superset™ 是一个开源的现代数据探索和可视化平台。对于许多团队来说,Superset 可以取代或增强专有的商业智能工具。Superset 可以与各种数据源很好地集成。
架构
Architecture
本页面旨在帮助新任管理员理解 Superset 的组成要素。
组件
一套 Superset 安装由以下组件构成:
- Superset 应用本身
- 元数据数据库
- 缓存层(可选,但某些功能必需)
- Worker & beat(可选,但某些功能必需)
可选组件及其关联功能
上述可选组件是启用以下功能所必需的:
如果使用 Kubernetes 或 Docker Compose 安装,上述所有组件都会被创建。
然而,通过 PyPI 安装仅会创建应用本身。通过 PyPI 安装的用户,如需启用上述功能,需自行配置缓存层、worker 和 beat。PyPI 安装中这些组件的配置不在本文档当前覆盖范围内。
以下是各组件的进一步详情。
Superset 应用
这是核心应用。Superset 的运作流程如下:
- 用户访问图表或仪表板
- 该操作触发向保存底层数据集的数据仓库发送 SQL 查询
- 结果数据以数据可视化形式呈现
- Superset 应用由 Python(Flask)后端应用(服务器)、API 层和通过 Webpack 构建的 React 前端,以及应用运行所需的静态资产组成
元数据数据库
此处存储图表和仪表板定义、用户信息、日志等。Superset 已测试可与 PostgreSQL 和 MySQL 数据库作为元数据数据库协同工作(请勿与数据源混淆,后者可以是如 Snowflake、Redshift 等更多种类的选项)。
一些安装方式(如我们的 Quickstart 和 PyPI)默认配置为使用 SQLite 本地数据库。在 Docker Compose 安装中,数据将存储在 PostgreSQL 容器卷中。这两种情况均不推荐用于生产环境的 Superset 实例。
对于生产环境,建议使用经过适当配置的独立托管数据库。无论使用何种数据库,都应定期备份。
缓存层
缓存层主要发挥两个作用:
- 存储对数据仓库的查询结果,使得图表第二次加载时从缓存中读取,加快应用速度并减轻数据仓库负载。
- 充当 worker 的消息代理,启用警报与报表、异步查询和缩略图缓存功能。
大多数人使用 Redis 作为缓存,但 Superset 也支持其他选项。详见 缓存文档。
Worker 和 Beat
指一个或多个执行任务的 worker,如运行异步查询、生成报表快照并发送邮件,以及一个“beat”,充当调度器并告知 worker 何时执行任务。大多数安装使用 Celery 作为这些组件。
其他组件
其他组件也可以集成到 Superset 中。了解额外配置的最佳位置是 配置页面。例如,可以设置负载均衡器或反向代理,在 Superset 应用前实现 HTTPS,或指定 Mapbox URL 以启用地理空间图表等。
若未建立某些配置设置,Superset 甚至无法启动,因此务必查阅该页面。
安装方式
应该如何安装 Superset?以下是对不同选项的比较。如果您先阅读了架构页面以了解 Superset 的各个组件,会有所帮助。
根本的权衡在于,您是需要自己处理更多细节工作,还是使用更复杂的部署路线来处理这些细节。
Docker Compose
摘要: 利用容器化,同时比 Kubernetes 更简单。这是试用 Superset 的最佳方式;也适用于开发并为 Superset 做出贡献。
如果您不仅仅是演示软件,则需要对 Docker 有中等程度的了解,以自定义部署并避免一些风险。即使经过全面优化,在大规模生产部署方面,这种方法也不如 Kubernetes 稳健。
您需要管理一个 superset-config.py
文件和一个 docker-compose.yml
文件。Docker Compose 会启动所有必要的服务——Superset 应用程序、Postgres 元数据数据库、Redis 缓存、Celery worker 和 beat。它们会自动相互连接。
责任
您需要备份元数据数据库。这可能意味着备份作为 Docker 容器运行的服务及其卷;理想情况下,您应在该容器之外将 Postgres 作为服务运行,并备份该服务。
您还需要扩展 Superset Docker 镜像。默认的 lean
镜像不包含访问元数据数据库(Postgres 或 MySQL)所需的驱动程序,也不包含访问数据仓库所需的驱动程序,以及警报和报告所需的无头浏览器。在演示 Superset 时,您可以运行 -dev
镜像,其中包含部分这些内容,但仍需为数据仓库安装驱动程序。-dev
镜像以 root 身份运行,不建议用于生产环境。
理想情况下,您将构建自己的 Superset 镜像,该镜像扩展自 lean
,并添加部署所需的内容。请参阅构建您自己的生产 Docker 镜像。
Kubernetes (K8s)
摘要: 这是部署生产 Superset 实例的最佳实践方式,但技能要求最高——需要懂 Kubernetes 的人。
您将 Superset 部署到 K8s 集群中。最常见的方法是使用社区维护的 Helm chart,尽管目前正在实施 SIP-149 - Superset 的 Kubernetes Operator。
K8s 部署可以根据使用情况扩展和缩减,并可以零停机部署滚动更新——这些是大型部署所欣赏的功能。
责任
您需要构建自己的 Docker 镜像,并备份元数据数据库,如上所述。您还需要自定义 Helm chart 值,并部署和维护 Kubernetes 集群。
PyPI (Python)
摘要: 这是唯一不需要容器知识的方法。它需要最多的手动工作来部署、连接和维护每个组件。
您将 Superset 作为 Python 包安装并以这种方式运行,提供自己的元数据数据库。Superset 有关于如何以这种方式安装的文档,但更新不频繁。
如果需要缓存,您将设置 Redis 或 RabbitMQ。如果需要警报和报告,您将设置 Celery。
责任
您需要启动组件服务并使其相互通信。您需要安排备份元数据数据库。
升级时,您需要管理系统环境和包,并确保所有组件具有功能依赖项。
升级 Superset
Docker Compose
首先,务必关闭正在运行的 Docker Compose 容器:
docker compose down
接着,通过 git 更新与 superset
仓库同步的文件夹:
git pull origin master
然后,重新启动容器,任何已变更的 Docker 镜像将自动拉取:
docker compose up
手动更新 Superset
要在原生安装中升级 Superset,请运行以下命令:
pip install apache_superset --upgrade
升级元数据数据库
通过运行以下命令迁移元数据数据库:
superset db upgrade
superset init
升级 Superset 不应删除您的图表和仪表板,但我们建议遵循最佳实践,并在升级前备份元数据数据库。在升级生产环境之前,我们建议在测试环境中先进行升级,并最终在非高峰时段完成生产环境的升级。
Docker 构建、镜像与标签
Apache Superset 社区在开发、发布和生产化 Superset 时广泛使用 Docker。本页详细介绍我们的 Docker 构建和标签命名方案,帮助用户了解我们的镜像。
镜像通过 GitHub Actions 构建并推送到 Superset Docker Hub 仓库。不同镜像在不同时间点构建和/或发布:
- 已发布版本 (
release
):使用如5.0.0
和latest
标签发布。 - Pull Request 迭代 (
pull_request
):针对每个 Pull Request,我们主动构建 Docker 以验证构建,但出于安全原因不会发布这些镜像,仅执行docker build --load
。 - 合并到主分支 (
push
):生成新的 SHA,标签前缀为master
,表示最新的master
版本。
构建预设
我们提供一组构建“预设”,每个预设代表一组构建参数组合,主要指向不同的构建目标层和/或基础镜像。
以下是可通过 supersetbot docker
工具使用的构建预设:
lean
:默认 Docker 镜像,包含前端和后端。未指定构建预设的标签均为 lean 构建(如:latest
、5.0.0
、4.1.2
等)。lean 构建不包含数据库驱动,意味着您需要自行安装。这适用于分析数据库 和元数据数据库。您可能需要根据所选元数据数据库,额外安装mysqlclient
或psycopg2-binary
,以及连接到分析数据库所需的其他驱动。dev
:用于开发,包含无头浏览器、开发相关工具和 root 权限。此预设包含一些常用数据库驱动,如mysqlclient
、psycopg2-binary
以及其他用于开发/CI 的驱动。py311
,例如 Py311:与 lean 类似,但使用不同的 Python 版本(此例中为 3.11)。ci
:用于特定 CI 工作负载。websocket
:用于支持高级功能的 Superset 集群。dockerize
:由 Helm 在 initContainers 中使用,用于等待数据库依赖可用。
关键标签示例
latest
:最新的官方发布构建latest-dev
:最新官方发布构建的-dev
镜像,包含无头浏览器和 root 权限。master
:来自master
分支的最新构建,隐式为 lean 构建预设master-dev
:与master
类似,但包含无头浏览器和 root 权限。pr-5252
:PR 5252 中的最新提交。30948dc401b40982cb7c0dbf6ebbe443b2748c1b-dev
:针对此特定 SHA 的构建,可能来自master
合并或发布。websocket-latest
:用于 Superset 集群的 WebSocket 镜像。
如需了解构建矩阵和标签约定的洞察或修改,请查看 supersetbot docker 子命令和 docker.yml GitHub 工作流。
构建您自己的生产 Docker 镜像
每个 Superset 部署将需要根据其数据仓库等安装不同的驱动,因此我们建议用户通过扩展 lean
镜像来构建自己的 Docker 镜像。
以下是一个示例 Dockerfile。请根据内联注释自定义所需的 Superset 版本和数据库驱动。注释还指出需要在配置文件中启用某个功能标志。
您可以使用 docker build -t mysuperset:latest .
或 docker build -t ourcompanysuperset:5.0.0 .
构建镜像。
# 将其更改为 apache/superset:5.0.0 或您想要构建的任何版本;
# 否则默认为 GitHub master 分支的最新提交
FROM apache/superset:master
USER root
# 为 Playwright 设置环境变量
ENV PLAYWRIGHT_BROWSERS_PATH=/usr/local/share/playwright-browsers
# 使用 uv 将包安装到虚拟环境中
# Superset 在 4.1 分支之后开始使用 uv;如果您从 apache/superset:4.1.x 或更早版本构建,
# 请将前两行替换为 RUN pip install \
RUN . /app/.venv/bin/activate && \
uv pip install \
# 安装 psycopg2 以使用 PostgreSQL 元数据存储 - 如果使用 MySQL 后端,则可能是 MySQL 包:
psycopg2-binary \
# 添加您的数据仓库的驱动,在此示例中我们展示 Microsoft SQL Server:
pymssql \
# 使用单点登录身份验证所需的包:
Authlib \
# openpyxl 用于上传 Excel 文件
openpyxl \
# Pillow 用于告警和报告以生成仪表板的 PDF
Pillow \
# 安装 Playwright 用于告警和报告的截图。假设功能标志 PLAYWRIGHT_REPORTS_AND_THUMBNAILS 已启用
# 该功能标志将在 6.0.0 起默认为 True
# Playwright 仅支持 Chrome。
# 如果您仍在使用 Selenium 而非 Playwright,则应在此处安装 selenium 包和无头浏览器及 webdriver
playwright \
&& playwright install-deps \
&& PLAYWRIGHT_BROWSERS_PATH=/usr/local/share/playwright-browsers playwright install chromium
# 切换回 superset 用户
USER superset
CMD ["/app/docker/entrypoints/run-server.sh"]
Dockerfile 中的关键 ARG
BUILD_TRANSLATIONS
:是否将翻译构建到镜像中。对于前端构建,这告诉 webpack 从moment-timezone
库中剥离除en
以外的所有语言环境。对于后端,这会跳过编译*.po
翻译文件DEV_MODE
:是否跳过前端构建,这由我们的docker-compose
开发设置使用
我们在其中挂载本地卷并使用webpack
的--watch
模式进行构建,这意味着当您更改本地文件系统中的代码时,docker 镜像中的 webpack 将持续重建前端。此 ARG 使初始docker-compose
构建花费更少的时间和资源INCLUDE_CHROMIUM
:是否在后台构建中包含 chromium,以便将其用作与“告警和报告”以及缩略图生成相关的工作负载的无头浏览器INCLUDE_FIREFOX
:同上,但针对 firefoxPY_VER
:指定 Python 后端的基础镜像,如果您不处理向前或向后兼容性问题,我们不建议更改此设置
缓存
为加快构建速度,我们遵循 Docker 最佳实践并使用 apache/superset-cache
。
关于数据库驱动
我们的 Docker 镜像几乎不提供数据库驱动支持,因为
每个环境需要不同的驱动,维护一个具有广泛数据库支持的构建将既具有挑战性(数十种数据库、Python 驱动和操作系统依赖项)又效率低下(构建时间更长、镜像更大、层缓存命中率更低…)。
对于生产用例,我们建议您从我们的 lean
镜像派生并添加所需数据库的支持。
支持不同平台(即 arm64 和 amd64)
目前所有自动构建均为多平台,支持 linux/arm64
和 linux/amd64
。这使得 helm
和 docker compose
等更高级别的构造可以指向这些镜像并有效实现多平台。
Pull Request 和 master 构建是每平台一个镜像,以便可以并行化,这些构建的构建矩阵更为稀疏,因为我们无需在每个平台上构建每个构建预设,通常可以更具选择性。
对于这些构建,我们在适用的情况下使用 -arm
后缀。
使用 Apple 芯片
Apple 当前一代计算机使用基于 ARM 的 CPU,而 MAC 上的 Docker 似乎需要 linux/arm64/v8
(至少一位用户的 M2 配置为此方式)。将环境变量 DOCKER_DEFAULT_PLATFORM
设置为 linux/amd64
似乎可以发挥作用,并在此基础上利用 Superset 提供的构建。
export DOCKER_DEFAULT_PLATFORM=linux/amd64
推测 linux/arm64/v8
将更适合这一代芯片,但在 ARM 生态系统中的兼容性较低。
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。