如何在Ubuntu 20.04部署Apache Superset
Apache Superset 是一个开源数据可视化软件,能够处理 PB 级大数据。该应用程序最初是 Maxime Beauchemin(Apache Airflow的创建者)在 Airbnb 工作时的一个 hack-a-thon 项目,并于 2017 年进入 Apache 孵化器计划。除了 Airbnb,该项目还得到了其他领先科技公司的重大贡献,包括 Lyft 和 Dropbox。 2021年Superset 从孵化器项目毕业,成为 Apache 软件基金会的顶级项目。——维基百科
Superset提供:
- 用于快速构建图表的无代码界面
- 强大的、基于 Web 的 SQL 编辑器,可用于高级查询
- 用于快速定义自定义维度和指标的轻量级语义层
- 对几乎所有 SQL 数据库或数据引擎的开箱即用支持
- 各种漂亮的可视化展示您的数据,从简单的条形图到地理空间可视化
- 轻量级、可配置的缓存层,有助于减轻数据库负载
- 高度可扩展的安全角色和身份验证选项
- 用于程序化定制的 API
- 从头开始设计的云原生架构以实现规模化
安装依赖
使用以下命令安装依赖:
1 | sudo apt-get install build-essential libssl-dev libffi-dev python3-dev python3-pip libsasl2-dev libldap2-dev default-libmysqlclient-dev postgresql postgresql-contrib nginx |
创建PostgreSQL数据库和数据库用户
本教程使用PostgreSQL数据库作为Superset的数据库,安装完成后需要进行以下配置。
通过以下命令登录到PostgreSQL数据库:
1
sudo -u postgres psql
创建Superset数据库
1
CREATE DATABASE superset_db;
创建数据库用户
1
CREATE USER superset_user WITH PASSWORD 'password';
修改数据库链接参数
1
2
3ALTER ROLE superset_user SET client_encoding TO 'utf8';
ALTER ROLE superset_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE superset_user SET timezone TO 'UTC';superset_user访问管理superset数据库
1
GRANT ALL PRIVILEGES ON DATABASE superset_db TO superset_user;
配置完成后使用以下命令退出PostgreSQL交互界面
1
\q
为您Superset创建 Python 虚拟环境
更新pip和安装必要的包
1
2sudo pip install --upgrade pip
sudo pip install virtualenv创建虚拟环境
1
virtualenv superset
激活虚拟环境
1
source superset/bin/activate
安装Superset
1
pip install apache-superset
安装其他python依赖
1
pip install gunicorn gevent Pillow pymssql pymysql
配置Superset
在
superset/bin
目录创建Superset配置文件superset_config.py
,详细配置可参考官方文档或这里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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62# Superset specific config
ROW_LIMIT = 5000
#SUPERSET_WEBSERVER_PORT = 8088
# Flask App Builder configuration
# Your App secret key will be used for securely signing the session cookie
# and encrypting sensitive information on the database
# Make sure you are changing this key for your deployment with a strong key.
# You can generate a strong key using `openssl rand -base64 42`
'''
使用命令“openssl rand -base64 42”创建SECRET_KEY填写到下面'''
SECRET_KEY = ''
# The SQLAlchemy connection string to your database backend
# This connection defines the path to the database that stores your
# superset metadata (slices, connections, tables, dashboards, ...).
# Note that the connection information to connect to the datasources
# you want to explore are managed directly in the web UI
'''
数据库连接,我是用的是PostgreSQL数据库链接字符串:postgresql://<数据库用户>:<密码>@<主机名ip>/<数据库名>
如果使用的是Mysql数据库连接字符串:mysql+pymysql://<数据库用户>:<密码>@<主机名ip>:<端口号>/<数据库名>'''
SQLALCHEMY_DATABASE_URI = 'postgresql://superset_user:[email protected]/superset_db'
# Flask-WTF flag for CSRF
WTF_CSRF_ENABLED = True
# Add endpoints that need to be exempt from CSRF protection
WTF_CSRF_EXEMPT_LIST = []
# A CSRF token that expires in 1 year
WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365
# Set this API key to enable Mapbox visualizations
MAPBOX_API_KEY = ''
COMPRESS_REGISTER = False
#默认中文
BABEL_DEFAULT_LOCALE = "zh"
#superset支持的语言
LANGUAGES = {
"en": {"flag": "us", "name": "English"},
"es": {"flag": "es", "name": "Spanish"},
"it": {"flag": "it", "name": "Italian"},
"fr": {"flag": "fr", "name": "French"},
"zh": {"flag": "cn", "name": "Chinese"},
"ja": {"flag": "jp", "name": "Japanese"},
"de": {"flag": "de", "name": "German"},
"pt": {"flag": "pt", "name": "Portuguese"},
"pt_BR": {"flag": "br", "name": "Brazilian Portuguese"},
"ru": {"flag": "ru", "name": "Russian"},
"ko": {"flag": "kr", "name": "Korean"},
"sk": {"flag": "sk", "name": "Slovak"},
"sl": {"flag": "si", "name": "Slovenian"},
"nl": {"flag": "nl", "name": "Dutch"},
}
SHOW_STACKTRACE = False
DEBUG = False
APP_NAME = "Superset"通过运行以下命令完成初始化Superset
1
2
3
4
5
6
7
8
9
10
11
12export FLASK_APP=superset
# 初始化数据库
superset db upgrade
# 在您的元数据数据库中创建一个管理员用户(使用 `admin` 作为用户名以便能够加载示例)
superset fab create-admin
# 加载演示数据
superset load_examples
# 创建默认角色和权限
superset init创建
/etc/systemd/system/superset.service
服务1
2
3
4
5
6
7
8
9
10
11
12[Unit]
Description=superset daemon
After=network.target
[Service]
User=superset
Group=superset
WorkingDirectory=/home/superset/superset/
ExecStart=/home/superset/superset/bin/gunicorn -w 2 -k gevent --worker-connections 1000 --timeout 120 -b localhost:6666 --limit-request-line 0 --limit-request-field_size 0 --statsd-host localhost:8125 "superset.app:create_app()"
[Install]
WantedBy=multi-user.target服务创建完成后需要执行以下命令
1
sudo systemctl daemon-reload
启动Superset服务
1
sudo systemctl start superset
服务启动后会监听本地的6666端口。
配置Nginx
下面的是我的配置文件,需根据自己的实际情况修改
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
26upstream superset {
server 127.0.0.1:6666;
}
server {
listen 80;
listen [::]:80;
server_name _;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name _;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/private.key;
location / {
proxy_pass http://superset;
}
}配置完成后reload一下Nginx
1
sudo systemctl reload nginx
运行效果
登陆界面右上角可以选择语言,输入之前创建的管理员用户名密码
演示数据包含以下已经做好的看板
看板效果
踩坑
初始化执行
superset db upgrade
时报错:ImportError: cannot import name 'soft_unicode' from 'markupsafe' in...
原因:MarkupSafe:2.1.0版本取消了soft_unicode(https://markupsafe.palletsprojects.com/en/2.1.x/changes/#version-2-1-0),Superset安装的时候默认安装的MarkupSafe:2.1.0。
解决方法:
pip install --upgrade MarkupSafe==2.0.1
,降低MarkupSafe的版本。
优化汉化问题,修改
site-packages/superset/translations/zh/LC_MESSAGES/
目录下的po文件,修改后进入site-packages/superset
目录执行命令:pybabel compile -d translations
重新编译。
使用其他数据库的解决方案
感谢rust提供的使用Mysql数据库解决方案:
- 安装pymysql:
pip install pymysql
; - 修改配置文件
superset_config.py
数据库的连接字符串SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://<数据库用户>:<密码>@<主机名ip>:<端口号>/<数据库名>'
; - 修改配置文件
superset_config.py
添加一行SQLALCHEMY_TRACK_MODIFICATIONS = False
;
如何在Ubuntu 20.04部署Apache Superset