如何在Ubuntu 20.04部署Apache Superset

Apache Superset 是一个开源数据可视化软件,能够处理 PB 级大数据。该应用程序最初是 Maxime Beauchemin(Apache Airflow的创建者)在 Airbnb 工作时的一个 hack-a-thon 项目,并于 2017 年进入 Apache 孵化器计划。除了 Airbnb,该项目还得到了其他领先科技公司的重大贡献,包括 Lyft 和 Dropbox。 2021年Superset 从孵化器项目毕业,成为 Apache 软件基金会的顶级项目。——维基百科

Apache Superset 看板

Superset提供:

  • 用于快速构建图表的无代码界面
  • 强大的、基于 Web 的 SQL 编辑器,可用于高级查询
  • 用于快速定义自定义维度和指标的轻量级语义层
  • 对几乎所有 SQL 数据库或数据引擎的开箱即用支持
  • 各种漂亮的可视化展示您的数据,从简单的条形图到地理空间可视化
  • 轻量级、可配置的缓存层,有助于减轻数据库负载
  • 高度可扩展的安全角色和身份验证选项
  • 用于程序化定制的 API
  • 从头开始设计的云原生架构以实现规模化

安装依赖

使用以下命令安装依赖:

1
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev python3-pip libsasl2-dev libldap2-dev default-libmysqlclient-dev postgresql postgresql-contrib nginx

创建PostgreSQL数据库和数据库用户

本教程使用PostgreSQL数据库作为Superset的数据库,安装完成后需要进行以下配置。

  • 通过以下命令登录到PostgreSQL数据库:

    1
    sudo -u postgres psql
  • 创建Superset数据库

    1
    CREATE DATABASE superset_db;
  • 创建数据库用户

    1
    CREATE USER superset_user WITH PASSWORD 'password';
  • 修改数据库链接参数

    1
    2
    3
    ALTER ROLE superset_user SET client_encoding TO 'utf8';
    ALTER ROLE superset_user SET default_transaction_isolation TO 'read committed';
    ALTER ROLE superset_user SET timezone TO 'UTC';
  • superset_user访问管理superset数据库

    1
    GRANT ALL PRIVILEGES ON DATABASE superset_db TO superset_user;
  • 配置完成后使用以下命令退出PostgreSQL交互界面

    1
    \q

为您Superset创建 Python 虚拟环境

  • 更新pip和安装必要的包

    1
    2
    sudo pip install --upgrade pip
    sudo pip install virtualenv
  • 创建虚拟环境

    1
    virtualenv superset
  • 激活虚拟环境

    1
    source superset/bin/activate
  • 安装Superset

    1
    pip install apache-superset
  • 安装其他python依赖

    1
    pip install gunicorn gevent Pillow pymssql pymysql

配置Superset

  • superset/bin目录创建Superset配置文件superset_config.py,详细配置可参考官方文档这里

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    # Superset specific config
    ROW_LIMIT = 5000

    #SUPERSET_WEBSERVER_PORT = 8088

    # Flask App Builder configuration
    # Your App secret key will be used for securely signing the session cookie
    # and encrypting sensitive information on the database
    # Make sure you are changing this key for your deployment with a strong key.
    # You can generate a strong key using `openssl rand -base64 42`

    '''
    使用命令“openssl rand -base64 42”创建SECRET_KEY填写到下面'''
    SECRET_KEY = ''

    # 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
    '''
    数据库连接,我是用的是PostgreSQL数据库链接字符串:postgresql://<数据库用户>:<密码>@<主机名ip>/<数据库名>
    如果使用的是Mysql数据库连接字符串:mysql+pymysql://<数据库用户>:<密码>@<主机名ip>:<端口号>/<数据库名>'''
    SQLALCHEMY_DATABASE_URI = 'postgresql://superset_user:[email protected]/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 = ''

    COMPRESS_REGISTER = False

    #默认中文
    BABEL_DEFAULT_LOCALE = "zh"
    #superset支持的语言
    LANGUAGES = {
    "en": {"flag": "us", "name": "English"},
    "es": {"flag": "es", "name": "Spanish"},
    "it": {"flag": "it", "name": "Italian"},
    "fr": {"flag": "fr", "name": "French"},
    "zh": {"flag": "cn", "name": "Chinese"},
    "ja": {"flag": "jp", "name": "Japanese"},
    "de": {"flag": "de", "name": "German"},
    "pt": {"flag": "pt", "name": "Portuguese"},
    "pt_BR": {"flag": "br", "name": "Brazilian Portuguese"},
    "ru": {"flag": "ru", "name": "Russian"},
    "ko": {"flag": "kr", "name": "Korean"},
    "sk": {"flag": "sk", "name": "Slovak"},
    "sl": {"flag": "si", "name": "Slovenian"},
    "nl": {"flag": "nl", "name": "Dutch"},
    }

    SHOW_STACKTRACE = False

    DEBUG = False

    APP_NAME = "Superset"
  • 通过运行以下命令完成初始化Superset

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    export FLASK_APP=superset
    # 初始化数据库
    superset db upgrade

    # 在您的元数据数据库中创建一个管理员用户(使用 `admin` 作为用户名以便能够加载示例)
    superset fab create-admin

    # 加载演示数据
    superset load_examples

    # 创建默认角色和权限
    superset init
  • 创建/etc/systemd/system/superset.service服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Unit]
    Description=superset daemon
    After=network.target

    [Service]
    User=superset
    Group=superset
    WorkingDirectory=/home/superset/superset/
    ExecStart=/home/superset/superset/bin/gunicorn -w 2 -k gevent --worker-connections 1000 --timeout 120 -b localhost:6666 --limit-request-line 0 --limit-request-field_size 0 --statsd-host localhost:8125 "superset.app:create_app()"

    [Install]
    WantedBy=multi-user.target
  • 服务创建完成后需要执行以下命令

    1
    sudo systemctl daemon-reload
  • 启动Superset服务

    1
    sudo systemctl start superset

服务启动后会监听本地的6666端口。

配置Nginx

  • 下面的是我的配置文件,需根据自己的实际情况修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    upstream superset {
    server 127.0.0.1:6666;
    }

    server {
    listen 80;
    listen [::]:80;
    server_name _;
    return 301 https://$server_name$request_uri;
    }

    server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name _;

    ssl_certificate /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/private.key;


    location / {
    proxy_pass http://superset;
    }

    }
  • 配置完成后reload一下Nginx

    1
    sudo systemctl reload nginx

运行效果

登陆界面右上角可以选择语言,输入之前创建的管理员用户名密码

登陆界面

演示数据包含以下已经做好的看板

演示看板

看板效果

看板效果

踩坑

  1. 初始化执行superset db upgrade 时报错:ImportError: cannot import name 'soft_unicode' from 'markupsafe' in...

  2. 优化汉化问题,修改site-packages/superset/translations/zh/LC_MESSAGES/目录下的po文件,修改后进入site-packages/superset目录执行命令:pybabel compile -d translations重新编译。

使用其他数据库的解决方案

感谢rust提供的使用Mysql数据库解决方案:

  1. 安装pymysql:pip install pymysql;
  2. 修改配置文件superset_config.py数据库的连接字符串SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://<数据库用户>:<密码>@<主机名ip>:<端口号>/<数据库名>';
  3. 修改配置文件superset_config.py添加一行SQLALCHEMY_TRACK_MODIFICATIONS = False;
作者

Junle

发布于

2022-05-25

更新于

2024-04-01

许可协议

评论