背景
Apache Superset由airbnb公司 (知名在线房屋短租公司)开源的数据可视化项目。项目于 2015 年 6 月开源,活跃度极高。2021年1 月 21 日,Apache Superset项目组宣布毕业并成为 Apache 软件基金会(ASF)的顶级项目(Top-Level Project)。superset 在国内外都有着广泛的应用。superset 的国内比较知名的互联网公司有:bilibili、Douban、Kuaishou、Qunar 等等。
技术栈上,Superset 的前端主要用到了 React 和 NVD3/D3,而后端则基于 Python 的 Flask 框架和 Pandas、SQLAlchemy 等依赖库,主要提供的功能有:
- 集成数据查询功能,支持多种数据库,包括 MySQL、PostgresSQL、Oracle、SQL Server、SQLite、SparkSQL 等,并深度支持 Druid。
- 通过 NVD3/D3 预定义了多种可视化图表,满足大部分的数据展示功能。如果还有其他需求,也可以自开发更多的图表类型,或者嵌入其他的 JavaScript 图表库(如 HighCharts、ECharts)。
- 提供细粒度安全模型,可以在功能层面和数据层面进行访问控制。支持多种鉴权方式(如数据库、OpenID、LDAP、OAuth、REMOTE_USER 等)。
目前中文介绍项目部署的材料较少,本文将详细介绍多种部署方式。需要注意的是:Superset项目更新较快,很多命令最新版本和老版本有较大差异。
目录
背景
第一部分 传统部署安装
第二部分 基于docker部署
第三部分 基于helm在k8s集群部署
第四部分 生产高可用部署
参考文献及资料
第一部分 传统部署安装
单机安装环境操作系统为:ubuntu 16.04
,Python环境版本为:Python 3.7.6
。
需要注意的是项目不支持在windows上运行,部署可以基于虚拟机。
1.1 基础环境准备
Superset 使用Python语言编写,运行需要提前部署Python环境(要求版本大于Python 3.6)。如果具备互联网环境下,直接使用pip安装(非生产)即可:
1 | root@deeplearning:/data/superset# pip install apache-superset |
1.2 配置应用
Superset默认后台数据库使用sqllite
。在生产环境中建议使用Mysql
数据库(并具备高可用架构)。使用pip安装后,superset项目的Home目录通常在Python的包目录(具体环境目录存在差异):
1 | /usr/anaconda3/lib/python3.7/site-packages/superset |
其中目录中文件config.py
是superset的配置文件(superset项目使用Flask框架编写)。通常我们关注的配置有:
应用服务配置
1
2
3
4
5SUPERSET_WEBSERVER_PROTOCOL = "http"
服务监听地址
SUPERSET_WEBSERVER_ADDRESS = "0.0.0.0"
服务监听端口
SUPERSET_WEBSERVER_PORT = 8088注意:使用pip安装部署的测试环境的配置在运行的时候是无效的,需要时命令行中重新指定。
后台数据库配置
1
2
3
4The SQLAlchemy connection string.
SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(DATA_DIR, "superset.db")
SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
SQLALCHEMY_DATABASE_URI = 'postgresql://root:password@localhost/myapp'配置中默认使用的就是
sqlite
。生产环境中我们调整配置为mysql
:1
SQLALCHEMY_DATABASE_URI = 'postgresql://root:root@localhost/superset'
另外只要
sqlalchemy
支持的数据源,superset都是支持的,列举如下:| database | pypi package | SQLAlchemy URI prefix |
| :——— | :————————————– | :———————————————————– |
| MySQL |pip install mysqlclient
|mysql://
|
| Postgres |pip install psycopg2
|postgresql+psycopg2://
|
| Presto |pip install pyhive
|presto://
|
| Hive |pip install pyhive
|hive://
|
| Oracle |pip install cx_Oracle
|oracle://
|
| sqlite | |sqlite://
|
| Snowflake |pip install snowflake-sqlalchemy
|snowflake://
|
| Redshift |pip install sqlalchemy-redshift
|redshift+psycopg2://
|
| MSSQL |pip install pymssql
|mssql://
|
| Impala |pip install impyla
|impala://
|
| SparkSQL |pip install pyhive
|jdbc+hive://
|
| Greenplum |pip install psycopg2
|postgresql+psycopg2://
|
| Athena |pip install "PyAthenaJDBC>1.0.9"
|awsathena+jdbc://
|
| Athena |pip install "PyAthena>1.2.0"
|awsathena+rest://
|
| Vertica |pip install sqlalchemy-vertica-python
|vertica+vertica_python://
|
| ClickHouse |pip install sqlalchemy-clickhouse
|clickhouse://
|
| Kylin |pip install kylinpy
|kylin://
|
| BigQuery |pip install pybigquery
|bigquery://
|
| Teradata |pip install sqlalchemy-teradata
|teradata://
|
| Pinot |pip install pinotdb
|pinot+http://controller:5436/
query?server=http://controller:5983/
|其中对大数据领域常见的 Druid、ClickHouse、Kylin、Presto等OLAP数据库的支持,是最具吸引力的。
汉化
修改Setup default language,BABEL_DEFAULT_LOCALE调整为
zh
。
1.3 初始化应用
首先初始化管理员账号密码:
1 | root@deeplearning:/usr/anaconda3/lib/python3.7/site-packages/superset# superset fab create-admin |
查看mysql
数据库新增下面的用户表:
1 | show tables; |
继续初始化应用的表:
1 | root@deeplearning:/usr/anaconda3/lib/python3.7/site-packages/superset# superset db upgrade |
查看数据库会新增应用依赖表。最后创建默认角色和权限:
1 | root@deeplearning:/usr/anaconda3/lib/python3.7/site-packages/superset# superset init |
1.4 启动服务
启动服务前我们加载一些案例数据:
1 | root@deeplearning:/usr/anaconda3/lib/python3.7/site-packages/superset# superset load_examples |
注意:加载案例数据需要互联网环境,从互联网加载数据至数据库。完成上面的配置后就可以启动服务。
1 | 启动命令 |
其中端口可以重新制定(覆盖配置文件中定义)。打开浏览器:http://localhost:8088/login/,弹出登陆界面,输入账号密码登陆。
第二部分 基于docker部署
首先具备docker、docker-compose(version 1.24.1)和git环境。
1 | 拉取(如果国内拉取慢,可以下载zip包) |
宿主机会启动下面的容器(一共6个):
IMAGE | NAMES |
---|---|
apache/superset:latest-dev | superset_worker |
node:12 | superset_node |
apache/superset:latest-dev | superset_app |
apache/superset:latest-dev | superset_init |
redis:3.2 | superset_cache |
postgres:10 | superset_db |
使用默认用户名:admin/admin登录控制台界面:http://地址:8088/
第三部分 基于helm在k8s
集群部署
首先具备helm和k8s
集群环境。首先拉取Chart 加入库中:
1 | helm repo rm cloudposse-incubator 2>/dev/null |
然后安装:
1 | root@deeplearning:/data/helm# helm install cloudposse-incubator/superset |
使用宿主机上地址,打开:http://宿主机IP:9000/login/。查看应用:
1 | root@deeplearning:/data/superset/superset-master/helm/superset# helm list --all |
如果要删除应用:
1 | helm delete killjoy-squid |
第四部分 生产高可用配置
以上部署均是测试部署,对于生产环境部署建议如下。
4.1 使用web服务部署
目前支持web服务器有:Gunicorn
,Nginx
,Apache
进行部署。
4.2 使用生产数据库
默认后台数据库使用sqlite
,生产建议使用MySQL
,Postgres
,MariaDB
等数据库引擎,消息和缓存层使用redis
。
4.3 开启负载均衡
使用F5或者软件负载(Nginx)进行负载,组成web集群。
4.4 开源https和权限认证
目前支持与OAuth2服务对接,并使用https协议。
第五部分 业务框架介绍
5.1 整体框架
superset整体使用业务框架并不复杂。主要业务概念有:
- 数据源。理论上
sqlalchemy
包支持的数据源,superset都是支持的。数据源配置中【配置读写权限。 - 图表(Chart)。superset 在这里定义了字段和指标(Metric)的概念。指标是对字段的某种统计结果,比如字段上值的求和、平均值、最大值、最小值等。
- 大屏板(Dashboard)。通过定义好的图表,组成一个大屏板。
5.2 权限介绍
Superset的权限体系是通过Flask AppBuilder (FAB)完成,Flask-AppBuilder是基于Flask实现的一个用于快速构建Web后台管理系统的简单的框架。
Superset的默认角色有:Admin、Alpha、Gamma、sql_lab、Public
- Admin
管理员有所有的权利,其中包括授予或撤销其他用户和改变其他人的切片和仪表板的权利。
- Alpha
alpha可以访问所有数据源,但不能授予或撤消其他用户的访问权限,并且他们也只能修改自己的数据。alpha用户可以添加和修改数据源。
- Gamma
Gamma访问有限。他们只能使用他们通过另一个补充角色访问的数据源中的数据。他们只能访问查看从他们有权访问的数据源制作的切片和仪表板。目前,Gamma用户无法更改或添加数据源。我们假设他们大多是内容消费者,虽然他们可以创建切片和仪表板。
还要注意,当Gamma用户查看仪表板和切片列表视图时,他们只会看到他们有权访问的对象。
- sql_lab
sql_lab角色用于授予需要访问sql lab的用户,而管理员用户可以访问所有的数据库,默认情况下,Alpha和Gamma用户需要一个数据库的访问权限。
- Public
允许登录用户访问一些Superset的一些功能。
另外Superset支持用户自定义创建角色,例如:您可以创建一个角色Financial Analyst,该角色将由一组数据源(表)和/或数据库组成。然后用户将被授予Gamma,Financial Analyst,或者sql_lab角色都可以。
第六部分 技术选型建议
数据可视化开源项目较多,github
上有个项目收集了大量项目清单,可以参考:
https://github.com/thenaturalist/awesome-business-intelligence
6.1 优点
- 项目使用Python语言研发,用户具备技术栈后可以快速二次开发。社区较为活跃,项目演进较快。
- 可视化功能选项较为丰富。
6.2 缺点
- 权限管理。开源项目引入需要改造和内部权限打通。图表和Dashboard没有引入文件夹或者分组的理念,只有检索功能。权限系统特别复杂, 权限体系小规模使用还算方便,大规模使用需要很高的配置和运维成本。
- 使用Python语言,依赖环境较为复杂,传统环境(非云)部署较为复杂。建议基于云原生部署。
- 目前只支持每次可视化一张表,对于多表join的情况还无能为力。
- 依赖于数据库的快速响应,如果数据库本身太慢Superset也没什么办法
6.3 总结
对于静态的日报、报表等业务需求,选择superset较好。整体定位上,Superset属于轻量级的BI项目,对于较为复杂的数据关联等逻辑应该在ETL过程中完成,Superset只是读取可视化结果表。
参考文献及资料
1、Apache Superset项目代码托管地址,链接:https://github.com/apache/superset
2、pip源地址,链接:https://pypi.org/project/superset/
3、在线文档,链接:https://apache-superset.readthedocs.io/en/0.36/installation.html
4、docker-superset,链接:https://abhioncbr.github.io/docker-superset/
5、superset helm库,链接:https://artifacthub.io/packages/helm/cloudposse/superset