Scott's Blog

学则不固, 知则不惑

0%

记录开源 BI 工具 Superset 的部署

Apache Superset 是一个开源的数据探查与可视化平台,该工具在可视化、易用性和交互性上非常有特色,用户可以轻松对数据进行可视化分析。

使用 Docker 安装 Superset

  1. 第一步需要安装 Docker Engine 和 Docker Compose,在 Mac 上,可以使用 Docker Desktop,其中包括了 Docker Engine 和 Docker Compose。安装好 Docker 后,需要进入 Docker 设置将默认的内存设置为 6 GB
  2. 克隆 Superset 的仓库到本地:
1
git clone https://github.com/apache/superset.git
  1. 将仓库拷贝到本地后,执行下面两条语句:
1
2
docker-compose -f docker-compose-non-dev.yml pull
docker-compose -f docker-compose-non-dev.yml up

关于 docker compose 的 CLI 命令参数与相关的解释,参考 Overview of docker-compose CLI.

如果需要指定版本的 superset,需要在这一步指定,方法是在前面加上 tag 参数:

1
2
3
git checkout 1.4.0
TAG=1.4.0 docker-compose -f docker-compose-non-dev.yml pull
TAG=1.4.0 docker-compose -f docker-compose-non-dev.yml up

在启动日志中,可能会看到检测到默认的 secret string,提示我们使用自己生成的字符,还贴心的给了我们生成示例。

1
openssl rand -base64 42

其次,superset_worker 提示我们在使用超级用户启动 worker, 并提示:

1
2
3
4
5
You're running the worker with superuser privileges: 
this is absolutely not recommended!"

Please specify a different user using the --uid option.
User information: uid=0 euid=0 gid=0 egid=0

我们之后再来看这个问题。

同时在 superset_init 中,我们还看到它的初始化配置文件地址:

1
/app/docker/pythonpath_dev/superset_config.py

此时,我们其实已经可以打开 http://0.0.0.0:8088 访问 superset 的服务了, 默认的用户名和密码都是 admin

Windows 使用 WSL 安装

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
# 安装依赖
sudo apt-get install build-essential libssl-dev libffi-dev python-dev python-pip libsasl2-dev libldap2-dev

# 配置 python 和 pip 后,安装虚拟环境
pip install virtualenv
python3 -m venv venv
. venv/bin/activate

# 安装 superset
pip install apache-superset
# 初始化 db
superset db upgrade

# 设置管理员账号
export FLASK_APP=superset
superset fab create-admin

# 加载例子,可选
superset load_examples

# 初始化
superset init

# 直接启动
superset run -p 8088 --with-threads --reload --debugger

# 使用 wsgi 服务
# 安装相关服务
pip install gunicorn
pip install gevent

# 使用 wsgi 服务启动
gunicorn -w 10 -k gevent --timeout 120 -b 0.0.0.0:7668 --limit-request-line 0 --limit-request-field_size 0 "superset.app:create_app()"

配置 Superset

配置 superset 需要使用一个配置文件,即上面我们日志中看到过的那个文件,它需要被添加到你的 PYTHONPATH 中。

看一下这个文件中的内容:

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
# in superset_config.py

# Superset specific config
ROW_LIMIT = 5000

SUPERSET_WEBSERVER_PORT = 8088

# Flask App Builder configuration
# Your App secret key
SECRET_KEY = '\2\1thisismyscretkey\1\2\e\y\y\h'

# 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
SQLALCHEMY_DATABASE_URI = 'sqlite:////path/to/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 = ''

你可以在这里找到所有可选的配置添加到配置文件中。

连接数据库

由于我需要测试的数据库是 Oracle,而 superset 安装后内部并不会带有数据库驱动,我们需要手动安装,方法是在仓库内部的 docker 目录下面,新建 requirements-local.txt 文件,并填入包的名字,如对于 oracle 是:

1
cx_Oracle

然后关掉 superset 服务,重新生成镜像再启动:

1
2
docker-compose build --force-rm
docker-compose up

连接 oracle,只安装 cx_Oracle 是不够的,可能还需要有 instantclient 客户端。

在 web 界面添加数据库可能会看到这个错误:

1
2
Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help
(Background on this error at: http://sqlalche.me/e/13/4xp6)

原因是没有配置 Oracle 的 instant client,需要在环境中安装才可以连接 Oracle。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 成功启动后,还需要安装 cx_Oracle 和 instant client 才可以连接 oracle
# 首先需要下载 instant client, 这里不再赘述,去 Oracle 官网下载对应版本即可,我下载的版本是 instantclient-basic-linux.x64-12.2.0.1.0.zip

apt-get update && apt-get install -y libaio1 # 装依赖
Unzip instantclient-basic-linux.x64-12.2.0.1.0.zip # 解压

# 删除不需要的文件
cd /opt/oracle/instantclient* \
rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci \
echo /instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf \

# 配置 tnsnames
&& ldconfig \
&& mkdir -p instantclient_12_2/network/admin \
&& cp tnsnames.ora instantclient_12_2/network/admin/ \
&& cp /sqlnet.ora instantclient_12_2/network/admin/

另外,如果使用 tnsnames, tnsnames.ora 文件中的数据库地址配置可能在 wsl 中无法连接,这里折腾了一会,在宿主机上 ping 该地址得到了一个 domain.org 形式的地址,重新填入解决了。