Fork me on GitHub

Apache Superset项目部署

背景

Apache Superset由airbnb公司 (知名在线房屋短租公司)开源的数据可视化项目。项目于 2015 年 6 月开源,活跃度极高。2021年1 月 21 日,Apache Superset项目组宣布毕业并成为 Apache 软件基金会(ASF)的顶级项目(Top-Level Project)。superset 在国内外都有着广泛的应用。superset 的国内比较知名的互联网公司有:bilibili、Douban、Kuaishou、Qunar 等等。

技术栈上,Superset 的前端主要用到了 ReactNVD3/D3,而后端则基于 Python 的 Flask 框架和 PandasSQLAlchemy 等依赖库,主要提供的功能有:

  • 集成数据查询功能,支持多种数据库,包括 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
    5
    SUPERSET_WEBSERVER_PROTOCOL = "http"
    # 服务监听地址
    SUPERSET_WEBSERVER_ADDRESS = "0.0.0.0"
    # 服务监听端口
    SUPERSET_WEBSERVER_PORT = 8088

    注意:使用pip安装部署的测试环境的配置在运行的时候是无效的,需要时命令行中重新指定。

  • 后台数据库配置

    1
    2
    3
    4
    # 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

    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
2
3
4
5
6
7
8
9
10
11
12
13
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数据库新增下面的用户表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

继续初始化应用的表:

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
2
# 启动命令
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环境。

1
2
3
4
5
# 拉取(如果国内拉取慢,可以下载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 加入库中:

1
2
# helm repo rm cloudposse-incubator 2>/dev/null
# helm repo add cloudposse-incubator https://charts.cloudposse.com/incubator/

然后安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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/。查看应用:

1
2
3
root@deeplearning:/data/superset/superset-master/helm/superset# helm list --all
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
killjoy-squid 1 Sun Jan 31 16:06:02 2021 DEPLOYED superset-1.2.0 0.35.2 default

如果要删除应用:

1
# helm delete killjoy-squid

第四部分 生产高可用配置

以上部署均是测试部署,对于生产环境部署建议如下。

4.1 使用web服务部署

目前支持web服务器有:GunicornNginxApache进行部署。

4.2 使用生产数据库

默认后台数据库使用sqlite,生产建议使用MySQLPostgresMariaDB等数据库引擎,消息和缓存层使用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

0%