CentOS7 + Miniconda + Superset 3.1.0 + MySQL(mysqlclient) 的实战配置全过程精要版,附带踩坑与修复要点,便于以后复用。
1) 目标与环境
-
OS:CentOS 7
-
Python:Miniconda 环境(python=3.9)
-
Superset:3.1.0(用国内 TUNA 镜像安装)
-
Metadata:MySQL(坚持用 mysqlclient,不用 PyMySQL)
-
运行方式:命令行 / Gunicorn;提供了启停脚本
2) 国内镜像
# conda
cat > ~/.condarc <<'YAML'
channels:
- conda-forge
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
YAML
conda clean -i
# pip
mkdir -p ~/.pip
cat > ~/.pip/pip.conf <<'INI'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
timeout = 120
trusted-host = pypi.tuna.tsinghua.edu.cn
INI
3) Conda 环境 & 基础依赖
conda create -n superset python=3.9 -y
conda activate superset
# 系统依赖(编译、SASL、OpenSSL等按需)
sudo yum install -y gcc gcc-c++ make libffi-devel python3-devel pkgconfig \
openssl-devel zlib-devel
4) MySQL 开发包(为 mysqlclient 做准备)
遇到过 mariadb-devel 5.5 与 MySQL 8 冲突 → 只装 MySQL 官方 8.0 的 devel,并解决 GPG key 不匹配:
# 导入 MySQL GPG keys(含 2023/2024,修复 a8d3785c)
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql || true
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022 || true
sudo curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | sudo rpm --import -
sudo curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2024 | sudo rpm --import -
sudo yum clean all
sudo yum makecache fast --enablerepo=mysql80-community
sudo yum install -y mysql-community-devel mysql-community-libs mysql-community-libs-compat
备选:
mariadb-connector-c-devel也可用于编译 mysqlclient,但不要装mariadb-devel(会拉 5.5 全家桶)。
5) 安装 Superset & 解决依赖坑
pip install --upgrade pip setuptools wheel
pip install "apache-superset==3.1.0" -i https://pypi.tuna.tsinghua.edu.cn/simple
关键坑与修复
-
apsw 编译失败(C99):CentOS7 默认 GCC 4.8 非 C99
-
方案1:
export CFLAGS="$CFLAGS -std=gnu99"再编译apsw(或在 devtoolset-8 下编译) -
方案2:如果暂时不用 Google Sheets(shillelagh),可卸载
shillelagh*/apsw
-
-
marshmallow 4.x 不兼容:Superset 3.1.0 需 3.x
pip install "marshmallow>=3.20,<4" --force-reinstall -
Pillow 告警(缩略图):
pip install pillow
6) mysqlclient 安装 & “静态 TLS block” 修复
mysqlclient 安装后,运行时出现:
cannot allocate memory in static TLS block(conda 自带 libstdc++ 与 CentOS7 冲突)。
解决:预加载系统库
export LD_PRELOAD=/usr/lib64/libstdc++.so.6:/usr/lib64/libgcc_s.so.1
export LD_LIBRARY_PATH=/usr/lib64:/lib64:$LD_LIBRARY_PATH
# 自检
python - <<'PY'
import MySQLdb, os; print("OK", os.path.realpath(MySQLdb._mysql.__file__))
PY
备选:用
conda-forge的mysqlclient libstdcxx-ng libgcc-ng,或在devtoolset-8下重编。
7) Superset 配置(MySQL + mysqlclient)
~/.superset/superset_config.py:
SQLALCHEMY_DATABASE_URI = "mysql+mysqlclient://superset:YourStrongPass@hadoop102:3306/superset?charset=utf8mb4"
SQLALCHEMY_ENGINE_OPTIONS = {"pool_pre_ping": True, "pool_recycle": 3600}
# 强制设置 SECRET_KEY(必须)
SECRET_KEY = "一长串随机字符串"
# (可选)Redis:去掉 Flask-Limiter 内存存储告警 & 启用缓存
# REDIS_URL = "redis://127.0.0.1:6379/0"
# RATELIMIT_STORAGE_URI = REDIS_URL
# CACHE_CONFIG = {"CACHE_TYPE": "RedisCache","CACHE_DEFAULT_TIMEOUT": 300,"CACHE_KEY_PREFIX": "superset_","CACHE_REDIS_URL": REDIS_URL}
# DATA_CACHE_CONFIG = CACHE_CONFIG
8) 初始化 & 启动
export SUPERSET_CONFIG_PATH=$HOME/.superset/superset_config.py
export FLASK_APP="superset.app:create_app()"
export LD_PRELOAD=/usr/lib64/libstdc++.so.6:/usr/lib64/libgcc_s.so.1
export LD_LIBRARY_PATH=/usr/lib64:/lib64:$LD_LIBRARY_PATH
# 迁移
superset db upgrade
# 创建管理员(如未创建)
superset fab create-admin
# 初始化
superset init
# 启动(开发模式)
superset run -h 0.0.0.0 -p 8088
9) 启停脚本(你已部署)
-
路径:
/home/yz/bin/superset.sh -
功能:
start|stop|restart|status|logs -
特点:自动激活 conda、预加载系统 libstdc++、优先 Gunicorn(装了
gevent就用 gevent,否则 sync) -
日志目录:
~/superset-logs/;PID:~/superset-run/superset.pid
示例:
/home/yz/bin/superset.sh start
/home/yz/bin/superset.sh status
/home/yz/bin/superset.sh logs
/home/yz/bin/superset.sh stop
若用 systemd,服务文件要包含
SUPERSET_CONFIG_PATH、FLASK_APP、LD_PRELOAD、LD_LIBRARY_PATH。
10) 最容易踩的坑(备忘)
-
mariadb-devel与 MySQL 8 冲突 → 只装mysql-community-devel -
MySQL rpm GPG key 不匹配(比如
a8d3785c)→ 导入RPM-GPG-KEY-mysql-2023/2024 -
mysqlclient编译找不到.pc→ 安装mysql-community-devel+pkgconfig -
运行时报 static TLS block →
LD_PRELOAD预加载系统libstdc++/libgcc -
SECRET_KEY未设置 → 启动直接拒绝 -
marshmallow 4.x报minLength→ 降级到<4 -
apswC99 编译错误 →CFLAGS=-std=gnu99或跳过 shillelagh -
Flask 应用未找到/环境变量脏 → 用
FLASK_APP="superset.app:create_app()"内联执行
这就是从“净环境”到“可用生产启动”的完整闭环。如果你要把 Redis 缓存 和 Gunicorn + systemd 固化,我可以直接把你机器的最终路径/账号/端口拼好一份服务单给你。
485

被折叠的 条评论
为什么被折叠?



