本文主要介绍superset的安装以及如何从superset连接clickhouse数据库。
Superset 是apache的一个孵化项目,定位为一款现代的,准商用BI系统。
Superset是由Airbnb开源的数据分析与可视化平台,该工具主要特点是可自助分析、自定义仪表盘、分析结果可视化(导出)、用户/角色权限控制,还集成了一个SQL编辑器,可以进行SQL编辑查询等。
比较常用的功能有:
以下是本文目录:
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev libsasl2-dev libldap2-dev
otherwise build for cryptography
fails.
根据官方文档,官方推荐在虚拟环境中安装Superset,好处是因为这样子可以区分出项目依赖包防止和系统的包依赖和系统变量混淆。Python3 本身自带了virtualenv,假如没有集成virtualenv,可以通过pip3安装:
aukuno@vm-ubuntu:~/Downloads$ sudo apt install virtualenv
接下来我们创建superset的虚拟环境并且激活:
# 创建虚拟环境
aukuno@vm-ubuntu:~/Downloads$ python3 -m venv superset
# 激活虚拟环境
aukuno@vm-ubuntu:~/Downloads$ source superset/bin/activate
(superset) aukuno@vm-ubuntu:~/Downloads$
一旦激活,接下来你所做的所有操作都会被限定在虚拟环境中,要退出虚拟环境只需要输入deactivate
即可。
跟随以下步骤安装安装Superset并初始化
(superset) aukuno@vm-ubuntu:~/Downloads$ sudo pip3 install apache-superset
# 初始化Superset的数据库superset.db,一般存放在~/.superset中,
superset db upgrade
# 创建管理员(admin),根据提示输入username,姓名,邮箱以及密码。
$ export FLASK_APP=superset
flask fab create-admin
# password:superset
## 成功时提示
# Recognized Database Authentications.
# Admin User admin created.
# 加载样本示例数据
superset load_examples
# 创建默认角色和权限
superset init
# 服务器本地访问模式,只能从服务器浏览器访问web,不能从远程访问服务器IP:port,假如要绑定别的端口在`-p`中指定即可。
superset run -p 8088 --with-threads --reload --debugger
# 服务器远程访问模式,可以从本地浏览器打开web界面
gunicorn -w 4 --timeout 100 -b 0.0.0.0:8088 --limit-request-line 0 --limit-request-field_size 0 --forwarded-allow-ips="" superset:app
# 0.0.0.0:8088表示运行在服务器的8088端口,在本地打开浏览器输入服务器IP:8088即可访问
SQLAlchemy-clickhouse是clickhouse的odbc驱动,我们需要安装它从而让superset能访问sqlalchemy的接口。
(superset) aukuno@vm-ubuntu:~/Downloads$ sudo pip3 install sqlalchemy-clickhouse
安装好sqlalchemy-clickhouse后,我们让superset运行为本地访问模式,
(superset) aukuno@vm-ubuntu:~/Downloads$ superset run -p 8088 --with-threads --reload --debugger
在服务器的浏览器输入localhost:8088
,输入superset的admin账号和密码登录,登陆成功后在导航栏中点击Sources,选择右上角添加符号添加clickhouse数据库。
Database中填入在superset的新名称,SQLAlchemy URI则填入clickhouse的资源链接,在这里是clickhouse://default:[email protected]:8123/DW_TAXI_CHICAGO
其中,
/etc/clickhouse-server/users.d/default-password.xml
中找到。curl 'http://localhost:8123'
,返回ok既是没有问题。填写完毕后点击Test Connection
测试连接是否成功,弹出提示Seems ok
则表明连接没有问题,点击Save
保存。
Note
创建资源的时候可能会报错误:
File "/home/pkesso/venv/lib/python3.6/site-packages/sqlalchemy_clickhouse/connector.py", line 102, in _send
raise Exception(r.text)
Exception: Code: 194, e.displayText() = DB::Exception: Password required for user default (version 19.13.2.19)
这是由于SQLAlchemy-clickhouse导致的,可以通过两种方法解决:
sqlalchemy-clickhouse的安装存放位置可以通过sudo pip3 install sqlalchemy-clickhouse
查看,由于已经安装了,那么pip会返回已经安装的提示并打印出安装的位置,如下:
Requirement already satisfied: sqlalchemy>=1.0.0 in /usr/local/lib/python3.6/dist-packages (from sqlalchemy-clickhouse)
Requirement already satisfied: iso8601>=0.1.12 in /usr/local/lib/python3.6/dist-packages (from infi.clickhouse_orm>=1.0.0->sqlalchemy-clickhouse)
Requirement already satisfied: pytz in /usr/lib/python3/dist-packages (from infi.clickhouse_orm>=1.0.0->sqlalchemy-clickhouse)
可以看出来sqlalchemy-clickhouse
安装在/usr/local/lib/python3.6/dist-packages
中。同理可以查看python所有安装包的位置。
1、注释掉sqlalchemy_clickhouse/connector.py中的代码Database._send = _send
,
as it will use none auth to check _is_existing_database in infi/clickhouse_orm/database.py
2、或者将更改sqlalchemy_clickhouse/connector.py中的_send函数由:
def _send(self, data, settings=None, stream=False):
if PY3 and isinstance(data, string_types):
data = data.encode('utf-8')
params = self._build_params(settings)
r = requests.post(self.db_url, params=params, data=data, stream=stream)
if r.status_code != 200:
raise Exception(r.text)
return r
替换为:
def _send(self, data, settings=None, stream=False):
if PY3 and isinstance(data, string_types):
data = data.encode('utf-8')
params = self._build_params(settings)
# r = requests.post(self.db_url, params=params, data=data, stream=stream)
r = self.request_session.post(
self.db_url, params=params, data=data, stream=stream, timeout=self.timeout)
if r.status_code != 200:
raise Exception(r.text)
return r
打开SQL Lab,在左边导航栏中选择数据库为clickhouse中的数据库,也即是上一步连接clickhouse时输入的数据库名称,需要注意的是这不是在clickhouse中的数据库名称,而是连接到superset后另起的名称。Schema选择DW_TAXI_CHICAGO,这个才是clickhouse中的数据库名称。
在编辑框中输入SQL,点击Run Query
,可以看到返回的结果数据如图所示,则说明连接成功。