使用 Docker 安装 Superset
- 第一步需要安装 Docker Engine 和 Docker Compose,在 Mac 上,可以使用 Docker Desktop,其中包括了 Docker Engine 和 Docker Compose。安装好 Docker 后,需要进入 Docker 设置将默认的内存设置为 6 GB
- 克隆 Superset 的仓库到本地:
$ git clone https://github.com/apache/superset.git
- 将仓库拷贝到本地后,执行下面两条语句:
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 参数:
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,提示我们使用自己生成的字符,还贴心的给了我们生成示例。
openssl rand -base64 42
其次,superset_worker 提示我们在使用超级用户启动 worker, 并提示:
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 中,我们还看到它的初始化配置文件地址:
/app/docker/pythonpath_dev/superset_config.py
此时,我们其实已经可以打开 http://0.0.0.0:8088
访问 superset 的服务了, 默认的用户名和密码都是 admin
。
Windows 使用 WSL 安装
# 安装依赖
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
# 启动
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()"
# 连接 Oracle,可参考后续章节的内容
配置 Superset
配置 superset 需要使用一个配置文件,即上面我们日志中看到过的那个文件,它需要被添加到你的 PYTHONPATH 中。
看一下这个文件中的内容:
# 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 是:
cx_Oracle
然后关掉 superset 服务,重新生成镜像再启动:
docker-compose build --force-rm
docker-compose up
连接 oracle,只安装 cx_Oracle 是不够的,可能还需要有 instantclient 客户端。
在 web 界面添加数据库可能会看到这个错误:
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。
# 成功启动后,还需要安装 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 形式的地址,重新填入解决了。