暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Apache Superset项目部署介绍

数据科学和工程 2021-02-15
5450

作者 | 荣翔

背景

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都是支持的,列举如下:

    databasepypi packageSQLAlchemy URI prefix
    MySQLpip install mysqlclient
    mysql://
    Postgrespip install psycopg2
    postgresql+psycopg2://
    Prestopip install pyhive
    presto://
    Hivepip install pyhive
    hive://
    Oraclepip install cx_Oracle
    oracle://
    sqlite
    sqlite://
    Snowflakepip install snowflake-sqlalchemy
    snowflake://
    Redshiftpip install sqlalchemy-redshift
    redshift+psycopg2://
    MSSQLpip install pymssql
    mssql://
    Impalapip install impyla
    impala://
    SparkSQLpip install pyhive
    jdbc+hive://
    Greenplumpip install psycopg2
    postgresql+psycopg2://
    Athenapip install "PyAthenaJDBC>1.0.9"
    awsathena+jdbc://
    Athenapip install "PyAthena>1.2.0"
    awsathena+rest://
    Verticapip install sqlalchemy-vertica-python
    vertica+vertica_python://
    ClickHousepip install sqlalchemy-clickhouse
    clickhouse://
    Kylinpip install kylinpy
    kylin://
    BigQuerypip install pybigquery
    bigquery://
    Teradatapip install sqlalchemy-teradata
    teradata://
    Pinotpip 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个):

IMAGENAMES
apache/superset:latest-devsuperset_worker
node:12superset_node
apache/superset:latest-devsuperset_app
apache/superset:latest-devsuperset_init
redis:3.2superset_cache
postgres:10superset_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


扫描二维码获取

更多精彩

数据科学和工程

文章转载自数据科学和工程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论