Ubuntu 22.04 安装 Apache Linkis 指南
在 Ubuntu 22.04 服务器上从 0 到 1 安装 Apache Linkis 1.8.0 单机最小形态(JDK 8 + MySQL 8 后端库 + 官方安装脚本),涵盖环境准备、安装脚本执行、服务启动、网关登录 API 验证、linkis-cli 提交 shell 任务实测、systemd 托管、常见问题与卸载。
Ubuntu 22.04 安装 Apache Linkis 指南
Apache Linkis 是一个连接上层应用与底层引擎的计算中间件,通过标准的 REST/WebSocket 接口向上层应用提供任务提交、执行、监控与结果获取能力,向下通过引擎连接器对接 Shell、Python、Spark、Hive 等计算引擎。本文在单台 Ubuntu 22.04 服务器上完成 Linkis 1.8.0 单机最小形态(MySQL 存储后端、本地文件系统、不依赖 Hadoop 生态)的从 0 到 1 安装,并完成登录 API 与 CLI 任务提交的实测验证。
说明:本文所有示例账号密码均为演示环境专用的示例值——MySQL root 密码与 Linkis 管理员密码统一使用
q1w2e3r4,生产环境必须替换为强密码。
一、版本规划与环境要求
1.1 实测版本矩阵
| 组件 | 实测版本 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS | PRETTY_NAME="Ubuntu 22.04.5 LTS" |
| Apache Linkis | 1.8.0 | 官方 binary 包 apache-linkis-1.8.0-bin.tar.gz |
| JDK | OpenJDK 1.8.0_504 | Linkis 1.x 要求 JDK 8,官方安装脚本强制检查 JDK 8 |
| MySQL | 8.0.46(Ubuntu 软件源版本) | 存储 Linkis 元数据 |
| MySQL JDBC 驱动 | mysql-connector-j-8.0.33 | 官方包不含 JDBC 驱动,需单独下载 |
1.2 硬件与端口要求
单机最小形态实测内存占用:6 个 Linkis Java 进程合计约 2.5~3 GB RSS,加上 MySQL 约 0.4 GB,建议服务器至少 4 GB 内存(2 GB 内存需要按下文 JVM 参数裁剪后才可运行)。磁盘需预留:安装包约 684 MB、解压后约 1.5 GB、部署目录约 1.5 GB。
实测监听端口清单:
| 端口 | 服务 | 说明 |
|---|---|---|
| 20303 | linkis-mg-eureka | 注册中心 |
| 9001 | linkis-mg-gateway | 网关(所有 REST 请求入口) |
| 9101 | linkis-cg-linkismanager | 计算治理管理服务 |
| 9102 | linkis-cg-engineconnmanager | 引擎管理服务(ECM) |
| 9104 | linkis-cg-entrance | 任务入口服务 |
| 9105 | linkis-ps-publicservice | 公共服务(jobhistory/BML/文件系统等) |
| 3306 | mysqld | MySQL 元数据库 |
1.3 JDK 版本兼容说明
Linkis 1.x 全系列要求 JDK 8,官方安装脚本(bin/checkEnv.sh)会显式校验 JDK 版本,JDK 11/17 无法通过校验。Ubuntu 22.04 软件源中的 openjdk-8-jdk 即可满足要求。
二、安装 JDK 与 MySQL
2.1 安装 JDK 8 与基础工具
sudo apt-get update
sudo apt-get install -y openjdk-8-jdk mysql-server wget curl net-tools lsof telnet
安装完成后校验 JDK 版本:
java -version
实测回显:
openjdk version "1.8.0_504"
OpenJDK Runtime Environment (build 1.8.0_504-8u504-ga-1ubuntu1~22.04.3-b01)
OpenJDK 64-Bit Server VM (build 25.504-b01, mixed mode)
2.2 初始化 MySQL
为 root 账号设置密码(示例密码 q1w2e3r4):
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'q1w2e3r4'; FLUSH PRIVILEGES;"
mysql_native_password 认证插件是 Linkis JDBC 连接的兼容要求(MySQL 8 默认的 caching_sha2_password 在部分驱动组合下存在兼容问题)。校验:
mysql -h127.0.0.1 -uroot -pq1w2e3r4 -N -e "select version()"
实测回显:
8.0.46
Linkis 库(
linkis)与全部表结构由安装脚本自动导入,无需手工建库。若服务器启用了skip_name_resolve,还需要为'root'@'127.0.0.1'单独授权,详见 9.6 节。
2.3 创建部署用户
Linkis 官方安装脚本要求以专用普通用户部署(引擎进程切换执行用户时需要 sudo 权限)。本文创建 hadoop 用户并配置免密 sudo:
sudo useradd -m -s /bin/bash hadoop
echo "hadoop ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/hadoop
sudo chmod 440 /etc/sudoers.d/hadoop
2.4 Ubuntu 系统适配(必做)
官方安装脚本按 CentOS 生态编写,在 Ubuntu 上需要完成以下四项适配,否则安装必然失败:
- 将
/bin/sh从 dash 切换为 bash(安装脚本使用 bash 特有语法):
sudo dpkg-reconfigure dash
在交互界面选择 No。校验:ls -l /bin/sh 应显示 -> bash。
- 为部署用户创建
.bash_profile(脚本会 source 该文件,缺失时部分环境变量不生效):
sudo -u hadoop touch /home/hadoop/.bash_profile
- 安装
python命令(checkEnv.sh 校验python命令,Ubuntu 默认只有python3):
sudo apt-get install -y python-is-python3
- 注释 checkEnv.sh 中的 yum 检查(Ubuntu 无 yum):
sed -i 's/^need_cmd yum$/# need_cmd yum # Ubuntu has no yum/' /opt/download/apache-linkis-1.8.0-bin/bin/checkEnv.sh
(路径以 3.1 节解压位置为准,也可以在解压后再执行该步骤。)
三、下载与解压安装包
3.1 下载 binary 包
从 Apache 官方镜像下载 1.8.0 binary 包(约 684 MB):
sudo mkdir -p /opt/download
cd /opt/download
sudo wget https://mirrors.tuna.tsinghua.edu.cn/apache/linkis/1.8.0/apache-linkis-1.8.0-bin.tar.gz
下载后校验 SHA512(官方 sha512 文件位于同目录 apache-linkis-1.8.0-bin.tar.gz.sha512):
sha512sum apache-linkis-1.8.0-bin.tar.gz
实测回显:
6b12d8388ad6cc1513d03704f8a105ec0e22d7272c9b6f89d41a5efdf01733f4079ff5f9c4450538c70e2a1431e47ec45b6971d5365105b7620ac19f3228e32c apache-linkis-1.8.0-bin.tar.gz
与官方 .sha512 文件一致。
3.2 解压
注意:该包没有顶层目录,必须先建目录再解压:
cd /opt/download
mkdir -p apache-linkis-1.8.0-bin
tar -xzf apache-linkis-1.8.0-bin.tar.gz -C apache-linkis-1.8.0-bin
解压后目录结构:
apache-linkis-1.8.0-bin/
├── bin/ # install.sh 等安装脚本
├── db/ # linkis_ddl.sql / linkis_dml.sql
├── deploy-config/ # db.sh / linkis-env.sh 部署配置模板
├── helm/ # 官方 Helm Charts
├── licenses/
├── linkis-package/ # Linkis 程序包主体
├── LICENSE
├── NOTICE
└── README.md
3.3 下载 MySQL JDBC 驱动
官方包不携带 JDBC 驱动,需手动下载并放置到两个位置(缺一不可,原因见 9.3 节):
cd /opt/download
wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
其中一份在安装完成后再拷入部署目录(见 5.2 节),另一份放入扩展库目录:
sudo mkdir -p /appcom/common/linkisExtendedLib
sudo cp /opt/download/mysql-connector-j-8.0.33.jar /appcom/common/linkisExtendedLib/
sudo chown -R hadoop:hadoop /appcom
四、部署配置
4.1 配置 db.sh
编辑 /opt/download/apache-linkis-1.8.0-bin/deploy-config/db.sh,填入第 2.2 节的数据库信息(示例密码 q1w2e3r4):
### Used to store user custom variables, user configuration, UDFs and functions, while providing JobHistory service
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_DB=linkis
MYSQL_USER=root
MYSQL_PASSWORD=q1w2e3r4
4.2 配置 linkis-env.sh 关键项
编辑 /opt/download/apache-linkis-1.8.0-bin/deploy-config/linkis-env.sh,按单机最小形态修改以下内容:
# 部署用户与密码(密码即 Linkis 管理员账号 hadoop 的登录密码,示例值)
deployUser=hadoop
deployPwd=q1w2e3r4
# 部署目录
LINKIS_HOME=/appcom/Install/LinkisInstall
# 各服务 JVM 堆大小(4 GB 内存的低配环境取 192M~256M,生产建议 512M~1G)
export SERVER_HEAP_SIZE="192M"
EUREKA_HEAP_SIZE="128M"
# 本地文件系统模式:关闭 Hadoop 生态依赖
export ENABLE_HDFS=false
export ENABLE_HIVE=false
export ENABLE_SPARK=false
# 结果集/工作目录指向本地文件系统
RESULT_SET_ROOT_PATH=file:///tmp/linkis
HDFS_USER_ROOT_PATH=file:///tmp/linkis
WORKSPACE_USER_ROOT_PATH=file:///tmp/linkis/
# 扩展库目录(网关加载 JDBC 驱动依赖它)
LINKIS_EXTENDED_LIB=/appcom/common/linkisExtendedLib
说明:
deployPwd用于安装脚本初始化 Linkis 管理员账号的密码,管理员用户名固定为hadoop(由wds.linkis.governance.station.admin控制,见《Apache Linkis 配置参数详解》)。ENABLE_HDFS/HIVE/SPARK=false时 Linkis 不再校验 Hadoop/Hive/Spark 安装路径,纯本地形态即可运行 Shell、Python 引擎。
五、执行安装脚本
5.1 运行 install.sh
cd /opt/download/apache-linkis-1.8.0-bin
sudo -u hadoop bash bin/install.sh
脚本会先执行环境检查(JDK 版本、python、yum 等),随后打印数据库操作确认信息并等待选择:
Linkis mysql DB will use this config: 127.0.0.1:3306/linkis
Do you want to clear Linkis table information in the database?
1: Do not execute table-building statements
2: Dangerous! Clear all data and rebuild the tables
other: exit
[Please input your choice]:
首次安装输入 2(清空并重建全部表)。脚本随后自动完成:创建 linkis 数据库 → 导入 linkis_ddl.sql(60+ 张表)→ 导入 linkis_dml.sql(初始化管理员、引擎标签、全局配置、网关 token 等种子数据)→ 将 linkis-package/ 部署到 LINKIS_HOME 并按配置渲染各服务配置文件。全部成功后各步骤会输出 source linkis_ddl.sql ... succeed 样式的成功提示。
若 2.4 节任一适配缺失,脚本会在 checkEnv 阶段报
CMD0000类错误退出,按提示补齐后重跑即可。
5.2 补放 JDBC 驱动与权限修正
安装完成后将驱动放入公共模块目录,并修正部署目录属主:
cp /opt/download/mysql-connector-j-8.0.33.jar /appcom/Install/LinkisInstall/lib/linkis-commons/public-module/
chown -R hadoop:hadoop /appcom/Install/LinkisInstall
mkdir -p /tmp/linkis && chown -R hadoop:hadoop /tmp/linkis
chown -R hadoop 必须执行:引擎插件目录若为 root 属主,LinkisManager 启动时会因读取 spark/dist/3.2.1/conf.zip 等资源失败而退出。
5.3 配置 JAVA_HOME
引擎进程由 ECM 派生,派生时继承 ECM 的环境变量,因此 JAVA_HOME 必须写入系统级与部署用户两处:
echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' | sudo tee /etc/profile.d/java.sh
echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' | sudo tee -a /home/hadoop/.bash_profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /home/hadoop/.bash_profile
六、启动服务并验证
6.1 一键启动
以部署用户执行官方启动脚本:
sudo su - hadoop
sh /appcom/Install/LinkisInstall/sbin/linkis-start-all.sh
脚本按 mg-eureka → mg-gateway → ps-publicservice → cg-linkismanager → cg-entrance → cg-engineconnmanager 顺序拉起,每个服务输出形如:
Start to check whether the mg-eureka is running
server linkis-mg-eureka start succeeded!
六个服务全部成功后输出:
Apache Linkis started successfully
启动脚本内部对 cg-linkismanager 会等待较长时间(该服务要向 BML 上传引擎插件资源)。若内存有限,建议按 9.7 节方式逐个启动,避免 6 个 JVM 同时初始化触发内存峰值。
6.2 检查服务状态与端口
sh /appcom/Install/LinkisInstall/sbin/linkis-daemon.sh status cg-linkismanager
实测回显:
22717
server cg-linkismanager is running.
确认全部端口监听:
ss -tlnp | grep java
应看到 20303、9001、9101、9102、9104、9105 全部处于 LISTEN 状态。
6.3 验证网关登录 API
通过网关(9001)调用登录接口验证全链路(账号为管理员 hadoop,示例密码):
curl -s -X POST -H "Content-Type: application/json" \
-d '{"userName":"hadoop","password":"q1w2e3r4"}' \
http://127.0.0.1:9001/api/rest_j/v1/user/login
实测回显:
{"method":null,"status":0,"message":"login successful(登录成功)!","data":{"enableWatermark":true,"isAdmin":true,"sessionTimeOut":3600000,"userName":"hadoop"}}
status: 0 即认证链路(gateway → publicservice → MySQL)全部正常。
6.4 验证 token 认证
Linkis 内置服务间 token(wds.linkis.bml.auth.token.value,安装后写入 conf/linkis.properties)可直接用于 REST 调用:
TOKEN=$(grep "wds.linkis.bml.auth.token.value" /appcom/Install/LinkisInstall/conf/linkis.properties | cut -d= -f2)
curl -s -H "Token-Code: $TOKEN" -H "Token-User: hadoop" \
"http://127.0.0.1:9001/api/rest_j/v1/jobhistory/tasks?pageSize=1&pageNow=1"
返回 {"method":...,"status":0,...} 说明 token 认证与任务历史查询正常。
七、linkis-cli 提交任务实测
7.1 提交 shell 任务
以部署用户执行(-labelMap engineType=shell-1 指定 shell 引擎版本,缺省时任务会被拒绝):
sudo su - hadoop
sh /appcom/Install/LinkisInstall/bin/linkis-cli \
-codeType shell -labelMap engineType=shell-1 \
-code "echo hello"
实测完整回显(节选关键过程,完整日志同时写入 logs/linkis-cli/):
[INFO] LogFile path: /appcom/Install/LinkisInstall/logs/linkis-cli/linkis-client.hadoop.log.20261011183623754874158
[INFO] User does not provide usr-configuration file. Will use default config
[INFO] user does not specify submit-user, will use current Linux user "hadoop" by default.
[INFO] user does not specify proxy-user, will use current submit-user "hadoop" by default.
[INFO] connecting to linkis gateway:http://127.0.0.1:9001
JobId:13
TaskId:13
ExecId:exec_id018015linkis-cg-entrancelinkis-u22:9104LINKISCLI_hadoop_shell_0
[INFO] Job is successfully submitted!
2026-10-11 18:36:28.036 INFO Program is substituting variables for you
2026-10-11 18:36:28.036 INFO Variables substitution ended successfully
2026-10-11 18:36:28.036 INFO You have submitted a new job, script code (after variable substitution) is
************************************SCRIPT CODE************************************
echo hello
************************************SCRIPT CODE************************************
2026-10-11 18:36:28.036 WARN The code you submit will not be limited by the limit
2026-10-11 18:36:28.036 INFO Job with jobId : 13 and execID : LINKISCLI_hadoop_shell_0 submitted
2026-10-11 18:36:29.036 INFO Your job is accepted, jobID is LINKISCLI_hadoop_shell_0 and jobReqId is 13 in ServiceInstance(linkis-cg-entrance, linkis-u22:9104, 0).
2026-10-11 18:36:29.036 INFO Your job is being scheduled by orchestrator.
2026-10-11 18:36:29.036 INFO Your job is Running now. Please wait it to complete.
2026-10-11 18:36:29.036 INFO Background is starting a new engine for you, execId TaskID_13_otJobId_astJob_0_codeExec_0 mark id is mark_0
[INFO] Job execute successfully! Will try get execute result
============Result:================
TaskId:13
ExecId: exec_id018015linkis-cg-entrancelinkis-u22:9104LINKISCLI_hadoop_shell_0
User:hadoop
Current job status:SUCCEED
extraMsg:
result:
[INFO] Retrieving result-set, may take time if result-set is large, please do not exit program.
============ RESULT SET 1 ============
hello
############Execute Success!!!########
首跑需要拉起 shell 引擎进程(EngineConn),耗时约 20 秒;成功后任务状态 SUCCEED,结果集为脚本 stdout 的 hello。
7.2 通过 jobhistory API 复核
TOKEN=$(grep "wds.linkis.bml.auth.token.value" /appcom/Install/LinkisInstall/conf/linkis.properties | cut -d= -f2)
curl -s -H "Token-Code: $TOKEN" -H "Token-User: hadoop" \
"http://127.0.0.1:9001/api/rest_j/v1/jobhistory/13/get"
关键字段实测值:
"taskID": 13, "status": "Succeed", "progress": 1.0,
"resultLocation": "file:///tmp/linkis/result/2026-10-11/LINKISCLI/hadoop/13"
结果集落盘为 <resultLocation>/1_0.dolphin(dolphin 格式),cat 该文件内容为 hello。
八、systemd 托管服务
将 6 个服务交由 systemd 管理,实现开机自启与故障拉起。示例为网关单元,其余服务按 服务名 + 端口 平行替换:
/etc/systemd/system/linkis-mg-gateway.service:
[Unit]
Description=Apache Linkis mg-gateway
After=network.target mysql.service
[Service]
Type=forking
User=hadoop
Group=hadoop
Environment=JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
Environment=LINKIS_CONF_DIR=/appcom/Install/LinkisInstall/conf
ExecStart=/bin/sh /appcom/Install/LinkisInstall/sbin/linkis-daemon.sh start mg-gateway
ExecStop=/bin/sh /appcom/Install/LinkisInstall/sbin/linkis-daemon.sh stop mg-gateway
Restart=on-failure
RestartSec=30
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
注册中心需要最先启动,其余服务应声明 After=linkis-mg-eureka.service。六个单元文件依次为 linkis-mg-eureka、linkis-mg-gateway、linkis-ps-publicservice、linkis-cg-linkismanager、linkis-cg-entrance、linkis-cg-engineconnmanager,服务名后缀与 linkis-daemon.sh 的参数一致。启用:
sudo systemctl daemon-reload
sudo systemctl enable --now linkis-mg-eureka linkis-mg-gateway linkis-ps-publicservice \
linkis-cg-linkismanager linkis-cg-entrance linkis-cg-engineconnmanager
注意:linkis-daemon.sh 通过 pid 文件判活,若进程被 kill -9 后遗留僵尸 pid 文件,systemd 重启前应先
rm -f /appcom/Install/LinkisInstall/pid/*.pid(详见 9.9 节)。
九、常见问题(FAQ)
9.1 安装脚本报 need_cmd yum 或语法错误
checkEnv.sh 沿用 CentOS 习惯检查 yum 并使用 bash 语法。Ubuntu 上:按 2.4 节注释 need_cmd yum、切换 /bin/sh 为 bash、安装 python-is-python3,并确保部署用户存在 .bash_profile。
9.2 安装过程卡在 MySQL 密码交互
交互输入的是 deploy-config/db.sh 中 MYSQL_PASSWORD 对应数据库的选择确认(2 重建表/1 跳过建表),不是密码回显输入;密码从 db.sh 读取。若连接失败,检查 MySQL 是否启动、root 是否使用 mysql_native_password 认证。
9.3 网关报 Cannot load driver class: com.mysql.jdbc.Driver
linkis-mg-gateway 的 classpath 不含 lib/linkis-commons/public-module/,仅放公共模块目录不够。必须启用 LINKIS_EXTENDED_LIB(linkis-env.sh 去掉该行注释,指向 /appcom/common/linkisExtendedLib)并把 JDBC 驱动 jar 复制到该目录后重启网关。官方镜像构建脚本亦采用同时把驱动放入 public-module 与 gateway 两个目录的做法。
9.4 任务报 Failed to upload engine conn to bml ... file://file:///tmp/linkis
linkis.properties 默认 wds.linkis.bml.local.prefix=file:///tmp/linkis,与代码内拼接的 file:// 前缀叠加形成 file://file:// 双协议。修正为:
wds.linkis.bml.local.prefix=/tmp/linkis
修改后重启 ps-publicservice 与 cg-linkismanager。
9.5 引擎启动失败:sudo: a terminal is required to read the password
引擎以提交用户身份运行,ECM 通过 sudo -u <user> 切换用户,部署用户必须具备免密 sudo(见 2.3 节)。
9.6 MySQL 报 Host '127.0.0.1' is not allowed to connect
启用 skip_name_resolve 后,'root'@'localhost' 授权不再匹配 127.0.0.1 来源,需补授权:
CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'q1w2e3r4';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
9.7 低内存服务器启动即 OOM
6 个 JVM 同时初始化存在内存峰值。实测可行的裁剪组合:SERVER_HEAP_SIZE=192M、EUREKA_HEAP_SIZE=128M;在 sbin/ext/linkis-common-start 的默认 JAVA_OPTS 中追加 -XX:MaxMetaspaceSize=128m -XX:MaxDirectMemorySize=64m -Xss512k;MySQL 侧启用 performance_schema=OFF、innodb_buffer_pool_size=64M、mysqlx=OFF(配置必须写在 [mysqld] 段内)。逐个服务启动(见下)而非 start-all 一键启动。
9.8 cg-linkismanager 启动后自行退出
常见两类原因:一是所属目录或 /tmp/linkis 属主不是部署用户(BML 上传失败,日志见 Failed to upload engine conn to bml);二是网关尚未就绪时 manager 抢先启动导致 BML 上传 401。等待其余服务稳定后单独 linkis-daemon.sh restart cg-linkismanager 即可。
9.9 daemon 误报 is already running 但进程不存在
进程被 kill -9 后产生僵尸进程,pid 文件残留且 kill -0 对僵尸进程返回成功。清理后重启:
rm -f /appcom/Install/LinkisInstall/pid/*.pid
sh /appcom/Install/LinkisInstall/sbin/linkis-daemon.sh start cg-entrance
9.10 任务报 errCode: 11011 There are no services available in the registry
网关在注册中心找不到目标服务,多为该服务崩溃或尚未注册完成。通过 eureka 控制台(20303,账号密码为部署用户名密码)确认各 LINKIS-* 实例状态,重启未注册的服务并等待 1~2 分钟。
十、卸载
# 1. 停止全部服务
sh /appcom/Install/LinkisInstall/sbin/linkis-stop-all.sh
# 2. 删除 systemd 单元(如已配置)
sudo systemctl disable --now linkis-mg-eureka linkis-mg-gateway linkis-ps-publicservice \
linkis-cg-linkismanager linkis-cg-entrance linkis-cg-engineconnmanager
sudo rm -f /etc/systemd/system/linkis-*.service
sudo systemctl daemon-reload
# 3. 删除元数据库
mysql -uroot -pq1w2e3r4 -e "DROP DATABASE IF EXISTS linkis;"
# 4. 删除部署目录、工作目录与安装包
sudo rm -rf /appcom/Install/LinkisInstall /appcom/common/linkisExtendedLib /tmp/linkis /opt/download/apache-linkis-1.8.0-bin
hadoop 用户与 /home/hadoop 如不再使用可一并删除(sudo userdel -r hadoop)。