Ubuntu 22.04 安装 Apache DataFu 指南
面向 Ubuntu 22.04 服务器的 Apache DataFu 集成使用指南,讲解安装 JDK 与 Maven、引入依赖、解析与版本验证、最小示例的编译运行回显,以及卸载与缓存清理的完整流程,并附常见问题排查。
Ubuntu 22.04 安装 Apache DataFu 指南
Apache DataFu 是 Apache 基金会旗下面向 Hadoop 生态的 Java 库集合,提供哈希、采样、集合运算、统计等一批可在 Pig / Spark / 普通 Java 工程中直接复用的工具类与 UDF。它是「库」而非「服务」,没有独立守护进程,安装的实质是把依赖引入到自己的工程并完成编译与运行验证。本文以 Ubuntu 22.04 服务器为目标,给出从系统准备、依赖引入到最小示例运行、卸载清理的完整流程。
一、前置条件
1.1 系统与硬件要求
- 操作系统:Ubuntu Server 22.04 LTS(本文实测环境为 Ubuntu 22.04.5 LTS,内核 6.8.0)。
- CPU / 内存:单核 1 GB 内存即可完成本文全部步骤;编译与运行 DataFu 示例建议 JVM 堆内存限制在 256–512 MB(本文示例统一使用
-Xmx384m)。 - 磁盘:预留 1 GB 以上用于 JDK、Maven 与 Maven 本地仓库(
~/.m2)。 - 权限:需要 root 或具备 sudo 权限的账号。
1.2 网络与仓库要求
- 能访问 APT 软件源(本文实测时
archive.ubuntu.com/security.ubuntu.com可正常更新,apt-get update拉取约 49 MB 索引)。 - 能访问 Maven 中央仓库
https://repo1.maven.org/maven2/下载 DataFu 依赖。 - 内网环境需配置本地/代理镜像源,或将依赖预先放入私服。
1.3 版本对照
| 组件 | 本文实测版本 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS |
| JDK | OpenJDK 11.0.32.1 |
| Maven | 3.6.3(Ubuntu 构建) |
| Apache DataFu | datafu-pig 1.6.1 |
说明:DataFu 兼容 JDK 8 与 JDK 11,Ubuntu 22.04 默认
openjdk-11-jdk即可满足编译运行需求。
二、安装 JDK 与 Maven
2.1 更新软件源
apt-get update
正常回显(截取):
Get:17 http://security.ubuntu.com/ubuntu jammy-security/multiverse amd64 Packages [96.8 kB]
Get:18 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [7955 kB]
Fetched 49.0 MB in 34s (1439 kB/s)
Reading package lists...
2.2 安装 JDK 与 Maven
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-11-jdk maven
安装结果确认:
dpkg -l | grep -E 'openjdk-11-jdk|maven '
openjdk-11-jdk:amd64 11.0.32.1+1-1ubuntu1~22.04
openjdk-11-jdk-headless:amd64 11.0.32.1+1-1ubuntu1~22.04
maven 3.6.3-5
2.3 版本验证
java -version
mvn -v
真实回显:
openjdk version "11.0.32.1" 2026-08-18
OpenJDK Runtime Environment (build 11.0.32.1+1-post-1ubuntu1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 11.0.32.1+1-post-1ubuntu1-22.04-Ubuntu, mixed mode, sharing)
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.32.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "6.8.0-138-generic", arch: "amd64", family: "unix"
三、引入 Apache DataFu 依赖
3.1 关于坐标(重要)
在 Maven 中央仓库 https://repo1.maven.org/maven2/org/apache/datafu/ 下,实际可用构件为:
datafu-pig/ datafu-hourglass/
datafu-spark_2.11/ datafu-spark_2.12/
不存在 org.apache.datafu:datafu 这一「核心库」构件。DataFu 的核心工具类与 Pig UDF(datafu.pig.*:哈希、采样、集合、统计、工具等)全部打包在 datafu-pig 中,datafu-pig 即事实上的核心依赖。各构件最新发布版本(实测回显):
| 坐标 | latest / release |
|---|---|
org.apache.datafu:datafu-pig | 1.6.1 |
org.apache.datafu:datafu-hourglass | 1.6.1 |
org.apache.datafu:datafu-spark_2.12 | 2.1.0 |
3.2 创建 Maven 工程
mkdir -p /root/datafu-lab/src/main/java/demo
cd /root/datafu-lab
3.3 Maven 坐标引入(pom.xml)
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>demo</groupId>
<artifactId>datafu-lab</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.datafu</groupId>
<artifactId>datafu-pig</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
<version>0.17.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.7</version>
</dependency>
</dependencies>
</project>
关键点(实测):
datafu-pig声明 Pig / Hadoop 为 provided 作用域,不会传递引入。仅引入datafu-pig时mvn dependency:build-classpath只会输出datafu-pig-1.6.1.jar一项。若要在普通 Java 工程中直接调用 UDF,须自行补充pig与hadoop-common;反之若运行环境已提供 Pig/Hadoop(如集群作业),应将这两项声明为provided以免版本冲突。
3.4 Gradle 方式引入
等价的 Gradle 声明如下,适用于使用 Gradle 构建的工程:
dependencies {
implementation 'org.apache.datafu:datafu-pig:1.6.1'
// 在独立 Java 工程中直接调用 UDF 时按需补充:
implementation 'org.apache.pig:pig:0.17.0'
implementation 'org.apache.hadoop:hadoop-common:2.7.7'
}
仅编写 Pig 脚本、由集群提供运行时的工程可简化为:
dependencies {
compileOnly 'org.apache.datafu:datafu-pig:1.6.1'
}
3.5 依赖解析验证
mvn -q -B dependency:build-classpath -Dmdep.outputFile=cp.txt
回显中应出现 datafu-pig-1.6.1.jar、pig-0.17.0.jar 等条目,代表依赖已解析至 ~/.m2/repository/org/apache/datafu/。
四、版本验证与最小示例
4.1 依赖树确认
mvn -B dependency:tree
关键回显:
[INFO] demo:datafu-lab:jar:1.0
[INFO] +- org.apache.datafu:datafu-pig:jar:1.6.1:compile
[INFO] +- org.apache.pig:pig:jar:0.17.0:compile
[INFO] | +- commons-cli:commons-cli:jar:1.2:compile
[INFO] | +- commons-codec:commons-codec:jar:1.4:compile
4.2 最小示例源码
文件 src/main/java/demo/DataFuDemo.java:
package demo;
import org.apache.pig.data.BagFactory;
import org.apache.pig.data.DataBag;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;
import datafu.pig.hash.MD5;
import datafu.pig.hash.SHA;
import datafu.pig.util.Base64Encode;
import datafu.pig.sampling.ReservoirSample;
public class DataFuDemo {
public static void main(String[] args) throws Exception {
TupleFactory tf = TupleFactory.getInstance();
BagFactory bf = BagFactory.getInstance();
MD5 md5 = new MD5();
System.out.println("MD5(apache-datafu) = " + md5.exec(tf.newTuple("apache-datafu")));
SHA sha = new SHA("256");
System.out.println("SHA-256(apache-datafu) = " + sha.exec(tf.newTuple("apache-datafu")));
Base64Encode b64 = new Base64Encode();
System.out.println("Base64Encode(datafu) = " + b64.exec(tf.newTuple("datafu")));
ReservoirSample rs = new ReservoirSample("2");
DataBag input = bf.newDefaultBag();
for (int i = 1; i <= 10; i++) {
Tuple row = tf.newTuple(1);
row.set(0, i);
input.add(row);
}
Tuple group = tf.newTuple(1);
group.set(0, input);
rs.accumulate(group);
DataBag sampled = rs.getValue();
StringBuilder sb = new StringBuilder();
for (Tuple t : sampled) {
if (sb.length() > 0) sb.append(",");
sb.append(t.get(0));
}
System.out.println("ReservoirSample(2 of 1..10) = [" + sb + "] size=" + sampled.size());
}
}
易错点:
ReservoirSample.accumulate(Tuple)内部会对传入元组的第 0 个字段做(DataBag)转换并逐个抽样;TupleFactory.newTuple(int)语义为「创建指定字段数的空元组」,误写newTuple(i)会生成 size=i 的全 null 元组,必须写newTuple(1)再set(0, 值)。
4.3 编译、运行与真实回显
cd /root/datafu-lab
mvn -q -B compile
java -Xmx384m -cp "target/classes:$(cat cp.txt)" demo.DataFuDemo
运行回显:
MD5(apache-datafu) = f3faa986c556bc49f4131c987f22d04a
SHA-256(apache-datafu) = 07ee215182b6749bc26d1afa300da5f2bf1833d8f0c5396e56a2f36110dafc56
Base64Encode(datafu) = ZGF0YWZ1
ReservoirSample(2 of 1..10) = [1,9] size=2
MD5 / SHA-256 / Base64 输出确定,与 CentOS 8 机器一致;
ReservoirSample结果具有随机性(样本数恒为 2),每次运行元素可能不同。
4.4 打包为可分发 jar
mvn -B package
ls -l target/*.jar
执行后 target/ 下生成 datafu-lab-1.0.jar,可直接分发或供集群作业引用。
五、卸载与清理
5.1 移除工程依赖
删除 pom.xml 中 datafu-pig / pig / hadoop-common 的 <dependency> 节点后:
mvn -B clean
清除 target/ 编译产物。
5.2 清理本地仓库缓存
rm -rf ~/.m2/repository/org/apache/datafu
彻底清理全部依赖缓存(影响其它工程,慎用):
rm -rf ~/.m2/repository
5.3 卸载 JDK 与 Maven
apt-get remove -y openjdk-11-jdk maven
apt-get autoremove -y
确认:
which java mvn || echo "已卸载"
说明:
datafu-pig仅作为依赖下载到~/.m2,不向系统安装任何文件或服务,卸载系统包不影响业务工程源码。
六、常见问题排查
6.1 编译报 cannot access org.apache.hadoop.io.WritableComparable
Q1: 引入 datafu-pig 后编译示例为何找不到 org.apache.hadoop.io.WritableComparable?
A: UDF 依赖 Pig 的 Tuple,Tuple 继承 Hadoop 的 WritableComparable,而 datafu-pig 未传递 Pig/Hadoop。在 pom 中显式补充 org.apache.hadoop:hadoop-common(本文实测 2.7.7)即可。
6.2 找不到 org.apache.datafu:datafu
Q2: 按 org.apache.datafu:datafu:<ver> 写依赖为何解析失败?
A: 中央仓库没有 datafu 核心构件(实测确认),核心类在 datafu-pig 中,请使用 org.apache.datafu:datafu-pig:1.6.1。
6.3 SHA 构造参数写法
Q3: new SHA("SHA-256") 报 SHA-SHA-256 MessageDigest not available 怎么办?
A: datafu.pig.hash.SHA 构造参数只需算法后缀,内部会自动补 SHA- 前缀。应写 new SHA("256"),它最终对应 SHA-256。