Pycharm 调试 superset 源码配置(远程调试)

环境准备

centos7

python 3.8

anaconda

pycharm

我本地电脑是 windows 的,但是 superset 项目在 windows 下调试会出现很多问题,我就安装了一个虚拟机,通过 Pycharm 远程连接虚拟机进行调试,不知道如何配置 Pycharm 远程连接虚拟机的可以查看我这篇文章:
https://blog.csdn.net/qq_42586468/article/details/117561676

安装依赖

  1. 拉取官方代码

https://github.com/apache/superset.git 使用 2.1 版本分支

  1. 创建虚拟环境,这里使用 conda 创建的虚拟环境
  2. 执行安装命令,进入项目根目录执行(注意当前命令行是否已经激活虚拟环境)
shell 复制代码
# 需要执行下边命令
 yum install mysql-devel gcc gcc-c++ libffi-devel python3-devel python3-pip python3-wheel openssl-devel cyrus-sasl-devel openldap-devel

pip install --no-cache -r requirements/local.txt -i https://pypi.mirrors.ustc.edu.cn/simple/

修改配置文件

在项目根目录下创建配置文件: superset_config.py,该配置文件中的内容,会覆盖 superset/superset/config.py中的配置。

一般不会直接修改 config.py 文件,而是通过覆盖的方式去修改需要修改的配置内容,下边的配置修改了数据库连接信息,。

该信息从环境变量中获取,后边在配置Pycharm的时候,会说明 pycharm 的环境变量与启动配置(如果嫌配置环境变量麻烦,可以直接在配置文件中写硬编码写上数据库连接信息)。

python 复制代码
#! /usr/bin/env python
# -*- coding:utf-8 -*-


DATABASE_HOST = os.environ["DATABASE_HOST"]
DATABASE_PORT = os.environ.get("DATABASE_PORT", 3306)
DATABASE_USER = os.environ.get("DATABASE_USER", "test")
DATABASE_PASSWORD = os.environ["DATABASE_PASSWORD"]
DATABASE_NAME = os.environ["DATABASE_NAME"]

REDIS_HOST = os.environ["REDIS_HOST"]
REDIS_PORT = os.environ["REDIS_PORT"]
REDIS_PASS = os.environ["REDIS_PASS"]
REDIS_CELERY_DB = 0
REDIS_RESULTS_DB = 1
REDIS_CACHE_DB = 2
REDIS_DATA_CACHE_DB = 3

DATA_CACHE_CONFIG = {
    'CACHE_TYPE': 'redis',
    'CACHE_DEFAULT_TIMEOUT': 60 * 30,  # 1 day default (in secs)
    'CACHE_KEY_PREFIX': 'superset_data_cache',
    'CACHE_REDIS_URL': f"redis://:{REDIS_PASS}@{REDIS_HOST}:{REDIS_PORT}/{REDIS_DATA_CACHE_DB}"
}

SQLALCHEMY_DATABASE_URI = 'mysql://{}:{}@{}:{}/{}?charset=utf8'.format(DATABASE_USER,

配置 Pycharm 启动 web 后端

注意:在配置 Pycharm 启动前,我们需要先根据上边的配置在对应数据库连接中创建对应的 db,否则下边启动会报数据库错误。
执行 Superset 命令

第一次启动superset 需要执行几步初始化命令,在Pycharm 远程终端依次执行以下命令:

激活环境变量

执行初始化命令

  • superset db upgrade
  • superset fab create-admin
  • superset init
  • superset load-examples

执行这一步会报错,说找不到 example 目录下的文件,需要修改下 superset/superset/examples/helpers.py下的一行代码,如下图,修改为正确的路径即可:

可以在执行完 load_example 命令后修改回去,感觉像是 superset 的一个 bug.

load_example 的逻辑就是拉取 github 上 superset 官方的样例数据,写到我们自己的库里边,需要能够访问 github, 在加载的时候如果网络不好,可能会出现连接断开的情况,这个加载比较耗时,建议把加载完的样例代码注释掉(代码在 superset/superset/examples/helpers.py`load_example_run 函数中),当断开我们重新load 时,不需要再加载前边已经加载过的了:

如果网不好可以参考这篇文章,将数据下下来,然后从本地的 http url 加载:
https://blog.csdn.net/weixin_42225123/article/details/116458048

启动web 后端

superset 的后端使用的是 flask,对应的 app 在 superset/superset/app.py下边,我们需要创建一个调试用的 run.py引用 app:

run.py 文件内容如下:

python 复制代码
from superset import create_app

if __name__ == '__main__':
    app = create_app()
    app.run(host="0.0.0.0", port=8080, debug=True)

然后配置 run.py 的启动配置,需要配置环境变量:

后端启动成功后如下:

启动 web 前端

确保 centos7 已经安装了 nodejs

shell 复制代码
cd superset-frontend
npm install -g cnpm --registry=https://registry.npmmirror.com
npm config set registry https://registry.npmmirror.com
npm config get registry

npm config set puppeteer_download_host=https://npm.taobao.org/mirrors
cnpm i puppeteer
export PUPPETEER_SKIP_DOWNLOAD='true'

npm ci
# 如果不需要调试前端代码,我们直接执行 build 就行了,无需执行 run dev
npm run build

前后端启动都启动成功后,可以访问 后端服务IP:8088查看superset web 界面:

这里的用户名和密码就是前边初始化的 admin, 登录进去后数据加载会有点慢,需要等一会儿,才能把example 数据加载出来.

总结

superset 的源码调试方式还是比较简单的,容易出问题的步骤应该就是环境安装了,最好是有 vpn,前后端都启动成功后,我们只需要在 Pycharm 中打断点就可以调试了。

superset 的目录结构还是比较清晰的,我们需要调试哪个模块到对应的目录下去找到对应的视图函数就行了。

后边会总结下superset 前端功能模块对应后端代码位置,以及源码说明,使用第三方登录验证 superset 源码改造等。