跳转到内容

Apache Superset — 开源 BI 平台

是什么

Apache Superset 是一个让你不用写前端、不用买 Tableau,靠浏览器就能拉数据画图做看板的开源 BI 平台。日常类比:你公司里那个”每天导 Excel、做透视表、截图发周报”的同事,被换成一个网页——任何人打开浏览器选数据源、写 SQL 或拖字段,立刻出图表、出看板、能分享。

它由 Airbnb 工程师 Maxime Beauchemin 在 2015 年内部做出来(同一个人也是 airflow 的作者),2016 年开源,2017 年捐给 Apache 基金会孵化,2021 年毕业成顶级项目,目前 GitHub ~63k stars,是开源 BI 里最活跃的项目之一。

为什么重要

不理解 Superset,下面这些事都没法解释:

  • 为什么很多公司开始不再为 Tableau 付每人每年几百美元的 license——Superset 免费 + 开源
  • 为什么数据团队能给业务方一个”自助查询入口”——SQL Lab 让懂 SQL 的人直接在浏览器里查仓库
  • 为什么”50+ 种可视化”听起来夸张但确实需要——不同业务(地理 / 漏斗 / 时序)需要不同图表语言
  • 为什么 Preset.io(Maxime 自己开的公司)能融到 1 亿美元——开源 + 托管是 BI 的新商业模式

核心要点

Superset 的结构可以拆成 四块

  1. 数据源接入:通过 sqlalchemy 抽象,一次接入支持 40+ 种数据库——Postgres / MySQL / BigQuery / Snowflake / Trino / clickhouse / druid / DuckDB 全打通。你只填一个连接串。

  2. SQL Lab(浏览器里的 SQL IDE):左边树形列表浏览数据库表,右边编辑器写 SQL,下面看结果。可以保存查询、把结果一键转成图表。这是 Superset 区别于纯看板工具的杀手锏。

  3. 可视化层:50+ 种图表,底层用 apache-echarts、Plotly、deck.gl 三家渲染。从最普通的折线 / 柱状 / 饼图,到桑基图、地理热力、3D 地图、漏斗、矩阵树图。每种图都是一个独立 React 组件。

  4. 看板(Dashboard):把多个 Chart 拖到一个画布上,加交叉过滤(点一个柱子,其他图同时筛)、加时间范围控件、加权限控制。看板可以导出 JSON,用 git 版本管理。

后端是 Python flask + Celery(异步查询) + Redis(缓存),前端是 React + TypeScript。

实践案例

案例 1:5 分钟跑起来

Terminal window
docker run -d -p 8088:8088 \
-e "SUPERSET_SECRET_KEY=$(openssl rand -hex 32)" \
--name superset apache/superset
docker exec -it superset superset fab create-admin \
--username admin --firstname A --lastname B \
--email a@b.c --password admin
docker exec -it superset superset db upgrade
docker exec -it superset superset init

打开 http://localhost:8088,登录 admin/admin,添加一个 SQLite/Postgres 数据源,到 SQL Lab 写 SELECT * FROM users LIMIT 10,点”Create Chart”——5 分钟从安装到出图。

案例 2:SQL Lab 怎么用

写一句 SQL:

SELECT date_trunc('day', created_at) AS day,
COUNT(*) AS signups
FROM users
WHERE created_at > NOW() - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1;

点 Run,下面立刻出表格。点 “Explore”——Superset 把这个查询结果丢进 Chart Builder,你选 “Time-series Line Chart”,X 轴 day、Y 轴 signups,瞬间出折线图。再点 “Save”,把它扔到一个看板上,配上”过去 7 / 30 / 90 天”切换器,一个新人 onboarding 看板就做好了。

案例 3:Semantic Layer(语义层)

很多业务方不会写 SQL。Superset 让数据工程师预先在 Dataset 上定义”指标”

metric_name: monthly_active_users
expression: COUNT(DISTINCT user_id)
filter: last_seen > NOW() - INTERVAL '30 days'

业务方在 Chart Builder 里就只看到一个下拉项 “Monthly Active Users”,点一下、选维度(按城市 / 渠道分组)、出图。SQL 复杂性被工程师吸收了。这一层叫语义层,是 looker 也在主推的概念。

案例 4:交叉过滤(Cross-Filter)

看板上有四张图:销售额柱状图(按地区)、订单数饼图(按渠道)、退款时序、客单价分布。打开”交叉过滤”开关后,点柱状图里”华东”的柱子——其他三张图同时只显示”华东”的数据。

这种交互对业务方探索数据极重要:“华东退款率为什么高?“——不用每张图都改筛选条件,点一下就联动。技术上,Superset 把过滤事件广播到看板里所有 Chart,每个 Chart 把自己原本的查询拼上一个 WHERE region = '华东',重新拉数据。

案例 5:异步查询(Celery + Redis)

如果一条 SQL 跑 10 分钟(数仓常见),同步等会让浏览器超时。Superset 支持把查询丢给 celery worker 异步跑:

# superset_config.py 关键配置
RESULTS_BACKEND = RedisCache(host='localhost', port=6379, db=1)
class CeleryConfig:
broker_url = 'redis://localhost:6379/0'
imports = ('superset.sql_lab',)

前端轮询查询状态,跑完后从 Redis 拉结果。配上 trino 这种长查询场景,体验完全可用。

踩过的坑

  1. OLTP 数据库直查会卡死:Superset 是个查询前端,不存数据。如果直接连生产 postgresql,业务方一个不带索引的 GROUP BY 就能把数据库压垮。生产部署必须接数仓clickhouse / Snowflake / BigQuery)或加一层只读副本。

  2. 看板加载慢就是查询慢:看板 = N 个图 = N 条 SQL 并发。一个看板 20 张图 = 20 条查询同时打数据库。解决方案:开 Redis 查询缓存(默认关)+ 给数据集加 thumbnail cache + 物化预聚合表。

  3. 权限模型从 Flask-AppBuilder 继承,复杂:Superset 的角色 / 权限来自底层的 Flask-AppBuilder,新人配 RBAC 经常配错——把 “can read on Database” 当成”能看所有表”,其实还要单独给 Schema 级权限。生产部署强烈建议先读官方 RBAC 文档。

  4. 每个 Chart 类型是独立 React 包,升级要小心:Superset 把每种图表(line / bar / sankey)拆成独立 npm 包,升级主版本时某个 chart 的 props 可能不兼容,导致已有看板里的图 “白屏”。回归测试要覆盖。

适用 vs 不适用场景

适用

  • 自建 BI 平台、不想付 Tableau / Looker license 的中小公司
  • 数据团队需要给业务方一个自助 SQL + 看板入口
  • 已经有数仓(clickhouse / Snowflake / BigQuery / Trino),需要前端可视化

不适用

  • 实时监控告警(毫秒级刷新、阈值告警) → 用 grafana,它是为时序监控生的
  • 需要复杂数据建模(cube / 多维 OLAP) → 看 Cube.dev / dbt + 上层
  • 重度自定义可视化(科研级 D3 自由画) → Superset 的 50 种图是”多但定型”,超出就要自己写 plugin
  • 离线分析报告(pdf / 邮件订阅)→ 内置订阅功能弱,要接 Alerts & Reports 模块外加 SMTP

历史小故事(可跳过)

  • 2015:Maxime Beauchemin 在 Airbnb 数据团队,受不了把数据从 Hive 导出 → CSV → Tableau 的循环,自己写了个内部工具叫 “Caravel”。
  • 2016:开源到 GitHub,半年涨 1 万 star。
  • 2017-06:进 Apache 孵化器,改名 “Apache Superset”(避免 Caravel 商标问题)。
  • 2018:Maxime 离开 Airbnb,创立 Preset.io,做托管版 Superset,融资 ~1 亿美元。
  • 2021-01:Apache 顶级项目毕业,治理彻底社区化。

学到什么

  1. BI 平台 = SQL 抽象 + 可视化抽象 + 多用户协作——Superset 用 SQLAlchemy / ECharts / Flask-AppBuilder 三个开源库各负责一块,自己只做”粘合”
  2. 开源 + 托管是新商业模式——Maxime 把 Airflow(送给 ASF 然后开 Astronomer)和 Superset(送给 ASF 然后开 Preset)连续做了两次
  3. “自助 BI” 听着好但需要数据治理——给业务方 SQL 入口的前提是数仓干净 + 权限到位 + 指标统一定义,否则 100 个人写 100 种 DAU 定义
  4. 可视化是个庞大的工程问题——50+ 种图表、跨浏览器、跨数据源、还要交互联动;Superset 的代码量主要在前端 plugin 体系

延伸阅读

  • 官方文档:Apache Superset Documentation
  • 视频导览:Superset in 30 Minutes — Preset.io(搜索 Preset 官方频道)
  • 源码地图:superset/ 是 Python 后端,superset-frontend/ 是 React,superset-frontend/plugins/ 是 50+ 个图表插件
  • airflow —— Maxime 的另一个项目,理解他的设计偏好
  • grafana —— 同样是开源可视化,但定位是时序监控不是 BI

关联

  • airflow —— 同一个作者 Maxime Beauchemin,对照看其设计哲学
  • grafana —— 开源可视化双雄,一个偏 BI 一个偏监控
  • clickhouse —— Superset 最常接的列存数仓
  • postgresql —— Superset 元数据库的默认选项
  • sqlalchemy —— Superset 接 40+ 数据源的抽象层
  • apache-echarts —— Superset 主要图表渲染引擎
  • flask —— Superset 后端 Web 框架
  • looker —— 商业 BI 对手,语义层做得更深