Superset 是一款由 Airbnb 开源的“现代化的企业级 BI(商业智能) Web 应用程序”,其通过创建和分享 dashboard,为数据分析提供了轻量级的数据查询和可视化方案。
Superset 的前端主要用到了 React 和 NVD3/D3,而后端则基于 Python 的 Flask 框架和 Pandas、SQLAlchemy 等依赖库,主要提供了这几方面的功能:
- 集成数据查询功能,支持多种数据库,包括 MySQL、PostgresSQL、Oracle、SQL Server、SQLite、SparkSQL 等,并深度支持 Druid。
- 通过 NVD3/D3 预定义了多种可视化图表,满足大部分的数据展示功能。如果还有其他需求,也可以自开发更多的图表类型,或者嵌入其他的 JavaScript 图表库(如 HighCharts、ECharts)。
- 提供细粒度安全模型,可以在功能层面和数据层面进行访问控制。支持多种鉴权方式(如数据库、OpenID、LDAP、OAuth、REMOTE_USER 等)。
▌Windows 10
2021年10月08日更新
最近在家搭建了以window10为系统的NAS,并通过 win10 的 WLS2 部署了docker, 这里以win10的wls2环境下安装superset,并挂住了superset_config.py
,我这里主要新增了slack和email的推送功能。
▌1. 拉取项目
打开CMD后输入命令拉取项目
git clone https://github.com/apache/superset.git
▌2. 进入刚下载的superset目录
cd superset
▌3. 使用docker-compose
docker-compose -f docker-compose-non-dev.yml up
▌需要修改得地方
▌(1)docker-compose-non-dev.yml
在x-superset-volumes: &superset-volumes
下面添加- ./config/:/app/pythonpath/
,主要用于加载自定义参数文件superset_config.py
,完整代码如下:
x-superset-image: &superset-image apache/superset:latest-dev
x-superset-depends-on: &superset-depends-on
- db
- redis
x-superset-volumes: &superset-volumes
# /app/pythonpath_docker will be appended to the PYTHONPATH in the final container
- ./docker:/app/docker
- superset_home:/app/superset_home
- ./config/:/app/pythonpath/
version: "3.7"
services:
redis:
image: redis:latest
container_name: superset_cache
restart: unless-stopped
volumes:
- redis:/data
db:
env_file: docker/.env-non-dev
image: postgres:10
container_name: superset_db
restart: unless-stopped
volumes:
- db_home:/var/lib/postgresql/data
superset:
env_file: docker/.env-non-dev
image: *superset-image
container_name: superset_app
command: ["/app/docker/docker-bootstrap.sh", "app-gunicorn"]
user: "root"
restart: unless-stopped
ports:
- 8088:8088
depends_on: *superset-depends-on
volumes: *superset-volumes
superset-init:
image: *superset-image
container_name: superset_init
command: ["/app/docker/docker-init.sh"]
env_file: docker/.env-non-dev
depends_on: *superset-depends-on
user: "root"
volumes: *superset-volumes
superset-worker:
image: *superset-image
container_name: superset_worker
command: ["/app/docker/docker-bootstrap.sh", "worker"]
env_file: docker/.env-non-dev
restart: unless-stopped
depends_on: *superset-depends-on
user: "root"
volumes: *superset-volumes
superset-worker-beat:
image: *superset-image
container_name: superset_worker_beat
command: ["/app/docker/docker-bootstrap.sh", "beat"]
env_file: docker/.env-non-dev
restart: unless-stopped
depends_on: *superset-depends-on
user: "root"
volumes: *superset-volumes
volumes:
superset_home:
external: false
db_home:
external: false
redis:
external: false
▌(2)superset_config.py
需要在新建一个config
的目录,然后新建superset_config.py
这个文件。
这里的坑比较多,参考了官方的alerts-reports说明一样出问题,
- 其中官方文档中的REDIS_HOST为
REDIS_HOST = "redis-superset"
,实际上是需要改为REDIS_HOST = "redis"
,要不然识别不了; - Email配置中的参数,以outlook为例,SMTP_STARTTLS需要改为True,SMTP_SSL需要为False;
- 最后的
WEBDRIVER_BASEURL_USER_FRIENDLY="http://localhost:8088"
,可以改为http://自定义地址:8088
,这里就是邮件推送之后点击图片跳转的连接,默认是跳转到"http://localhost:8088"
。
完整代码如下:
from celery.schedules import crontab
FEATURE_FLAGS = {
"ALERT_REPORTS": True
}
REDIS_HOST = "redis"
REDIS_PORT = "6379"
class CeleryConfig:
BROKER_URL = 'redis://%s:%s/0' % (REDIS_HOST, REDIS_PORT)
CELERY_IMPORTS = ('superset.sql_lab', "superset.tasks", "superset.tasks.thumbnails", )
CELERY_RESULT_BACKEND = 'redis://%s:%s/0' % (REDIS_HOST, REDIS_PORT)
CELERYD_PREFETCH_MULTIPLIER = 10
CELERY_ACKS_LATE = True
CELERY_ANNOTATIONS = {
'sql_lab.get_sql_results': {
'rate_limit': '100/s',
},
'email_reports.send': {
'rate_limit': '1/s',
'time_limit': 600,
'soft_time_limit': 600,
'ignore_result': True,
},
}
CELERYBEAT_SCHEDULE = {
'reports.scheduler': {
'task': 'reports.scheduler',
'schedule': crontab(minute='*', hour='*'),
},
'reports.prune_log': {
'task': 'reports.prune_log',
'schedule': crontab(minute=0, hour=0),
},
}
CELERY_CONFIG = CeleryConfig
#SCREENSHOT_LOCATE_WAIT = 100
#SCREENSHOT_LOAD_WAIT = 600
# Slack configuration
SLACK_API_TOKEN = "xoxb-xxxxxxxxxxxxxxxxxxxxxxxxx"
# Email configuration
SMTP_HOST = "smtp.office365.com" #change to your host
SMTP_STARTTLS = True
SMTP_SSL = False
SMTP_USER = "[email protected]"
SMTP_PORT = 587 # your port eg. 587
SMTP_PASSWORD = "xxxxxxxxxxxx"
SMTP_MAIL_FROM = "[email protected]" # 需要与SMTP_USER一样
# This is for internal use, you can keep http
WEBDRIVER_BASEURL="http://superset:8088"
# This is the link sent to the recipient, change to your domain eg. https://superset.mydomain.com
WEBDRIVER_BASEURL_USER_FRIENDLY="http://localhost:8088"
▌Ubuntu
下面操作均在ubuntu18下完成。
▌1. 拉取项目
// 创建目录用于存放项目
mkdir -p /root/superset
cd /root/superset
git clone https://github.com/amancevice/superset.git
▌2. 配置数据库
进入项目目录
cd /root/superset/superset
新建superset_config.py
文件, 修改相应的配置信息
ROW_LIMIT = 5000
SUPERSET_WEBSERVER_PORT = 8088
SECRET_KEY = 'set_your_own_key'
SQLALCHEMY_DATABASE_URI = 'mysql://user:pass@host:port/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 = ''
▌3. 启动容器
docker run -d --name superset_name --env SECRET_KEY="set_your_own_key" --env SQLALCHEMY_DATABASE_URI="mysql://user:pass@host:port/db" -p 8088:8088 -v /root/superset/superset/superset_config.py amancevice/superset
注意:
- -v 挂载配置文件必须挂载到容器的/root/superset/superset/superset_config.py或者自定义目录
- SECRET_KEY必须与superset_config.py的设置一致
- 填写你自己数据库连接信息
▌4. 初始化容器
//进入superset-init文件目录
cd /mnt/superset/superset/superset
//初始化
docker exec -it superset_name superset-init
//输入你设置登录superset前端的admin相关信息
Username [admin]: admin
User first name [admin]: bing
User last name [user]: bing
password: mypassword
repeat passwd: mypassword
//输入完毕开始初始化,等待完成即可
▌5. 前端访问
http://ip:8088/