Superset:大数据可视化开源工具

Superset 是一款由 Airbnb 开源的“现代化的企业级 BI(商业智能) Web 应用程序”,其通过创建和分享 dashboard,为数据分析提供了轻量级的数据查询和可视化方案。
Superset 的前端主要用到了 React 和 NVD3/D3,而后端则基于 Python 的 Flask 框架和 Pandas、SQLAlchemy 等依赖库,主要提供了这几方面的功能:

  1. 集成数据查询功能,支持多种数据库,包括 MySQL、PostgresSQL、Oracle、SQL Server、SQLite、SparkSQL 等,并深度支持 Druid。
  2. 通过 NVD3/D3 预定义了多种可视化图表,满足大部分的数据展示功能。如果还有其他需求,也可以自开发更多的图表类型,或者嵌入其他的 JavaScript 图表库(如 HighCharts、ECharts)。
  3. 提供细粒度安全模型,可以在功能层面和数据层面进行访问控制。支持多种鉴权方式(如数据库、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说明一样出问题,

  1. 其中官方文档中的REDIS_HOST为REDIS_HOST = "redis-superset",实际上是需要改为REDIS_HOST = "redis",要不然识别不了;
  2. Email配置中的参数,以outlook为例,SMTP_STARTTLS需要改为True,SMTP_SSL需要为False;
  3. 最后的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

注意:

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/

参考

阅读量: | 柯西君_BingWong | 2021-10-08