Apache DataFu 常用 CLI 命令与工具详解

汇总 Apache DataFu 工程常用的 Maven 构建与依赖管理命令、JVM 运行命令与 jar 检视命令,并给出哈希、采样、集合、统计、工具等核心工具类 API 速查与典型调用,全部命令均附真实回显示例,便于对照排查。

Apache DataFuApache DataFu2026/10/11

Apache DataFu 常用 CLI 命令与工具详解

Apache DataFu 没有独立命令行为入口,日常「命令」主要来自构建工具 Maven、JVM 运行命令以及对 jar 的检视命令;能力层面则以 datafu.pig.* 下的工具类/UDF API 为主。本文汇总实测可用的构建与运行命令,并给出核心 API 速查。

一、构建与依赖管理命令

1.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
[INFO] |  +- junit:junit:jar:4.11:compile

用于确认 DataFu 版本、是否发生版本冲突(可加 -Dverbose 展开被省略的冲突项)。

1.2 生成运行时 classpath

mvn -q -B dependency:build-classpath -Dmdep.outputFile=cp.txt

把全部依赖 jar 路径写入 cp.txt,随后可拼接出完整 classpath:

java -cp "target/classes:$(cat cp.txt)" demo.DataFuDemo

实测注意:仅引入 datafu-pig 时 cp.txt 只含 datafu-pig-1.6.1.jar——Pig/Hadoop 为 provided,不会出现,直接运行 UDF 需另补。

1.3 拷贝依赖到本地目录

mvn -B dependency:copy-dependencies -DoutputDirectory=libs

把依赖 jar 复制到 libs/,便于离线分发或提交集群时随附。

1.4 编译

mvn -B compile

实测回显:

[INFO] Compiling 1 source file to /root/datafu-lab/target/classes
[INFO] BUILD SUCCESS

1.5 运行测试

mvn -B test

无测试用例时会显示 No tests to run;若工程含 src/test/java 下的用例,会执行并输出 surefire 报告。

1.6 打包

mvn -B package

实测产出:

-rw-r--r-- 1 root root 3305 ... target/datafu-lab-1.0.jar

如需生成含依赖的「胖 jar」以提交集群,可引入 maven-assembly-plugin / maven-shade-plugin:

mvn -B package -DskipTests

1.7 清理

mvn -B clean

删除 target/ 编译产物。

二、运行与检视命令

2.1 运行主类

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

堆内存建议 256–512 MB(本文统一 -Xmx384m)。

2.2 检视 DataFu jar 内容

JAR=~/.m2/repository/org/apache/datafu/datafu-pig/1.6.1/datafu-pig-1.6.1.jar
jar tf "$JAR" | grep -E '^datafu/pig/(hash|sampling|stats)/[^/]*\.class$'

实测可见 datafu/pig/hash/MD5.class、datafu/pig/sampling/ReservoirSample.class、datafu/pig/stats/Median.class 等核心类,可用于确认某能力是否包含在当前版本中。

2.3 查看类构造签名

javap -cp "$(cat cp.txt)" datafu.pig.hash.Hasher

实测输出(截取):

public datafu.pig.hash.Hasher();
public datafu.pig.hash.Hasher(java.lang.String);
public datafu.pig.hash.Hasher(java.lang.String, java.lang.String);
public static long longFromHex(java.lang.String);

这是确认 UDF「构造参数」最直接的方式。

2.4 Pig 脚本加载 UDF(集群用法)

在真实 Pig 环境中,通过 REGISTER / DEFINE 加载 DataFu UDF:

REGISTER /path/to/datafu-pig-1.6.1.jar;

DEFINE md5 datafu.pig.hash.MD5();
DEFINE rs  datafu.pig.sampling.ReservoirSample('2');

words = LOAD 'words.txt' AS (word:chararray);
hashed = FOREACH words GENERATE word, md5(word);
DUMP hashed;

nums = LOAD 'nums.txt' AS (n:int);
grouped = GROUP nums ALL;
sampled = FOREACH grouped GENERATE rs(nums);
DUMP sampled;

说明:本文实测环境未安装 pig CLI,未能完成 Pig 引擎的加载运行(直接以 org.apache.pig.Main 调用返回退出码 8),上述脚本为集群标准用法;DataFu UDF 的功能正确性已在第一节的 Java 直接调用中得到实测验证。

三、核心工具类 API 速查

以下类均由 datafu-pig 提供(datafu.pig.* 包)。

3.1 哈希(datafu.pig.hash)

类用途典型调用
MD5MD5 摘要new MD5().exec(tuple) → 32 位十六进制
SHASHA-2 摘要new SHA("256")、new SHA("512")
Hasher通用哈希new Hasher("murmur3"),静态 Hasher.longFromHex(hex)
HasherRand带随机种子的哈希new HasherRand("seed")

3.2 采样(datafu.pig.sampling)

类用途典型调用
ReservoirSample蓄水池等量抽样new ReservoirSample("2"),accumulate(bagTuple) 后 getValue()
SimpleRandomSample简单随机抽样new SimpleRandomSample("1000")
WeightedReservoirSample按权重抽样new WeightedReservoirSample("100", "2")
SampleByKey按键概率抽样new SampleByKey("0.1", "seed")

Java 直接调用采样示例(实测可运行):

ReservoirSample rs = new ReservoirSample("2");
DataBag input = BagFactory.getInstance().newDefaultBag();
for (int i = 1; i <= 10; i++) {
  Tuple row = TupleFactory.getInstance().newTuple(1);
  row.set(0, i);
  input.add(row);
}
Tuple group = TupleFactory.getInstance().newTuple(1);
group.set(0, input);
rs.accumulate(group);
DataBag sampled = rs.getValue();   // 实测 size=2,元素随机

3.3 集合与 DataBag 操作(datafu.pig.sets / bags)

类用途
SetUnion / SetIntersect / SetDifference集合并/交/差
BagConcat / BagGroup / BagJoin / BagSplitDataBag 拼接、分组、连接、拆分
DistinctBy / CountEach / Enumerate / ReverseEnumerate去重、计数、枚举
FirstTupleFromBag / TupleFromBag / ZipBagsbag 取值与并排

3.4 统计(datafu.pig.stats)

类用途典型调用
Median中位数new Median()
Quantile分位数new Quantile("0.5", "0.9", "0.99")
StreamingQuantile流式分位数(内存受限)new StreamingQuantile("0.5")
VAR / IntVAR / LongVAR / DoubleVAR / FloatVAR方差默认构造
HyperLogLogPlusPlus基数估计(去重计数)默认构造
WilsonBinConfWilson 置信区间默认构造

3.5 工具与随机(datafu.pig.util / random)

类用途典型调用
Base64Encode / Base64DecodeBase64 编解码new Base64Encode().exec(tuple)
Coalesce取首个非空值new Coalesce()、new Coalesce("0")
TransposeTupleToBag元组转 bag默认构造
Assert / AssertUDF断言校验默认构造
In / InUDF成员判断默认构造
RandInt / RandomUUID随机整数 / UUID默认构造

3.6 其他能力包

包代表类/能力
datafu.pig.linkanalysisPageRank 等链接分析
datafu.pig.sessions会话化
datafu.pig.urlsURL 解析
datafu.pig.geo地理距离(Haversine/GeoHash)
datafu.pig.stats.entropy熵计算
com.clearspring.analytics(重定位)HyperLogLog、流式基数估计

四、命令使用小结

4.1 常用命令一览

目的命令
查依赖树mvn -B dependency:tree
生成 classpathmvn -q -B dependency:build-classpath -Dmdep.outputFile=cp.txt
拷贝依赖mvn -B dependency:copy-dependencies -DoutputDirectory=libs
编译mvn -B compile
测试mvn -B test
打包mvn -B package
清理mvn -B clean
运行java -Xmx384m -cp "target/classes:$(cat cp.txt)" <MainClass>
检视 jarjar tf <datafu-jar>
查构造签名javap -cp "$(cat cp.txt)" <类名>

4.2 常见问题

Q1: dependency:build-classpath 只输出 datafu-pig 一项,是否漏依赖?

A: 不是。datafu-pig 的 Pig/Hadoop 为 provided 不传递,需按运行形态自行补充。

Q2: 运行时报 NoClassDefFoundError: org/apache/hadoop/io/WritableComparable?

A: 缺少 hadoop-common,把 -cp 补充 hadoop-common jar 或在 pom 加依赖。

Q3: 如何确认某个 UDF 类在当前版本中存在?

A: 用 jar tf 过滤包名,或直接 javap -cp ... <类名>,二者均已实测可用。