Ubuntu 22.04 安装 Apache SystemDS 3.4.0 指南

Ubuntu 22.04 实机实测的 Apache SystemDS 3.4.0 部署指南,覆盖 OpenJDK 17 安装、官方包下载校验、环境变量配置与单机模式线性回归验证,含堆内存限制、常见报错处理与卸载步骤。

Apache SystemDSApache SystemDS2026/10/12

Ubuntu 22.04 安装 Apache SystemDS 3.4.0 指南

一、环境信息

本文所有命令与回显均在以下环境中实测采集,读者可按相同版本对照:

项目值
操作系统Ubuntu 22.04.5 LTS(root 用户)
SystemDS 版本3.4.0(Apache 官方当前最新稳定版,2026-07-24 发布)
JDKOpenJDK 17.0.20.1(openjdk-17-jdk-headless)
安装路径/opt/systemds-3.4.0
运行模式singlenode 单机模式(本地 Java 进程执行,不依赖集群)
包大小systemds-3.4.0-bin.tgz 约 123 MB

二、前置条件

  1. 一台 Ubuntu 22.04 服务器,具备 root 权限;
  2. 服务器可访问公网(用于访问 downloads.apache.org),本文实测直连正常;
  3. 磁盘剩余空间不低于 2 GB(安装包 123 MB,解压后约 500 MB,另需工作目录存放数据与运行临时文件);
  4. 内存不低于 2 GB。本文将 JVM 堆限制在 256-512 MB,以适配小规格机器与演示场景;
  5. 已安装 curl、wget、sha512sum 等基础工具(第二步会一并安装)。

SystemDS 3.4.0 官方要求 Java 8 及以上,实测采用 OpenJDK 17 全流程验证通过;JDK 11 亦为常见选择。

三、版本选型说明

访问 Apache 官方下载页 https://downloads.apache.org/systemds/,当前提供的历史版本包括 1.2.0、2.0.0、2.1.0、2.2.1、2.2.2、3.0.0、3.1.0、3.2.0、3.3.0 与 3.4.0,其中 3.4.0 为最新发布版本(downloads.apache.org 仅保留当前发布线,历史版本会移至 archive.apache.org)。

3.4.0 提供两类二进制包:

包名说明
systemds-3.4.0-bin.tgzLinux 下推荐使用的 tar.gz 包(本文采用)
systemds-3.4.0-bin.zipWindows 常用的 zip 包
systemds-3.4.0-javadoc.jarAPI 文档包

每个包均附带 .sha512、.sha1、.md5 校验文件与 .asc 签名文件,生产环境建议至少完成 sha512 校验。

需要注意:3.4.0 解压后的顶层目录名为 systemds-3.4.0-bin,与旧版本惯例的 systemds-<版本号> 不同,解压后需统一重命名(见 5.3 节)。

四、部署步骤

4.1 更新系统并安装基础工具

以 root 执行:

apt-get update

回显(节选):

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]
apt-get install -y curl wget

回显(节选):

0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

4.2 安装 OpenJDK 17

apt-get install -y openjdk-17-jdk-headless

安装完成后验证:

java -version

实测回显:

openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)

确认 JDK 安装路径(systemds 启动脚本会通过 java 命令自动定位,无需手动设置 JAVA_HOME):

ls /usr/lib/jvm/

实测回显:

java-1.17.0-openjdk-amd64
java-17-openjdk-amd64

Ubuntu 的 openjdk-17-jdk-headless 包自带 jps 工具,后续验证 JVM 进程参数时会用到。

4.3 下载官方二进制包并校验

cd /tmp
wget https://downloads.apache.org/systemds/3.4.0/systemds-3.4.0-bin.tgz

实测回显(节选):

--2026-10-12 05:33:00--  https://downloads.apache.org/systemds/3.4.0/systemds-3.4.0-bin.tgz
HTTP request sent, awaiting response: 200 OK
Length: 129291520 (123M) [application/x-gzip]
Saving to: 'systemds-3.4.0-bin.tgz'
systemds-3.4.0-bin.tgz      100%[===============================>] 123.32M  10.9MB/s  in 25s
'/tmp/systemds-3.4.0-bin.tgz' saved [129291520/129291520]

校验 sha512(与官方 .sha512 文件逐字比对):

sha512sum /tmp/systemds-3.4.0-bin.tgz

实测回显:

f6dd2fed83d5480558a6a778dbbff1c5034c77399d39f5f5e24a49416e78fb47fe4bd850f067b3ae8b5f3bf90fa244d29b419f70e197e77e77c6172c1e865868  /tmp/systemds-3.4.0-bin.tgz
curl -s https://downloads.apache.org/systemds/3.4.0/systemds-3.4.0-bin.tgz.sha512

实测回显(两者一致即校验通过):

f6dd2fed83d5480558a6a778dbbff1c5034c77399d39f5f5e24a49416e78fb47fe4bd850f067b3ae8b5f3bf90fa244d29b419f70e197e77e77c6172c1e865868  /tmp/systemds-3.4.0-bin.tgz

4.4 解压到 /opt 并统一目录名

tar -xzf /tmp/systemds-3.4.0-bin.tgz -C /opt/

3.4.0 解压后的顶层目录为 systemds-3.4.0-bin,重命名为标准目录:

mv /opt/systemds-3.4.0-bin /opt/systemds-3.4.0

查看目录结构:

ls -l /opt/systemds-3.4.0/

实测回显:

total 9620
-rw-rw-rw- 1 root root   19713 Jan  1  1970 LICENSE
-rw-rw-rw- 1 root root     171 Jan  1  1970 NOTICE
-rw-rw-rw- 1 root root    5925 Jan  1  1970 README.md
drwxr-xr-x 2 root root    4096 Oct 12 05:33 bin
drwxr-xr-x 2 root root    4096 Oct 12 05:33 conf
drwxr-xr-x 3 root root    4096 Oct 12 05:33 lib
drwxrwxrwx 3 root root    4096 Jan  1  1970 scripts
-rw-rw-rw- 1 root root 9797722 Jan  1  1970 systemds-3.4.0.jar

各子目录用途:

路径用途
bin/systemds命令行启动脚本(唯一可执行入口)
conf/SystemDS-config.xml默认配置文件
conf/log4j.properties日志配置
lib/依赖库(含内置的 hadoop 相关库)
scripts/官方 DML 算法与工具脚本(builtin 线性回归、utils 数据生成等)
systemds-3.4.0.jar主程序 jar 包

4.5 配置环境变量

创建 profile 片段(root 登录后自动加载):

cat > /etc/profile.d/systemds.sh << 'EOF'
export SYSTEMDS_ROOT=/opt/systemds-3.4.0
export SYSTEMDS_JAR_FILE=/opt/systemds-3.4.0/systemds-3.4.0.jar
export SYSTEMDS_STANDALONE_OPTS="-Xms256m -Xmx512m"
export PATH=$SYSTEMDS_ROOT/bin:$PATH
EOF

三个变量的作用:

变量作用
SYSTEMDS_ROOT安装根目录,systemds 脚本据此定位 jar、conf、scripts
SYSTEMDS_JAR_FILE显式指定主 jar 路径,可规避 3.4.0 启动脚本查找 jar 的缺陷(见 4.6)
SYSTEMDS_STANDALONE_OPTS传给 JVM 的参数,此处将堆内存限定为初始 256 MB、最大 512 MB

使配置生效并验证:

source /etc/profile.d/systemds.sh
echo $SYSTEMDS_ROOT
which systemds

实测回显:

/opt/systemds-3.4.0
/opt/systemds-3.4.0/bin/systemds

4.6 首次运行验证

编写一个最简 DML 脚本(DML 是 SystemDS 的类 R 语言脚本):

echo 'print("hello systemds");' > /tmp/hello.dml
systemds -f /tmp/hello.dml

实测回显:

###############################################################################
#  SYSTEMDS_ROOT= /opt/systemds-3.4.0
#  SYSTEMDS_JAR_FILE= /opt/systemds-3.4.0/systemds-3.4.0.jar
#  SYSDS_EXEC_MODE= singlenode
#  CONFIG_FILE= -config /opt/systemds-3.4.0/conf/SystemDS-config.xml
#  LOG4JPROP= -Dlog4j.configuration=file:/opt/systemds-3.4.0/conf/log4j.properties
#  HADOOP_HOME= /opt/systemds-3.4.0/lib/hadoop
#
#  Running script /tmp/hello.dml locally with opts:
#  Executing command:    java -Xms256m -Xmx512m  --add-modules=jdk.incubator.vector  --add-opens=java.base/java.nio=ALL-UNNAMED  -Dlog4j.configuration=file:/opt/systemds-3.4.0/conf/log4j.properties  -jar /opt/systemds-3.4.0/systemds-3.4.0.jar  -f /tmp/hello.dml  -exec singlenode  -config /opt/systemds-3.4.0/conf/SystemDS-config.xml
###############################################################################
WARNING: Using incubator modules: jdk.incubator.vector
26/10/12 05:35:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform, using builtin-java classes where applicable
hello systemds
SystemDS Statistics:
Total execution time:           0.014 sec.

输出中出现 hello systemds 即安装成功。两条 WARN 属正常现象:incubator 提示来自 Java 17 向量模块;NativeCodeLoader 警告表示使用内置 Java 类代替本地 hadoop 库,不影响单机模式。

若此处出现 Error: Unable to access jarfile org.apache.sysds.api.DMLScript,说明未设置 SYSTEMDS_JAR_FILE,这是 3.4.0 启动脚本在已安装目录下查找 jar 时的一个缺陷,按 4.5 节补上该变量并重新 source 即可。

4.7 运行官方脚本完成线性回归验证

创建工作目录,先使用官方 scripts/utils/generateData.dml 生成 1000 行 x 10 列的模拟数据:

mkdir -p /opt/systemds-work
systemds -f $SYSTEMDS_ROOT/scripts/utils/generateData.dml -nvargs R=1000 C=10 S=1.0 Min=0.0 Max=10.0 Pdf=normal Path=/opt/systemds-work/X.csv Fmt=csv

实测回显(节选):

26/10/12 05:36:18 WARN utils.SettingsChecker: Low memory budget of total:     31 GB set to:    512 MB
SystemDS Statistics:
Total execution time:           0.162 sec.
head -1 /opt/systemds-work/X.csv
wc -l /opt/systemds-work/X.csv

实测回显:

2.5816994153466477,9.473793123709633,1.4748655385310439,5.9211272832782065,9.10840748081604,0.6476292220562074,1.0308530190497667,2.0912142963848934,4.205451102405558,3.2093001007511734
1000 /opt/systemds-work/X.csv

编写脚本生成带真值系数的标签 y(真实权重为 2.5、1.5、3.0、0.0、1.0、2.0、0.5、1.2、0.8、1.1,截距 5.0,附加噪声):

cat > /opt/systemds-work/genY.dml << 'EOF'
X = read("/opt/systemds-work/X.csv");
w = matrix("2.5 1.5 3.0 0.0 1.0 2.0 0.5 1.2 0.8 1.1", rows=10, cols=1);
y = X %*% w + 5.0 + rand(rows=nrow(X), cols=1, min=-1, max=1, pdf="uniform");
write(y, "/opt/systemds-work/y.csv", format="csv");
print("y generated, rows=" + nrow(y));
EOF
systemds -f /opt/systemds-work/genY.dml

实测回显(节选):

y generated, rows=1000
Total execution time:           0.245 sec.

编写训练脚本,调用官方内置的 lm(线性回归)函数:

cat > /opt/systemds-work/train.dml << 'EOF'
X = read("/opt/systemds-work/X.csv");
y = read("/opt/systemds-work/y.csv");
B = lm(X=X, y=y, icpt=1);
write(B, "/opt/systemds-work/B.csv", format="csv");
print("=== learned coefficients ===");
print(toString(B));
EOF
systemds -f /opt/systemds-work/train.dml

实测回显(节选):

Calling the Direct Solver
=== learned coefficients ===
2.496
1.507
2.992
-0.009
1.006
1.991
0.499
1.204
0.798
1.082
5.152

SystemDS Statistics:
Total execution time:           0.278 sec.

学到的 10 个系数与截距 5.152 与真值高度吻合(数据含噪声存在小偏差属正常),说明 SystemDS 在 256-512 MB 堆限制下可完整完成训练流程。

4.8 验证 JVM 堆内存限制

SYSTEMDS_STANDALONE_OPTS 是修改堆内存的唯一入口(脚本内默认值为 -Xmx4g -Xms4g -Xmn400m,被环境变量覆盖)。运行一个耗时较长的数据生成任务,同时在另一终端采集进程参数:

systemds -f $SYSTEMDS_ROOT/scripts/utils/generateData.dml -nvargs R=800000 C=20 S=1.0 Min=0.0 Max=10.0 Pdf=normal Path=/opt/systemds-work/bigX.csv Fmt=csv

任务运行期间执行:

jps -v | grep -i systemds

实测回显:

4435 systemds-3.4.0.jar -Xms256m -Xmx512m --add-modules=jdk.incubator.vector --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.ref=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED -Dlog4j.configuration=file:/opt/systemds-3.4.0/conf/log4j.properties
ps -ef | grep "[j]ava -Xms256m"

实测回显(节选,仅保留一行):

root      4435  4395 99 05:36 ?  00:00:08 java -Xms256m -Xmx512m --add-modules=jdk.incubator.vector --add-opens=java.base/java.nio=ALL-UNNAMED -Dlog4j.configuration=file:/opt/systemds-3.4.0/conf/log4j.properties -jar /opt/systemds-3.4.0/systemds-3.4.0.jar -f /opt/systemds-3.4.0/scripts/utils/generateData.dml -exec singlenode -config /opt/systemds-3.4.0/conf/SystemDS-config.xml -nvargs R=800000 C=20 S=1.0 Min=0.0 Max=10.0 Pdf=normal Path=/opt/systemds-work/bigX.csv Fmt=csv

-Xms256m -Xmx512m 明确出现在命令行中,堆限制生效。同时每次运行日志都会打印内存预算调整提示:

26/10/12 05:36:18 WARN utils.SettingsChecker: Low memory budget of total:     31 GB set to:    512 MB

五、配置说明

5.1 环境变量配置

全部环境变量集中在 /etc/profile.d/systemds.sh,逐项说明:

变量实测值说明
SYSTEMDS_ROOT/opt/systemds-3.4.0安装根目录
SYSTEMDS_JAR_FILE/opt/systemds-3.4.0/systemds-3.4.0.jar显式指定主 jar,规避脚本缺陷
SYSTEMDS_STANDALONE_OPTS-Xms256m -Xmx512mJVM 堆参数,256-512 MB 适配小内存机器
PATH前置 $SYSTEMDS_ROOT/bin免去每次输入完整路径

若需调整堆内存,直接编辑 /etc/profile.d/systemds.sh 中 SYSTEMDS_STANDALONE_OPTS 一行,重新 source 后用 4.8 节方法验证。

5.2 配置文件位置

文件路径用途
SystemDS 配置/opt/systemds-3.4.0/conf/SystemDS-config.xml临时目录、并行度、codegen、压缩线性代数等参数
日志配置/opt/systemds-3.4.0/conf/log4j.properties日志级别与输出格式

运行时可通过 -config <文件路径> 参数指定自定义配置文件,例如:

systemds -f /opt/systemds-work/train.dml -config /opt/systemds-work/my-config.xml

六、注意事项

  1. 3.4.0 的 bin/systemds 脚本在已安装目录下查找 jar 时存在引号处理缺陷,务必设置 SYSTEMDS_JAR_FILE 环境变量,或在脚本第一参数位置显式传入 jar 完整路径(如 systemds /opt/systemds-3.4.0/systemds-3.4.0.jar -f x.dml);
  2. 解压目录默认带 -bin 后缀,建议按 4.4 节重命名,否则 SYSTEMDS_ROOT 相关配置与本文不一致;
  3. SystemDS 单机模式每条命令都是前台进程,运行结束即退出,无常驻服务,因此无需注册 systemd 服务;
  4. 内联脚本参数 -s 不被启动脚本支持,如需内联执行需直接调用 java 并带上 --add-modules=jdk.incubator.vector,否则会报 NoClassDefFoundError;
  5. 默认堆配置为 4 GB,小内存机器务必覆盖 SYSTEMDS_STANDALONE_OPTS,否则 JVM 启动即申请 4 GB 虚拟内存;
  6. Ubuntu 的 openjdk-17-jdk-headless 自带 jps,可直接用于进程参数验证。

七、常见问题

Q1:运行报 Error: Unable to access jarfile org.apache.sysds.api.DMLScript,如何解决?

这是 3.4.0 启动脚本在查找 jar 文件时的缺陷导致 jar 路径为空。解决办法:在 /etc/profile.d/systemds.sh 中增加一行 export SYSTEMDS_JAR_FILE=/opt/systemds-3.4.0/systemds-3.4.0.jar,重新 source 后即可;也可每次运行时显式传入 jar 路径。

Q2:日志中的 WARN utils.SettingsChecker: Low memory budget 提示是什么意思?

SystemDS 启动时按堆大小计算内部内存预算,检测到堆较小(如 512 MB)时会打印该提示并自动收缩预算,属于正常行为,说明堆限制已生效。若需消除,可增大堆参数。

Q3:出现 WARN util.NativeCodeLoader: Unable to load native-hadoop library 是否有影响?

没有影响。单机模式不依赖 Hadoop 集群,SystemDS 会自动回退到内置 Java 实现,仅本地文件读写,该警告可忽略。

Q4:直接运行 java -jar systemds-3.4.0.jar 报 NoClassDefFoundError: jdk/incubator/vector/DoubleVector 怎么办?

绕过启动脚本直连 java 时必须手动带上模块参数:java -Xms256m -Xmx512m --add-modules=jdk.incubator.vector -jar /opt/systemds-3.4.0/systemds-3.4.0.jar -f your.dml -exec singlenode。启动脚本已内置该参数,优先使用 systemds 命令。

Q5:运行官方 Univar-Stats.dml 报 The parameter $STATS either needs to be passed 通过命令行?

该脚本除输入矩阵 X 外还需命名参数 TYPES(2xN 类型矩阵,第一行是类型码、第二行是列 ID,需配套 .mtd 元数据文件)与 STATS(输出路径),三者缺一不可。

八、卸载方式

按以下顺序清理(SystemDS 无服务进程,先确认无运行中的 java 任务):

ps -ef | grep "[s]ystemds"

无输出即无运行任务。随后执行工作目录清理、删除安装目录、删除环境变量与安装包:

java -jar /opt/systemds-3.4.0/systemds-3.4.0.jar -clean
rm -rf /opt/systemds-3.4.0 /opt/systemds-work /opt/systemds-tmp
rm -f /etc/profile.d/systemds.sh /tmp/systemds-3.4.0-bin.tgz

-clean 会清理 SystemDS 的工作目录(本地临时缓存,默认 /tmp/systemds)。验证卸载干净:

ls /opt/ | grep -i systemds

无输出即卸载完成。实测执行后该命令返回为空。

九、参考链接

  1. Apache SystemDS 官方下载页:https://downloads.apache.org/systemds/
  2. Apache SystemDS 官网:https://systemds.apache.org/
  3. 官方文档(DML 语言参考):https://systemds.apache.org/docs/
  4. 官方 GitHub 仓库:https://github.com/apache/systemds
  5. 历史版本归档:https://archive.apache.org/dist/systemds/