Ubuntu 22.04 安装 Apache Linkis 指南

在 Ubuntu 22.04 服务器上从 0 到 1 安装 Apache Linkis 1.8.0 单机最小形态(JDK 8 + MySQL 8 后端库 + 官方安装脚本),涵盖环境准备、安装脚本执行、服务启动、网关登录 API 验证、linkis-cli 提交 shell 任务实测、systemd 托管、常见问题与卸载。

Apache LinkisApache Linkis2026/10/12

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 LTSPRETTY_NAME="Ubuntu 22.04.5 LTS"
Apache Linkis1.8.0官方 binary 包 apache-linkis-1.8.0-bin.tar.gz
JDKOpenJDK 1.8.0_504Linkis 1.x 要求 JDK 8,官方安装脚本强制检查 JDK 8
MySQL8.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。

实测监听端口清单:

端口服务说明
20303linkis-mg-eureka注册中心
9001linkis-mg-gateway网关(所有 REST 请求入口)
9101linkis-cg-linkismanager计算治理管理服务
9102linkis-cg-engineconnmanager引擎管理服务(ECM)
9104linkis-cg-entrance任务入口服务
9105linkis-ps-publicservice公共服务(jobhistory/BML/文件系统等)
3306mysqldMySQL 元数据库

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 上需要完成以下四项适配,否则安装必然失败:

  1. 将 /bin/sh 从 dash 切换为 bash(安装脚本使用 bash 特有语法):
sudo dpkg-reconfigure dash

在交互界面选择 No。校验:ls -l /bin/sh 应显示 -> bash。

  1. 为部署用户创建 .bash_profile(脚本会 source 该文件,缺失时部分环境变量不生效):
sudo -u hadoop touch /home/hadoop/.bash_profile
  1. 安装 python 命令(checkEnv.sh 校验 python 命令,Ubuntu 默认只有 python3):
sudo apt-get install -y python-is-python3
  1. 注释 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)。