Ubuntu 22.04 安装 Apache Gobblin 0.17.0 指南

在 Ubuntu 22.04 上从 Apache 官方源码以 JDK 8 + Gradle 4.9 构建 Apache Gobblin 0.17.0(官方仅有源码包、无二进制),完成源码 SHA512 校验、依赖镜像处理、约 180MB 发行包解压、standalone 启动与本地文件复制作业验证(作业 SUCCESSFUL、输出 diff 一致、Admin UI 9000 返回 200)。流程在 Ubuntu 22.04.5 真实服务器实测通过。

Apache GobblinApache Gobblin安装部署Apache大数据Ubuntu 22.042026/10/11

Ubuntu 22.04 安装 Apache Gobblin 0.17.0 指南

目标:在 Ubuntu 22.04.5 上从 Apache 官方源码包以 JDK 8 + Gradle 4.9 自源码构建 Apache Gobblin 0.17.0,完成源码完整性校验、依赖仓库镜像处理、约 180 MB 发行包解压、standalone 单机启动、JVM 堆限定与「本地文件 → 本地文件」复制作业验证。安装与验证流程在 Ubuntu 22.04.5 真实服务器实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • 运行时环境:OpenJDK 8(1.8.0_504,Gobblin 0.17.0 构建脚本 jdkVersion=JavaVersion.VERSION_1_8、源码 target 1.8,必须 JDK 8)
  • 构建工具:Gradle 4.9
  • 组件版本:Apache Gobblin 0.17.0(源码包 apache-gobblin-sources-0.17.0.tgz,约 8.2 MB)
  • 源码目录:/opt/gobblin/gobblin-0.17.0-src
  • 安装目录(GOBBLIN_HOME):/opt/gobblin/gobblin-dist
  • 发行包:apache-gobblin-incubating-bin-0.17.0.tar.gz(约 180 MB,解压目录 gobblin-dist/,含 bin/ conf/ lib/ logs/)
  • 运行模式:standalone(单机守护)
  • 管理 UI:Jetty Admin Web Server,端口 9000(页面标题 Gobblin Admin)
  • REST 端口:rest.server.port=9090(standalone 默认,绑定 localhost)
  • 作业目录:/opt/gobblin/jobs(GOBBLIN_JOB_CONFIG_DIR)

二、前置条件

  • 拥有 root 权限,已配置可访问 archive.apache.org 与 services.gradle.org 的网络
  • 已安装 wget、unzip、git、net-tools(Ubuntu 极简环境下可能缺 curl,本文统一用 wget)
  • 系统默认 JDK 为 JDK 8

⚠️ 注意:Gobblin 0.17.0 的构建与运行目标均为 Java 8(class 文件 target 1.8)。若系统默认是 JDK 11/17,构建与启动都会失败,必须先安装并切换 JDK 8。

三、版本选型说明

Apache Gobblin 0.17.0 的官方发行物情况:

版本官方发行物说明建议
0.17.0仅源码包 apache-gobblin-sources-0.17.0.tgz + .asc + .sha512archive.apache.org 当前最新归档版,无预编译二进制(实测对象)推荐,本文按此版构建
0.16.0仅源码包上一归档版本如需旧版可从同一归档路径下载

💡 说明:https://archive.apache.org/dist/gobblin/ 下仅有 apache-gobblin-0.16.0/ 与 apache-gobblin-0.17.0/ 两个版本目录,且均只提供源码包,没有开箱即用的二进制发行包。因此必须在本机用 JDK 8 + Gradle 4.9 从源码构建出约 180 MB 的发行包后使用。

四、源码构建方案

4.1 安装 JDK 8

apt-get update
apt-get install -y openjdk-8-jdk wget unzip git net-tools

验证版本:

/usr/lib/jvm/java-8-openjdk-amd64/bin/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)

JDK 8 安装路径为 /usr/lib/jvm/java-8-openjdk-amd64,后续作为 JAVA_HOME。

4.2 下载并校验源码包

mkdir -p /opt/gobblin
cd /opt/gobblin
wget https://archive.apache.org/dist/gobblin/apache-gobblin-0.17.0/apache-gobblin-sources-0.17.0.tgz

实测下载结果(约 8.2 MB):

-rw-r--r-- 1 root root 8.2M apache-gobblin-sources-0.17.0.tgz

计算本地 SHA512 并与官方 .sha512 对比:

wget -qO- https://archive.apache.org/dist/gobblin/apache-gobblin-0.17.0/apache-gobblin-sources-0.17.0.tgz.sha512; echo
sha512sum apache-gobblin-sources-0.17.0.tgz | awk '{print $1}'

实测回显(两者完全一致):

93467993f8047a1e6a82c6ac0e0843a7c3a222a917f4ef9a16d74c67f1262b00b4d672bc813e56473b569f9f08952a7870665a41215df71b5612e72afc248148
93467993f8047a1e6a82c6ac0e0843a7c3a222a917f4ef9a16d74c67f1262b00b4d672bc813e56473b569f9f08952a7870665a41215df71b5612e72afc248148

解压源码包:

cd /opt/gobblin
tar -xzf apache-gobblin-sources-0.17.0.tgz
mv apache-gobblin-sources-0.17.0 gobblin-0.17.0-src
ls gobblin-0.17.0-src | head

实测回显:

CHANGELOG.md
HEADER
LICENSE
NOTICE
README.md
bin
build.gradle
buildSrc

4.3 安装 Gradle 4.9

源码包中 gradle/wrapper/gradle-wrapper.jar 被 ASF 剔除(源码包不含二进制 jar),直接执行 ./gradlew 会报错,因此单独安装 Gradle 4.9:

mkdir -p /opt/gradle
cd /opt/gradle
wget https://services.gradle.org/distributions/gradle-4.9-bin.zip
unzip -q gradle-4.9-bin.zip

验证版本:

JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 /opt/gradle/gradle-4.9/bin/gradle -version

实测回显:

Gradle 4.9
JVM:          1.8.0_504 (Ubuntu 25.504-b01)

⚠️ 注意:不安装独立 Gradle 而直接运行 ./gradlew 会报 Could not find or load main class org.gradle.wrapper.GradleWrapperMain(wrapper jar 缺失所致)。

4.4 依赖仓库镜像(解决 jcenter 下线与 LinkedIn 大 jar 下载失败)

Gobblin 构建需两项特殊依赖:① org.gradle.api.plugins:gradle-nexus-plugin:0.7.1,其原 jcenter 仓库已下线;② 一批来自 linkedin.jfrog.io:.../open-source 的制品(hive-exec-core 等大 jar),Gradle 并发下载时反复出现 Connection reset / Read timed out。

解决办法:用 Gradle init 脚本注入镜像仓库,并把 linkedin 制品用 wget 预下载到本地 file:// maven 镜像优先加载。

新建 ~/.gradle/init.gradle:

allprojects {
    buildscript {
        repositories {
            maven { url 'file:///opt/jfrog-mirror/artifactory/open-source' }
            maven { url 'https://maven.aliyun.com/repository/public' }
            maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
        }
    }
    repositories {
        maven { url 'file:///opt/jfrog-mirror/artifactory/open-source' }
        maven { url 'https://maven.aliyun.com/repository/public' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
    }
}

其中 /opt/jfrog-mirror/artifactory/open-source 下预置了从构建日志收集到的 75 个 linkedin 制品(37 个 jar + 38 个 pom),用 wget 逐个下载后放入该目录。

4.5 源码构建

cd /opt/gobblin/gobblin-0.17.0-src
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 /opt/gradle/gradle-4.9/bin/gradle \
  :gobblin-distribution:buildDistributionTar -PgobblinFlavor=minimal

构建关键回显:

Build property: gobblinFlavor=minimal
> Task :gobblin-distribution:buildDistributionTar
BUILD SUCCESSFUL in 2m 51s

💡 说明::gobblin-distribution:buildDistributionTar 生成发行包,-PgobblinFlavor=minimal 指定最小发行集(含 data-management,体积最小;另有 standard / full)。

4.6 解压发行包并配置环境变量

构建产出(约 180 MB):

ls -lh /opt/gobblin/gobblin-0.17.0-src/apache-gobblin-incubating-bin-0.17.0.tar.gz

实测回显:

-rw-r--r-- 1 root root 180M apache-gobblin-incubating-bin-0.17.0.tar.gz

确认发行包目录结构(顶层为 gobblin-dist/):

tar -tzf /opt/gobblin/gobblin-0.17.0-src/apache-gobblin-incubating-bin-0.17.0.tar.gz | head -6

实测回显:

gobblin-dist/
gobblin-dist/conf/
gobblin-dist/conf/yarn/
gobblin-dist/conf/yarn/application.conf
gobblin-dist/conf/standalone/
gobblin-dist/conf/standalone/log4j.xml

解压到 /opt/gobblin/gobblin-dist(GOBBLIN_HOME):

cd /opt/gobblin
tar -xzf gobblin-0.17.0-src/apache-gobblin-incubating-bin-0.17.0.tar.gz
ls gobblin-dist

实测回显:

bin  conf  lib  logs

新建 /etc/profile.d/gobblin.sh:

cat > /etc/profile.d/gobblin.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export GOBBLIN_HOME=/opt/gobblin/gobblin-dist
export PATH=$GOBBLIN_HOME/bin:$JAVA_HOME/bin:$PATH
EOF
chmod +x /etc/profile.d/gobblin.sh

使当前会话生效并确认 CLI 版本:

source /etc/profile.d/gobblin.sh
$GOBBLIN_HOME/bin/gobblin.sh 2>&1 | tail -3

实测回显:

gobblin.sh  cli     <cli-command>    <params>
gobblin.sh  service <execution-mode> <start|stop|restart|status>
Use "gobblin <cli|service> --help" for more information.         (Gobblin Version: 0.17.0)

五、单机运行与验证

5.1 作业配置(.job / .properties)

作业目录由 conf/standalone/application.conf 中的 jobconf.dir=${env:GOBBLIN_JOB_CONFIG_DIR} 指定。注意默认作业扩展名仅 pull,job(gobblin-api 中 DEFAULT_JOB_CONFIG_FILE_EXTENSIONS="pull,job"),作业文件必须命名为 *.job 或 *.pull,.properties 不会被加载(日志显示 Loaded 0 job configurations)。

新建 /opt/gobblin/jobs/local-copy.job(本地文件 → 本地文件复制作业):

job.name=LocalFileCopyDemo
job.group=demo
source.class=org.apache.gobblin.data.management.copy.CopySource
data.publisher.type=org.apache.gobblin.data.management.copy.publisher.CopyDataPublisher
writer.builder.class=org.apache.gobblin.data.management.copy.writer.FileAwareInputStreamDataWriterBuilder
converter.classes=org.apache.gobblin.converter.IdentityConverter
gobblin.dataset.profile.class=org.apache.gobblin.data.management.copy.CopyableGlobDatasetFinder
gobblin.dataset.pattern=/opt/gobblin/data/input/*.txt
data.publisher.final.dir=/opt/gobblin/data/output
distcp.persist.dir=/opt/gobblin/data/persist
state.store.enabled=false
gobblin.trash.skip.trash=true
cleanup.staging.data.per.task=false
job.commit.parallelize=true

5.2 准备输入数据

mkdir -p /opt/gobblin/data/input
printf 'hello gobblin\n'   > /opt/gobblin/data/input/a.txt
printf 'copy demo\n'       > /opt/gobblin/data/input/b.txt
printf 'compose deploy\n'  > /opt/gobblin/data/input/c.txt
ls -l /opt/gobblin/data/input/

实测回显:

-rw-r--r-- 1 root root 31 a.txt
-rw-r--r-- 1 root root 17 b.txt
-rw-r--r-- 1 root root 19 c.txt

5.3 启动 standalone(JVM 堆 -Xmx512m/-Xms256m)

设置 GOBBLIN_JOB_CONFIG_DIR 后启动,并用 --jvmopts 覆盖默认堆(脚本默认 JVM_OPTS='-Xmx1g -Xms512m'):

source /etc/profile.d/gobblin.sh
export GOBBLIN_WORK_DIR=/opt/gobblin/work
export GOBBLIN_JOB_CONFIG_DIR=/opt/gobblin/jobs
$GOBBLIN_HOME/bin/gobblin-standalone.sh start --jvmopts '-Xmx512m -Xms256m'

查看进程状态:

$GOBBLIN_HOME/bin/gobblin-standalone.sh status

实测回显:

Gobblin standalone process is running... [ pid: 8757 ].

jps -v 确认堆参数(默认 -Xmx1g 在前、--jvmopts 的 -Xmx512m 在后,Java 以后者生效):

jps -v | grep SchedulerDaemon

实测回显:

8757 SchedulerDaemon -Xmx1g -Xms512m -Xmx512m -Dlog4j.configuration=file:///opt/gobblin/gobblin-dist/conf/standalone/log4j.xml -Dgobblin.logs.dir=/opt/gobblin/gobblin-dist/logs

5.4 作业提交与运行结果

standalone 启动后自动监测作业目录并加载作业(jobconf.monitor.interval=30000 ms):

grep -E 'Loaded [0-9]+ job configurations' /opt/gobblin/gobblin-dist/logs/standalone.out | tail -1

实测回显:

2026-10-11 13:50:59 GMT INFO  [JobScheduler STARTING] ... JobScheduler  539 - Loaded 1 job configurations

任务执行成功(每个输入文件对应一个 task,均为 state SUCCESSFUL):

2026-10-11 13:51:00 GMT INFO  [Task-committing-pool-1] LocalTaskStateTracker  131 - Task task_LocalFileCopyDemo_1791726659225_1 completed in 267ms with state SUCCESSFUL
2026-10-11 13:51:00 GMT INFO  [Task-committing-pool-0] LocalTaskStateTracker  131 - Task task_LocalFileCopyDemo_1791726659225_0 completed in 300ms with state SUCCESSFUL
2026-10-11 13:51:00 GMT INFO  [Task-committing-pool-1] LocalTaskStateTracker  131 - Task task_LocalFileCopyDemo_1791726659225_2 completed in 182ms with state SUCCESSFUL

5.5 输出校验

ls -l /opt/gobblin/data/output/
diff -r /opt/gobblin/data/input /opt/gobblin/data/output && echo IDENTICAL

实测回显(输出与源文件逐一一致):

-rw-r--r-- 1 root root 31 a.txt
-rw-r--r-- 1 root root 17 b.txt
-rw-r--r-- 1 root root 19 c.txt
IDENTICAL

5.6 Admin Web UI 验证(9000)

standalone 默认配置中 admin.server.enabled=true、admin.server.port=9000;而 job.execinfo.server.enabled 需显式开启才会启动 Web 服务器(发行包默认值可能为 false)。开启后:

wget -SqO- http://localhost:9000/ 2>&1 | grep -i 'HTTP/' | head -1
wget -qO- http://localhost:9000/ 2>/dev/null | grep -o '<title>.*</title>' | head -1

实测回显:

HTTP/1.1 200 OK
<title>Gobblin Admin</title>

⚠️ 注意:若同时把 job.history.store.enabled=true 打开,Service JobExecutionInfoServer 会因缺少 JDBC 连接串而启动失败(java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName),进而 Expected to be healthy after starting 报错退出。standalone 场景下保持 job.history.store.enabled=false(默认)即可,无需外部数据库。

六、配置说明(含 JVM 堆)

6.1 JVM 堆内存限定

standalone 进程为 Java 进程,建议将堆限制在 256–512MB。脚本默认 JVM_OPTS='-Xmx1g -Xms512m',通过 gobblin-standalone.sh start --jvmopts '-Xmx512m -Xms256m' 追加覆盖:

进程启动参数实测生效堆
SchedulerDaemon--jvmopts "-Xmx512m -Xms256m"-Xmx1g -Xms512m -Xmx512m,MaxHeapSize = 512.0MB

生效验证方法:

jmap -heap 8757 | grep -i MaxHeapSize

实测回显:

   MaxHeapSize              = 536870912 (512.0MB)

也可用 jps -v | grep SchedulerDaemon 复核命令行 -Xmx/-Xms。

6.2 systemd 托管(可选)

若用 systemd 将 standalone 托为本机服务,可新建 /etc/systemd/system/gobblin-standalone.service:

[Unit]
Description=Apache Gobblin Standalone
After=network.target

[Service]
Environment=JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
Environment=GOBBLIN_HOME=/opt/gobblin/gobblin-dist
Environment=GOBBLIN_WORK_DIR=/opt/gobblin/work
Environment=GOBBLIN_JOB_CONFIG_DIR=/opt/gobblin/jobs
ExecStart=/opt/gobblin/gobblin-dist/bin/gobblin-standalone.sh start --jvmopts "-Xmx512m -Xms256m"
ExecStop=/opt/gobblin/gobblin-dist/bin/gobblin-standalone.sh stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

⚠️ 注意:Environment= 每行只能声明一个单元;--jvmopts 参数含空格,须用引号包裹。

七、注意事项

  • 必须 JDK 8:构建与运行均以 Java 8 为目标,JDK 11/17 会失败。
  • 官方无二进制:只能从源码构建,且需独立安装 Gradle 4.9(wrapper jar 缺失)。
  • 依赖镜像必配:jcenter 下线 + LinkedIn jfrog 大 jar 并发失败,须用 init.gradle 镜像 + 本地 file:// 镜像。
  • 作业后缀必须是 .job 或 .pull:.properties 不被加载。
  • Web UI 依赖 job.execinfo.server.enabled=true,且 job.history.store.enabled 须保持 false(否则报 jdbcUrl 错误)。
  • 安全认证:standalone 默认无认证,Admin UI 与 REST 直接可访问;如需启用需自行配置,示例管理账号可用 admin + 密码 q1w2e3r4(属安全插件范畴,未在本文实测回显覆盖)。

八、常见问题(FAQ)

Q1:./gradlew 报 Could not find or load main class org.gradle.wrapper.GradleWrapperMain。

源码包剔除了 wrapper jar,改用独立安装的 Gradle 4.9 构建。

Q2:构建缺少 org.gradle.api.plugins:gradle-nexus-plugin:0.7.1。

原 jcenter 已下线,在 init.gradle 中注入阿里云 public / gradle-plugin 镜像。

Q3:构建时 LinkedIn 大 jar 反复 Connection reset / Read timed out。

用 wget 预下载 75 个 linkedin 制品到本地 file:// maven 镜像优先加载。

Q4:作业日志显示 Loaded 0 job configurations。

默认扩展名仅 pull,job,.properties 不被识别,改名 local-copy.job 后变为 Loaded 1 job configurations。

Q5:wget http://localhost:9000/ 连接被拒。

job.execinfo.server.enabled 默认为 false,置为 true 后重启 standalone。

Q6:开启 job.history.store.enabled=true 后服务启动失败并报 jdbcUrl is required with driverClassName。

作业历史库需外部 JDBC 数据库(默认 MySQL),standalone 保持关闭(默认 false)即可。

Q7:重启报 Address already in use(9000 端口占用)。

旧 SchedulerDaemon 未退出,重启前确保旧进程已退出、删除 .gobblin-standalone.pid 后再 start。

九、卸载方式

# 1. 停止 standalone
source /etc/profile.d/gobblin.sh
$GOBBLIN_HOME/bin/gobblin-standalone.sh stop
# 2. 删除安装目录与环境变量
rm -rf /opt/gobblin
rm -rf /opt/gradle
rm -f /etc/profile.d/gobblin.sh
# 3.(可选)移除 JDK 8
apt-get purge -y openjdk-8-jdk

十、参考链接

  • Apache Gobblin 官方归档:https://archive.apache.org/dist/gobblin/apache-gobblin-0.17.0/
  • Apache Gobblin 项目主页:https://gobblin.apache.org/
  • Gradle 4.9 发行版:https://services.gradle.org/distributions/gradle-4.9-bin.zip

系列其他文档:《CentOS 8 安装 Apache Gobblin 0.17.0 指南》《Apache Gobblin 0.17.0 Docker Compose 部署指南》《Apache Gobblin 0.17.0 配置参数详解》《Apache Gobblin 0.17.0 常用 CLI 命令与工具详解》。