克隆仓库
首先,在 GitHub 上分叉存储库,然后克隆它。
git clone https://github.com/apache/superset.git
cd superset
方式一:docker-compose 启动
docker compose up
这将拉取/构建 docker 映像并运行服务集群,并将本地代码挂在到容器中,所以在本地的代码修改都会被映射到容器中,使容器更新。
注意:使用docker-compose启动的superset服务并不能立马访问,访问8088端口时会出现空白页,这是因为第一次启动会执行一次前端资源的构建,由于前端资源还没有构建完成导致的,等个大概十来分钟再访问试试。构建非常慢,甚至卡住了?建议查看一下内存,确保在10G以上,因为superset前端使用的是webpack构建的,所以在build时非常消耗内存。
方式二:本地部署
后端 Flask Server
首先确保你的python版本是3.9、3.10或3.11,然后执行:
#安装一些必要的依赖,不然在执行下面命令pip install -r requirements/development.txt时会失败。
apt-get update -qq && apt-get install -yqq --no-install-recommends \
curl \
default-libmysqlclient-dev \
libsasl2-dev \
libsasl2-modules-gssapi-mit \
libpq-dev \
libecpg-dev \
libldap2-dev
apt-get install python3-dev build-essential pkg-config
# 创建一个虚拟环境并激活
cd superset
python3 -m venv venv
source venv/bin/activate
# 安装外部依赖
pip install -r requirements/development.txt
# 以可编辑(开发)模式安装 Superset
pip install -e .
#生成一个密匙,并加入到环境变量
echo export SUPERSET_SECRET_KEY=`(openssl rand -base64 42)` > \
/etc/profile.d/superset_secret_key.sh
source /etc/profile
# 初始化数据库
superset db upgrade
# 创建管理员用户
superset fab create-admin
# 创建默认角色和权限
superset init
# 加载案例数据 ,在此之前必须创建管理员用户
superset load-examples
# 从虚拟环境内部启动 Flask 开发 Web 服务器。
superset run -p 8088 --with-threads --reload --debugger --debug
或者使用Makefile安装
# Create a virtual environment and activate it (recommended)
python3 -m venv venv # setup a python3 virtualenv
source venv/bin/activate
# install pip packages + pre-commit
make install
# Install superset pip packages and setup env only
make superset
前端 superset-frontend
环境准备
首先,确认 Node.js 和 npm的版本
Node.js: Version 18
npm: Version 10
建议使用 nvm 管理节点环境。使用nvm安装nvm与node:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.0/install.sh | bash
#如果使用nvm命令出现 '-bash: nvm: command not found',请执行下面的命令或打开一个新的shell
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
cd superset-frontend
nvm install
nvm use
安装依赖模块
# 进入到superset-frontend目录
cd superset-frontend
# 安装来自 `package-lock.json`的依赖
npm ci
在执行npm run build构建前端资源时会消耗很大的内存,如果使用的是虚拟机的话建议将内存调高点,不然会一直卡住。
#构建前端资源
npm run build
#构建成功后启动前端
npm run dev-server
浏览器访问
http://localhost:9000
FAQ
为什么使用docker compose启动登录后是一个空白页面,并且容器出现错误信息?
Superset_app报错:
2023-08-31 08:26:20,442:INFO:werkzeug:192.168.0.1 - - [31/Aug/2023 08:26:20] "GET /static/appbuilder/datepicker/bootstrap-datepicker.js HTTP/1.1" 200 -
2023-08-31 08:26:20,443:WARNING:superset.views.base:HTTPException
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1823, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1799, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 713, in <lambda>
view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950
File "/usr/local/lib/python3.9/site-packages/flask/scaffold.py", line 331, in send_static_file
return send_from_directory(
File "/usr/local/lib/python3.9/site-packages/flask/helpers.py", line 590, in send_from_directory
return werkzeug.utils.send_from_directory( # type: ignore[return-value]
File "/usr/local/lib/python3.9/site-packages/werkzeug/utils.py", line 578, in send_from_directory
raise NotFound()
werkzeug.exceptions.NotFound: 404 Not Found: The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
2023-08-31 08:26:20,457:INFO:werkzeug:192.168.0.1 - - [31/Aug/2023 08:26:20] "GET /static/appbuilder/js/ab.js HTTP/1.1" 200 -
2023-08-31 08:26:20,458:INFO:werkzeug:192.168.0.1 - - [31/Aug/2023 08:26:20] "GET /static/appbuilder/select2/select2.js HTTP/1.1" 200 -
2023-08-31 08:26:20,473:INFO:werkzeug:192.168.0.1 - - [31/Aug/2023 08:26:20] "GET /static/assets/images/superset-logo-horiz.png HTTP/1.1" 404 -
Superset_node (Exit status 251):
npm ERR! code EIO
npm ERR! syscall rename
npm ERR! path /app/superset-frontend/node_modules/sha.js
npm ERR! dest /app/superset-frontend/node_modules/.sha.js-sPyHcmzN
npm ERR! errno -5
npm ERR! EIO: i/o error, rename '/app/superset-frontend/node_modules/sha.js' -> '/app/superset-frontend/node_modules/.sha.js-sPyHcmzN'
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2023-08-31T08_25_51_287Z-debug-0.log
- superset_app的报错指的是找不到静态资源,一般这种原因是构建静态资源失败导致的。
- superset_node的报错指的是该目录下已经有这个文件了,将会被重命名为.sha.js-sPyHcmzN
如何解决?
其实最主要的问题还是出现在npm,npm在安装依赖是发现已经有这个文件,文件冲突了,导致前端的资源构建失败,出现问题1,然后登录之后返回空白的页面,。所以只需要将这些冲突的文件删掉就可以了,为了减少麻烦,在superset-frontend通过执行find . -type d -name "node_modules" -exec rm -rf {} +
与npm cache clean --force命令删除所有的node_modules模块与缓存。docker compose重新运行。
问题2
superset_init报错,并且登录页面登录不上去
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/local/bin/superset", line 8, in <module>
sys.exit(superset())
self._handle_dbapi_exception(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2134, in _handle_dbapi_exception
util.raise_(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 211, in raise_
raise exception
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1910, in _execute_context
self.dialect.do_execute(
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 736, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (psycopg2.errors.DeadlockDetected) deadlock detected
DETAIL: Process 77 waits for AccessExclusiveLock on relation 16405 of database 16384; blocked by process 79.
Process 79 waits for AccessShareLock on relation 16413 of database 16384; blocked by process 77.
HINT: See server log for query details.
[SQL: ALTER TABLE dashboard_roles DROP CONSTRAINT dashboard_roles_role_id_fkey]
(Background on this error at: https://sqlalche.me/e/14/e3q8)
sqlalchemy报错,解决这个问题也很简单,使用docker compose restart superset-init
重启一下superset_init就好了