Apache DataFu 常用 CLI 命令与工具详解
汇总 Apache DataFu 工程常用的 Maven 构建与依赖管理命令、JVM 运行命令与 jar 检视命令,并给出哈希、采样、集合、统计、工具等核心工具类 API 速查与典型调用,全部命令均附真实回显示例,便于对照排查。
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;
说明:本文实测环境未安装
pigCLI,未能完成 Pig 引擎的加载运行(直接以org.apache.pig.Main调用返回退出码 8),上述脚本为集群标准用法;DataFu UDF 的功能正确性已在第一节的 Java 直接调用中得到实测验证。
三、核心工具类 API 速查
以下类均由 datafu-pig 提供(datafu.pig.* 包)。
3.1 哈希(datafu.pig.hash)
| 类 | 用途 | 典型调用 |
|---|---|---|
MD5 | MD5 摘要 | new MD5().exec(tuple) → 32 位十六进制 |
SHA | SHA-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 / BagSplit | DataBag 拼接、分组、连接、拆分 |
DistinctBy / CountEach / Enumerate / ReverseEnumerate | 去重、计数、枚举 |
FirstTupleFromBag / TupleFromBag / ZipBags | bag 取值与并排 |
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 | 基数估计(去重计数) | 默认构造 |
WilsonBinConf | Wilson 置信区间 | 默认构造 |
3.5 工具与随机(datafu.pig.util / random)
| 类 | 用途 | 典型调用 |
|---|---|---|
Base64Encode / Base64Decode | Base64 编解码 | new Base64Encode().exec(tuple) |
Coalesce | 取首个非空值 | new Coalesce()、new Coalesce("0") |
TransposeTupleToBag | 元组转 bag | 默认构造 |
Assert / AssertUDF | 断言校验 | 默认构造 |
In / InUDF | 成员判断 | 默认构造 |
RandInt / RandomUUID | 随机整数 / UUID | 默认构造 |
3.6 其他能力包
| 包 | 代表类/能力 |
|---|---|
datafu.pig.linkanalysis | PageRank 等链接分析 |
datafu.pig.sessions | 会话化 |
datafu.pig.urls | URL 解析 |
datafu.pig.geo | 地理距离(Haversine/GeoHash) |
datafu.pig.stats.entropy | 熵计算 |
com.clearspring.analytics(重定位) | HyperLogLog、流式基数估计 |
四、命令使用小结
4.1 常用命令一览
| 目的 | 命令 |
|---|---|
| 查依赖树 | mvn -B dependency:tree |
| 生成 classpath | mvn -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> |
| 检视 jar | jar 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 ... <类名>,二者均已实测可用。