Superset部署手册
Superset是一个airbnb贡献出开源的BI工具,在airbnb内部广泛使用,目前amazon内部也慢慢将BI工具从tableau迁移到Superset.
在测试环境中,可以用docker部署,用docker-compose up一条命令即可部署成功,但在生产环境中,不建议使用此方法。
生产环境,可以参考下面的方法部署
系统要求
推荐内存4GB,硬盘20GB以上。 Superset 只支持python3.6以上版本,不支持python2.7 当前测试的superset版本为0.35.2 本次测试机型:AWS宁夏区Amazon Linux2 (ami-0e08e7c3821193844)
安装准备工具
先升级安装一下安装工具
sudo yum install -y python3
sudo yum install -y python3-devel // 不安装python3-devel,在用pip安装superset的时候会报错 gcc编译Python.h错误
sudo yum install python-setuptools // 或者升级 sudo yum upgrade python-setuptools
sudo yum install -y gcc gcc-c++ libffi-devel python-devel python-pip python-wheel openssl-devel cyrus-sasl-devel openldap-devel
安装一下python虚拟环境 sudo pip3 install virtualenv -i https://pypi.douban.com/simple
激活环境
python3 -m venv venv
. venv/bin/activate
升级一下pip和setuptools pip3 install --upgrade setuptools pip -i https://pypi.douban.com/simple
开始安装
使用pip3安装superset
# Install superset
pip3 install apache-superset -i https://pypi.douban.com/simple
# Initialize the database
superset db upgrade
# Create an admin user (you will be prompted to set a username, first and last name before setting a password)
export FLASK_APP=superset
flask fab create-admin
superset init //如果没有执行 superset init,那么虽然创建成功了用户,但是用户登录之后,superset的界面不能正常打开,使用浏览器debug会发现没有权限加载某些元素
测试环境部署,生产环境请跳过此步骤
在测试环境中,可以用下面的方法快速部署
# Load some data to play with
superset load_examples
# Create default roles and permissions
superset init
# To start a development web server on port 8088, use -p to bind to another port
superset run -p 8088 --with-threads --reload --debugger
在生产环境中使用gunicorn部署WSGI HTTP Server
在调试的时候,可以先不加 -D参数,等配置完成之后,再加-D将其放到后台
gunicorn -w 10 --timeout 120 -b 0.0.0.0:6666 --limit-request-line 0 --limit-request-field_size 0 "superset.cli:create_app()"
使用nginx 做前端转发
安装nginx并修改nginx配置文件,添加proxy_pass转发
sudo yum install -y nginx // sudo amazon-linux-extras install nginx1.12 -y
sudo vim /etc/nginx/nginx.conf
sudo systemctl restart nginx
在http-server80 --location处修改
location / {
proxy_pass http://127.0.0.1:6666;
}
登录到superset上
用户名和密码为先前 flask fab create-admin 这个命令创建的 http://nginx_ip/
安装mysql和aws athena连接driver
在superset网页界面的Sources--database中可以添加mysql,athena,bigquery等数据库。但默认情况下,并没有driver,需要手动安装。
先退出gunicorn启动的进程,然后使用pip来安装(venv环境中的pip)。具体安装的命令参考:https://superset.incubator.apache.org/installation.html#database-dependencies
以Athena示例: pip install PyAthena -i https://pypi.douban.com/simple
安装之后,默认只能连接global的Athena,无法连中国区,连宁夏区域Athena,要修改一下配置文件。在venv路径下:venv/lib/python3.7/site-packages/pyathena/,修改sqlalchemy_athena.py 这个文件,在第233行添加.cn后缀,即改为:'region_name': re.sub(r'^athena.([a-z0-9-]+).amazonaws.com.cn$', r'\1', url.host) 详情
# {schema_name}?s3_staging_dir={s3_staging_dir}&...
opts = {
'aws_access_key_id': url.username if url.username else None,
'aws_secret_access_key': url.password if url.password else None,
'region_name': re.sub(r'^athena\.([a-z0-9-]+)\.amazonaws\.com\.cn$', r'\1', url.host),
'schema_name': url.database if url.database else 'default'
}
重新启动gunicorn,并刷新一下Superset网页 gunicorn -w 10 --timeout 120 -b 0.0.0.0:6666 --limit-request-line 0 --limit-request-field_size 0 "superset.cli:create_app()"
添加一个DB,测试成功之后,网页弹窗显示:Seems OK! awsathena+rest://AWS_AK:[email protected]/default?s3_staging_dir=s3://xlaws/athena_temp/
添加MySQL示例:
sudo yum install mysql-devel
pip install mysqlclient -i https://pypi.douban.com/simple \\mysqlclient 依赖于mysql-devel
这次把gunicorn放在后台(加上-D参数),同时启用access_log和error_log
gunicorn -w 10 --timeout 120 -b 0.0.0.0:6666 --limit-request-line 0 --limit-request-field_size 0 "superset.cli:create_app()" --access-logfile access_log --error-logfile error_log -D
添加mysql的数据源: mysql://DB_USERNAME:DB_PASSWORD@dbmysql.ckvg6d2mvjkp.rds.cn-northwest-1.amazonaws.com.cn
最后可以在Sources中添加table,然后可以根据自己的需要构建Charts和Dashboard。
关闭gunicorn进程
ps aux | grep "gunicorn" | grep -v 'grep' | awk '{print $2}' | while read line; do kill -9 $line; done;
也可以创建配置文件,将gunicorn放在系统服务中,参考:
https://blog.csdn.net/liangkiller/article/details/101299753
使用Redis做Cache,使用MySQL RDS做metastore
使用pip安装redis,这样Superset才能连到redis上 pip install redis -i https://pypi.douban.com/simple
在PYTHONPATH路径下,创建一个superset_config.py文件. 获取PYTHONPATH路径的方法: 进入python3 shell
import sys
print(sys.path)
在superset_config.py文件中,指定mysql和redis的地址端口以及用户名密码
SQLALCHEMY_DATABASE_URI = 'mysql://DB_USER:DB_PASSWORD@dbmysql.ckvg6d2mvjkp.rds.cn-northwest-1.amazonaws.com.cn/superset'
CACHE_CONFIG = {
"CACHE_TYPE": "redis",
"CACHE_REDIS_URL": "redis://redis-log-cache.pe5q7k.0001.cnw1.cache.amazonaws.com.cn:6379/0",
"CACHE_KEY_PREFIX": "SUPERSET_",
}
之后要重新初始化数据库
superset db upgrade
export FLASK_APP=superset
flask fab create-admin
superset init
重新启动gunicorn进程: gunicorn -w 10 --timeout 120 -b 0.0.0.0:6666 --limit-request-line 0 --limit-request-field_size 0 "superset.cli:create_app()" -D
创建database,table,chart,dashboard之后,登录到mysql和redis,可以看到已经有数据写入.
Superset高可用
创建另外一个superset,指定redis和mysql,然后前端挂载负载均衡器,测试当任意一台Superset宕机,另外一个superset都能正常提供服务,且之前创建的dashboard等信息依然保留。
故障排查
在使用Superset和AWS Athena集成的时候,遇到botocore版本冲突的报错,具体报错信息为: pkg_resources.ContextualVersionConflict: (botocore 1.15.26 (/home/ec2-user/venv/lib/python3.7/site-packages), Requirement.parse('botocore<1.16.0,>=1.15.27'), {'boto3'})
此时出问题的boto3和botocore版本为:
boto3 1.12.27
botocore 1.15.26
另外一台正常使用的boto3的版本为:
boto3 1.12.26
botocore 1.15.26
解决办法为: pip install boto3==1.12.26 --upgrade -i https://pypi.douban.com/simple
在AWS上使用CloudFromation部署SuperSet
链接:https://github.com/liualexiang/learninguide/blob/master/Superset/Superset_CloudFormation/Superset_on_EC2.template
在AWS上使用terraform部署superset
链接:https://github.com/liualexiang/learninguide/tree/master/Superset/Superset_on_EC2_Terraform
参考资料
https://superset.incubator.apache.org/installation.htm https://docs.gunicorn.org/en/stable/run.html#integration
最后更新于