目录

Apache Superset:从入门到精通 开源企业级BI与数据可视化平台

Apache Superset:从入门到精通 — 开源企业级 BI 与数据可视化平台

目标读者:数据分析师、BI 开发工程师、数据工程师、前端开发者 前置知识:了解 SQL、了解数据可视化概念、有 Python 或 JavaScript 基础更佳 预计学习时间:2-3 小时(入门),8-12 小时(精通)


🎯 学习目标

完成本文档后,你将掌握:

  • ✅ 理解 Apache Superset 的定位、架构与核心能力
  • ✅ 掌握多种安装方式(Docker、pip、Kubernetes)
  • ✅ 配置数据库连接(MySQL、PostgreSQL、BigQuery 等)
  • ✅ 创建数据集、定义数据模型
  • ✅ 构建可视化图表(47+ 图表类型)
  • ✅ 设计仪表板与故事线
  • ✅ 配置用户权限与角色
  • ✅ 部署生产环境(单机到多节点集群)
  • ✅ 开发自定义可视化插件
  • ✅ 集成缓存与性能优化

一、项目概述与背景

1.1 什么是 Apache Superset?

Apache Superset(apache/superset)是 Apache 软件基金会的顶级开源项目,是一款现代化、企业级的 BI 与数据可视化平台

核心定位:让数据团队能够快速探索、可视化数据,并构建仪表板,无需编写代码或仅需少量代码。

1.2 项目数据

指标数值
GitHub Stars64.5k
GitHub Forks23.9k
许可证Apache-2.0
最新版本4.1.2(2026年3月25日)
主要语言Python 77.0%, TypeScript 16.3%
贡献公司Twitter、Netflix、Zalando 等 200+ 企业

1.3 核心特性

特性说明
47+ 图表类型折线图、柱状图、饼图、地图、热力图、桑基图等
SQL 支持SQL Lab 提供强大的 SQL 编辑器
无代码可视化拖拽式仪表板构建
缓存机制多级缓存提升性能
权限模型细粒度的基于角色的访问控制
可扩展自定义插件系统
身份认证支持多种认证后端(OAuth、LDAP、DB)
可嵌入Embedded Analytics SDK

1.4 适用场景

场景说明
运营仪表板实时监控业务指标
管理驾驶舱高管数据洞察
自助分析数据分析师自助探索
嵌入式 BI将图表嵌入第三方应用
数据报表周期性报告生成

1.5 与同类工具对比

工具图表数SQL 支持权限模型嵌入能力学习曲线
Superset47+细粒度SDK中等
Metabase15+简单API
Grafana30+中等API
Tableau50+
Power BI100+中等

二、快速开始:30 分钟入门

2.1 安装方式对比

安装方式适用场景难度
Docker(推荐)快速体验、开发
pip生产环境⭐⭐
Kubernetes生产集群⭐⭐⭐
源码开发贡献⭐⭐⭐

2.2 Docker 安装(推荐)

方式一:使用 docker-compose

# 克隆仓库
git clone https://github.com/apache/superset.git
cd superset

# 启动服务
docker-compose up -d

# 访问 http://localhost:8088
# 默认账号:admin / admin

方式二:手动 Docker

# 拉取镜像
docker pull apache/superset:latest

# 运行容器
docker run -d -p 8088:8088 \
  -e "SUPERSET_SECRET_KEY=your-secret-key" \
  --name superset \
  apache/superset

2.3 pip 安装

# 创建虚拟环境
python3 -m venv superset-env
source superset-env/bin/activate

# 安装依赖
pip install apache-superset

# 初始化数据库
superset db upgrade

# 创建管理员
export FLASK_APP=superset
superset fab create-admin

# 加载示例数据
superset load_examples

# 启动服务
superset run -p 8088 --with-threads --reload

2.4 首次配置

  1. 访问界面:打开 http://localhost:8088
  2. 登录:使用 admin/admin 登录
  3. 连接数据库:Settings → Database Connections
  4. 创建数据集:点击 “+” → Dataset
  5. 创建图表:点击 “+” → Chart
  6. 构建仪表板:点击 “+” → Dashboard

三、核心概念解析

3.1 数据模型层次

Superset 的数据模型分为四个层次:

概念说明
Database数据库连接(MySQL、PostgreSQL、BigQuery 等)
Schema数据库中的模式/命名空间
Table数据表,包含列和指标
Column表的列,可作为维度或指标
Metric聚合计算(COUNT、SUM、AVG 等)
Virtual Dataset虚拟数据集,基于 SQL 查询

3.2 SQL Lab

SQL Lab 是 Superset 的核心 SQL 工作台:

-- 示例:复杂 SQL 查询
SELECT
    d.department,
    DATE_TRUNC('month', o.order_date) AS month,
    COUNT(DISTINCT c.customer_id) AS customers,
    SUM(o.amount) AS revenue,
    AVG(o.amount) AS avg_order_value
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN departments d ON c.dept_id = d.id
WHERE o.order_date >= '2025-01-01'
GROUP BY d.department, DATE_TRUNC('month', o.order_date)
ORDER BY month DESC

功能特性

  • 自动补全(Auto-completion)
  • 语法高亮
  • 查询历史
  • 保存查询为数据集
  • 结果导出(CSV、Excel)

3.3 权限模型

Superset 采用 FAB(Flask-AppBuilder)的基于角色的访问控制(RBAC):

角色权限
Admin完全访问
Alpha访问所有数据,需审批
Gamma只读访问指定数据
sql_labSQL Lab 使用权限
gridview仪表板编辑权限

自定义权限示例

# 限制用户只能访问特定 schema
from superset.security import SupersetSecurityManager

class CustomSecurityManager(SupersetSecurityManager):
    def get_schemas_accessible_by_user(self, user, database):
        # 返回用户可访问的 schema 列表
        return ['public', 'analytics']

四、可视化图表详解

4.1 图表分类

Superset 支持 47+ 图表类型,分为以下大类:

4.1.1 基础图表

图表类型适用场景
折线图(Line Chart)趋势分析、时间序列
柱状图(Bar Chart)分类对比
堆叠柱状图(Stacked Bar)占比分析
饼图(Pie Chart)比例展示
面积图(Area Chart)累积趋势
散点图(Scatter Plot)关联分析

4.1.2 高级图表

图表类型适用场景
热力图(Heatmap)矩阵数据、相关性
桑基图(Sankey Diagram)流量分析
旭日图(Sunburst)层级数据
平行坐标图(Parallel Coordinates)多维分析
地图(Map)地理数据
日历热力图(Calendar Heatmap)时序数据
关系图(Graph)网络关系

4.1.3 专用图表

图表类型适用场景
饼图(Pivot Table)透视分析
时间线(Timeline)事件序列
Word Cloud文本分析
GaugeKPI 仪表
Funnel转化漏斗

4.2 创建图表示例

步骤一:选择数据集

  1. 点击 “+” → “Chart”
  2. 选择数据库和数据表
  3. 点击 “Create Chart”

步骤二:配置图表

X-axis (时间): order_date
Y-axis (指标): SUM(revenue)
Group by: department
Chart Type: Line Chart

步骤三:自定义样式

// 自定义图表配置
{
  "encoding": {
    "x": {
      "field": "order_date",
      "type": "temporal",
      "axis": {
        "format": "%Y-%m"
      }
    },
    "y": {
      "field": "revenue",
      "type": "quantitative",
      "aggregate": "sum"
    }
  },
  "mark": {
    "type": "line",
    "color": "#1DA1F2",
    "strokeWidth": 2
  }
}

五、仪表板构建

5.1 仪表板结构

仪表板由多个TabFilter组成:

5.2 过滤器(Filter)

Superset 支持多种过滤器类型:

过滤器类型说明
Time Range日期范围过滤
Select单选/多选
Date Time日期时间选择
Numeric Range数值范围
Freeform自由文本

过滤器配置

Filter Name: order_date
Dataset: orders
Filter Type: Time Range
Default Value: Last 30 days
Time Column: order_date

5.3 缓存策略

Superset 提供多级缓存:

缓存类型说明配置位置
基础缓存所有查询结果Config
数据表缓存按数据表Table → Cache
图表缓存按图表Chart → Cache
查询缓存SQL 结果SQL Lab

配置示例(superset_config.py):

# 缓存配置
CACHE_CONFIG = {
    'CACHE_TYPE': 'redis',
    'CACHE_REDIS_HOST': 'localhost',
    'CACHE_REDIS_PORT': 6379,
    'CACHE_DEFAULT_TIMEOUT': 300,  # 5 分钟
    'CACHE_KEY_PREFIX': 'superset_'
}

# 图表缓存时间
VIZ_CACHE_TIMEOUT = 300  # 5 分钟

# 查询缓存时间
SQL_CACHE_TIMEOUT = 300

六、数据库连接

6.1 支持的数据库

Superset 原生支持 60+ 数据库:

数据库连接字符串示例
PostgreSQLpostgresql://user:pass@localhost:5432/db
MySQLmysql://user:pass@localhost:3306/db
BigQuerybigquery://project/dataset
Snowflakesnowflake://user:pass@account/db
Redshiftredshift+psycopg2://user:pass@host:5439/db
Prestopresto://localhost:8080/hive
Trinotrino://localhost:8080/hive
DuckDBduckdb:///path/to/db
SQLitesqlite:///path/to/db

6.2 连接配置示例

PostgreSQL

# 安装驱动
pip install psycopg2-binary

# Superset 中配置
Database: postgresql://username:password@host:5432/dbname
Display Name: Production DB

BigQuery

# 安装驱动
pip install pybigquery

# 配置服务账号 JSON
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"

# Superset 中配置
SQLAlchemy URI: bigquery://project-id/dataset

6.3 虚拟数据集

虚拟数据集基于 SQL 查询创建:

-- 创建一个虚拟数据集
SELECT
    u.id AS user_id,
    u.name AS user_name,
    COUNT(o.id) AS order_count,
    SUM(o.amount) AS total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.created_at >= '2025-01-01'
GROUP BY u.id, u.name

七、安全与权限

7.1 认证方式

认证方式说明
Database用户名/密码
OAuthGoogle/GitHub/Okta
LDAP企业目录服务
REMOTE_USERSSO 反向代理
AUTH_DB内置用户管理

7.2 配置 OAuth

# superset_config.py
from flask_appbuilder.security.manager import SupersetSecurityManager

AUTH_TYPE = Auth.OAUTH
OAUTH_PROVIDERS = [
    {
        'name': 'google',
        'icon': 'fa-google',
        'token_key': 'access_token',
        'remote_app': {
            'client_id': 'YOUR_CLIENT_ID',
            'client_secret': 'YOUR_CLIENT_SECRET',
            'server_metadata_url': 'https://accounts.google.com/.well-known/openid-configuration',
            'client_kwargs': {
                'scope': ['openid', 'email', 'profile']
            }
        }
    }
]

7.3 数据权限

# 设置数据表权限
from superset import security

# 限制用户访问特定 schema
security_manager.add_permission(
    role_name='analyst',
    permission_name='database_access',
    view_menu_name='examples.db'
)

八、生产部署

8.1 单节点部署

# docker-compose.yml
version: '3'
services:
  superset:
    image: apache/superset:latest
    ports:
      - "8088:8088"
    environment:
      SUPERSET_SECRET_KEY: ${SECRET_KEY}
      DATABASE_URL: postgresql://user:pass@db:5432/superset
    depends_on:
      - db
      - redis
  db:
    image: postgres:14
    environment:
      POSTGRES_DB: superset
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
  redis:
    image: redis:7-alpine

8.2 Kubernetes 部署

# 添加 Helm 仓库
helm repo add superset https://apache.github.io/superset

# 安装
helm install superset superset/superset \
  --set secretKey=${SECRET_KEY} \
  --set databaseUrl=${DATABASE_URL}

8.3 性能优化

# superset_config.py

# Worker 配置
CELERY_CONFIG = {
    'broker_url': 'redis://redis:6379/0',
    'result_backend': 'redis://redis:6379/1'
}

# 并行处理
SUPERSET_WORKERS = 4
SUPERSET_CELERY_WORKERS = 2

# 查询超时
SQLLAB_ASYNC_TIME_LIMIT_SEC = 300

# 最大图表缓存时间
VIZ_CACHE_MAXAGE = 3600  # 1 小时

九、自定义插件开发

9.1 插件结构

my-custom-viz/
├── package.json
├── src/
│   ├── plugin/
│   │   ├── index.ts
│   │   ├── controlPanel.ts
│   │   └── transformProps.ts
│   └── images/
│       └── thumbnail.png
└── tsconfig.json

9.2 开发示例

// src/plugin/index.ts
import { ChartPlugin } from '@superset-ui/core';
import ControlPanel from './controlPanel';
import transformProps from './transformProps';

export default class CustomVizPlugin extends ChartPlugin {
  constructor() {
    super({
      loadChart: () => import('./CustomChart'),
      controlPanel: ControlPanel,
      transformProps,
      metadata: {
        name: 'Custom Chart',
        description: 'A custom visualization',
        credits: ['My Company'],
      },
    });
  }
}

9.3 注册插件

// superset-frontend/src/preamble.ts
import { configure } from '@superset-ui/core';
import CustomVizPlugin from './src/plugins/CustomViz';

configure([
  new CustomVizPlugin().configure(),
]);

十、最佳实践

10.1 仪表板设计

原则说明
简洁每个图表专注一个信息
一致统一的颜色和样式
层次重要指标放在左上角
交互添加过滤器提升灵活性
性能避免过多图表在同一仪表板

10.2 性能优化

优化项方法
物化视图预计算复杂聚合
数据分层汇总表 + 明细表
缓存合理设置缓存时间
查询优化添加必要的索引
数据建模使用扁平化模型

10.3 安全建议

建议说明
使用 HTTPS加密传输
定期更新版本修复安全漏洞
最小权限原则按需授权
审计日志记录所有操作
敏感数据脱敏隐藏敏感字段

十一、常见问题

Q1: 如何处理大数据量?

解决方案

  1. 使用数据聚合减少返回量
  2. 配置超时限制
  3. 使用物化视图预计算
  4. 考虑ClickHouse等 OLAP 数据库

Q2: 如何实现行级权限?

解决方案

# 在 SQL Lab 中使用
SELECT *
FROM orders
WHERE user_id = '{{ current_user_id() }}'

Q3: 如何嵌入到第三方应用?

解决方案:使用 Embedded SDK

import { SupersetEmbedding } from '@superset-ui/embedded-sdk';

SupersetEmbedding({
  id: 'your-chart-id',
  supersetUrl: 'https://superset.example.com',
  guestToken: 'your-guest-token',
  mountPoint: document.getElementById('chart'),
});

Q4: 如何备份数据?

# 备份元数据
pg_dump -U user -h host superset > superset_backup.sql

# 备份配置
cp superset_config.py /path/to/backup/

十二、总结

Apache Superset 是企业级 BI 的优秀选择:

优势说明
🔓 完全开源Apache-2.0,无许可费用
📊 丰富图表47+ 图表类型
🧠 智能缓存多级缓存提升性能
🔐 安全可控细粒度权限模型
🌍 多数据源60+ 数据库连接
📦 易于部署Docker/K8s 一键部署
🎨 可扩展插件系统支持自定义
🏢 企业验证200+ 企业生产使用

下一步推荐

  1. 快速开始:安装 Docker 版本
  2. 连接数据:尝试连接你的数据库
  3. 创建图表:构建第一个仪表板
  4. 部署生产:参考生产部署指南

文档信息

  • 难度:⭐⭐⭐(进阶)
  • 类型:完整教程
  • 更新日期:2026-03-31
  • 预计学习时间:2-3 小时(入门),8-12 小时(精通)
  • GitHub:https://github.com/apache/superset

🦞 由钳岳星君撰写 | 项目源码:https://github.com/apache/superset