作者 | 荣翔
背景
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项目更新较快,很多命令最新版本和老版本有较大差异。
第一部分 传统部署安装
单机安装环境操作系统为:ubuntu 16.04
,Python环境版本为:Python 3.7.6
。
需要注意的是项目不支持在windows上运行,部署可以基于虚拟机。
1.1 基础环境准备
Superset 使用Python语言编写,运行需要提前部署Python环境(要求版本大于Python 3.6)。如果具备互联网环境下,直接使用pip安装(非生产)即可:
root@deeplearning:/data/superset# pip install apache-superset复制
1.2 配置应用
Superset默认后台数据库使用sqllite
。在生产环境中建议使用Mysql
数据库(并具备高可用架构)。使用pip安装后,superset项目的Home目录通常在Python的包目录(具体环境目录存在差异):
/usr/anaconda3/lib/python3.7/site-packages/superset复制
其中目录中文件config.py
是superset的配置文件(superset项目使用Flask框架编写)。通常我们关注的配置有:
应用服务配置
SUPERSET_WEBSERVER_PROTOCOL = "http"
# 服务监听地址
SUPERSET_WEBSERVER_ADDRESS = "0.0.0.0"
# 服务监听端口
SUPERSET_WEBSERVER_PORT = 8088复制注意:使用pip安装部署的测试环境的配置在运行的时候是无效的,需要在命令行中重新指定。
后台数据库配置
# The 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
: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 初始化应用
首先初始化管理员账号密码:
root@deeplearning:/usr/anaconda3/lib/python3.7/site-packages/superset# superset fab create-admin
logging was configured successfully
INFO:superset.utils.logging_configurator:logging was configured successfully
/usr/anaconda3/lib/python3.7/site-packages/flask_caching/__init__.py:192: UserWarning: Flask-Caching: CACHE_TYPE is set to null, caching is effectively disabled.
"Flask-Caching: CACHE_TYPE is set to null, "
Username [admin]: admin
User first name [admin]: admin
User last name [user]: admin
Email [admin@fab.org]: admin@fab.org
Password:
Repeat for confirmation:
Recognized Database Authentications.
Admin User admin created.复制
查看mysql
数据库新增下面的用户表:
mysql> show tables;
+-------------------------+
| Tables_in_superset |
+-------------------------+
| ab_permission |
| ab_permission_view |
| ab_permission_view_role |
| ab_register_user |
| ab_role |
| ab_user |
| ab_user_role |
| ab_view_menu |
+-------------------------+
8 rows in set (0.01 sec)复制
继续初始化应用的表:
root@deeplearning:/usr/anaconda3/lib/python3.7/site-packages/superset# superset db upgrade复制
查看数据库会新增应用依赖表。最后创建默认角色和权限:
root@deeplearning:/usr/anaconda3/lib/python3.7/site-packages/superset# superset init复制
1.4 启动服务
启动服务前我们加载一些案例数据:
root@deeplearning:/usr/anaconda3/lib/python3.7/site-packages/superset# superset load_examples复制
注意:加载案例数据需要互联网环境,从互联网加载数据至数据库。完成上面的配置后就可以启动服务。
# 启动命令
root@deeplearning:# superset run -h 0.0.0.0 -p 8088 --with-threads --reload --debugger复制
其中端口可以重新制定(覆盖配置文件中定义)。打开浏览器:http://localhost:8088/login/,弹出登陆界面,输入账号密码登陆。
第二部分 基于docker部署
首先具备docker、docker-compose(version 1.24.1)和git环境。
# 拉取(如果国内拉取慢,可以下载zip包)
git clone https://github.com/apache/superset.git
cd superset
# you can run this command everytime you need to start superset now:
docker-compose up复制
宿主机会启动下面的容器(一共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 加入库中:
# helm repo rm cloudposse-incubator 2>/dev/null
# helm repo add cloudposse-incubator https://charts.cloudposse.com/incubator/复制
然后安装:
root@deeplearning:/data/helm# helm install cloudposse-incubator/superset
NAME: killjoy-squid
LAST DEPLOYED: Sun Jan 31 16:06:02 2021
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
killjoy-squid-superset 0/1 1 0 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
killjoy-squid-superset-6587d9797f-wv5t4 0/1 ContainerCreating 0 0s
==> v1/Secret
NAME TYPE DATA AGE
killjoy-squid-superset Opaque 2 0s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
killjoy-squid-superset ClusterIP 10.98.190.160 <none> 9000/TCP 0s
NOTES:
Superset can be accessed via port 9000 on the following DNS name from within your cluster:
killjoy-squid-superset.default.svc.cluster.local
Initially you can login with username/password: admin/admin.
WARNING: Persistence is DISABLED !复制
使用宿主机上地址,打开:http://宿主机IP:9000/login/。查看应用:
root@deeplearning:/data/superset/superset-master/helm/superset# helm list --all
NAME REVISIONUPDATED STATUS CHART APP VERSIONNAMESPACE
killjoy-squid1 Sun Jan 31 16:06:02 2021DEPLOYEDsuperset-1.2.00.35.2 default复制
如果要删除应用:
# 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

扫描二维码获取
更多精彩
数据科学和工程
