Apache DataFu 配置参数详解

系统讲解 Apache DataFu 各子模块的构成与可调参数,包括哈希、采样、统计类 UDF 的构造参数取值,序列化与编码说明,Maven 依赖管理、作用域与排除,以及 JDK 与 JVM 内存等运行参数配置与实测建议。

Apache DataFuApache DataFu2026/10/11

Apache DataFu 配置参数详解

Apache DataFu 是「库」形态的 Java 组件,其配置不像服务那样集中在配置文件里,而是分散在三个层面:依赖声明(Maven 坐标与作用域)、UDF/工具类的构造参数、运行期 JVM 与集群资源参数。本文基于对 datafu-pig:1.6.1、datafu-hourglass:1.6.1 构件的实测,逐层说明可调项与推荐取值。

一、子模块构成

1.1 构件总览

Maven 中央仓库 org/apache/datafu/ 下可用构件(实测版本):

构件最新版本定位
datafu-pig1.6.1核心库 + Pig UDF(datafu.pig.*),本文重点
datafu-hourglass1.6.1面向 Hadoop 的增量/日期分区作业框架(datafu.hourglass.*)
datafu-spark_2.122.1.0Spark(Scala 2.12)集成库
datafu-spark_2.11—Spark(Scala 2.11)集成库,按集群 Scala 版本选择

重要:不存在 org.apache.datafu:datafu 核心库构件。DataFu 的核心工具类与 UDF 实际全部打包在 datafu-pig 中,因此「引入核心库」请使用 datafu-pig。

1.2 datafu-pig 内部结构

对 datafu-pig-1.6.1.jar 实测统计共 1437 个 class,datafu.pig.* 为 DataFu 自身的 UDF 包,另有若干被重定位(shade 到 datafu/ 前缀)的第三方库,便于在 Pig 中避免冲突:

包说明
datafu.pig.hash / hash.lsh哈希、局部敏感哈希
datafu.pig.sampling采样:蓄水池、随机、按键、加权
datafu.pig.bagsDataBag 集合操作
datafu.pig.sets集合交/并/差
datafu.pig.stats / stats.entropy统计、中位数、分位数、方差、熵
datafu.pig.util工具 UDF(Base64、Coalesce、断言等)
datafu.pig.random随机数、随机 UUID
datafu.pig.sessions / linkanalysis / urls / geo / text.opennlp会话化、链接分析、URL、地理、NLP
datafu.com.clearspring.analytics.*重定位的 stream-lib(HyperLogLog 等基数估计)
datafu.org.apache.commons.math、datafu.com.google.common.*、datafu.it.unimi.dsi.fastutil重定位的数学/集合基础库

1.3 datafu-hourglass 内部结构

实测 datafu-hourglass-1.6.1.jar 包结构:datafu.hourglass.avro、fs、jobs、mapreduce、model、schemas。其关键类包括增量作业 IncrementalJob / PartitionPreservingIncrementalJob / PartitionCollapsingIncrementalJob、日期范围可配置接口 DateRangeConfigurable、执行计划 ExecutionPlanner、分区器 TimePartitioner。该模块面向 Hadoop MapReduce 作业编排,配置以 Job 对象与属性方式注入,需 Hadoop 运行环境,本文不做运行验证,参数细节请以对应 Job 类 API 为准。

二、依赖管理参数

2.1 作用域(scope)

datafu-pig 自身把 Pig / Hadoop 声明为 provided,因此不会传递引入。工程侧应根据运行形态选择 scope:

场景datafu-pigpig / hadoop-common说明
独立 Java 工程直接调用 UDFcompilecompile(需自行补充)实测:仅引入 datafu-pig 时 mvn dependency:build-classpath 只输出 datafu-pig jar
提交到已含 Pig/Hadoop 的集群compileprovided避免与集群内置版本冲突
仅写 Pig 脚本、由集群执行providedprovided依赖只参与编译,不打包

2.2 dependencyManagement 统一版本

多模块工程建议用 dependencyManagement 统一版本,子模块只声明 groupId+artifactId:

<properties>
  <datafu.version>1.6.1</datafu.version>
  <pig.version>0.17.0</pig.version>
  <hadoop.version>2.7.7</hadoop.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.datafu</groupId>
      <artifactId>datafu-pig</artifactId>
      <version>${datafu.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.pig</groupId>
      <artifactId>pig</artifactId>
      <version>${pig.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

2.3 exclusions 排除冲突项

若工程已自带高版本 Hadoop,可在引入 datafu-pig 时排除其可能带入的传递依赖(本例 datafu-pig 本身不传递 Pig/Hadoop,但若换用 datafu-spark_* 等则需关注):

<dependency>
  <groupId>org.apache.datafu</groupId>
  <artifactId>datafu-pig</artifactId>
  <version>1.6.1</version>
  <exclusions>
    <exclusion>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
    </exclusion>
  </exclusions>
</dependency>

2.4 Spark 集成坐标

在 Spark 工程使用 DataFu 时按 Scala 版本选择:

<dependency>
  <groupId>org.apache.datafu</groupId>
  <artifactId>datafu-spark_2.12</artifactId>
  <version>2.1.0</version>
  <scope>provided</scope>
</dependency>

provided 交由 Spark 集群运行时提供,避免与集群 Spark 版本冲突。

三、UDF 构造参数(核心可调项)

以下构造签名均来自对 datafu-pig-1.6.1.jar 的 javap 实测。

3.1 哈希相关(datafu.pig.hash)

类构造签名(实测)参数含义与取值
MD5MD5()无参,输出 32 位十六进制摘要
SHASHA(String) / SHA()参数为算法后缀,内部补 SHA- 前缀。写 "256" → SHA-256,"512" → SHA-512。实测 new SHA("SHA-256") 会抛 SHA-SHA-256 MessageDigest not available
HasherHasher() / Hasher(String) / Hasher(String, String)第 1 参为算法名,第 2 参可指定 Provider;另提供静态方法 longFromHex / intFromHex
HasherRandHasherRand() / HasherRand(String)可选随机种子参数,便于结果可复现

哈希输出为确定性结果,实测两机一致,例如:

MD5(apache-datafu)     = f3faa986c556bc49f4131c987f22d04a
SHA-256(apache-datafu) = 07ee215182b6749bc26d1afa300da5f2bf1833d8f0c5396e56a2f36110dafc56

3.2 采样相关(datafu.pig.sampling)

类构造签名(实测)可调参数
ReservoirSampleReservoirSample(String)参数为样本数 k,如 '2'。基于蓄水池算法,单遍扫描即可
SimpleRandomSampleSimpleRandomSample() / SimpleRandomSample(String)可选样本数参数
WeightedReservoirSampleWeightedReservoirSample(String, String)第 1 参样本数;第 2 参为权重字段索引
SampleByKeySampleByKey(String) / SampleByKey(String, String)第 1 参抽样概率;第 2 参可选随机种子

采样类为随机抽取:ReservoirSample 样本数固定,抽取元素随机。实测同一程序两次运行分别得到 [1,9](Ubuntu)与 [6,10](CentOS 8),属正常行为。若需结果可复现,优先使用带种子参数的 SampleByKey(String, String) 或 HasherRand(String)。

3.3 统计相关(datafu.pig.stats)

类构造签名(实测)可调参数
QuantileQuantile(String...)变参,可指定多个分位点
StreamingQuantileStreamingQuantile(String...)变参,流式(内存受限)分位数估计
MedianMedian()中位数
VAR / IntVAR / LongVAR / DoubleVAR / FloatVAR默认构造按数据类型计算方差
HyperLogLogPlusPlus默认构造基数(去重计数)估计
StreamingMedian默认构造流式中位数

分位数类通过构造参数指定要计算的 K 值,用于在有限内存下估计分布,适合大数据集。

3.4 工具与编码相关(datafu.pig.util / random)

类构造签名(实测)可调参数
Base64EncodeBase64Encode()无参,输出标准 Base64 字符串
Base64DecodeBase64Decode()无参
CoalesceCoalesce() / Coalesce(String)可选默认值,用于取首个非空字段
RandIntRandInt()无参,生成随机整数
RandomUUIDRandomUUID()无参,生成随机 UUID

实测编码输出:

Base64Encode(datafu) = ZGF0YWZ1

3.5 序列化与编码说明

  • DataFu UDF 的输入输出数据类型由 Pig 的 Tuple / DataBag 承载;在 Java 工程中直接调用时用 TupleFactory.getInstance().newTuple(...) 构造元组、BagFactory.getInstance().newDefaultBag() 构造 bag。
  • 序列化本身由 Pig/Hadoop 的 Writable 机制处理,DataFu 不额外引入自定义序列化协议,因此不存在独立序列化配置项。
  • 对二进制哈希结果,Hasher 提供 longFromHex/intFromHex 便于把十六进制摘要还原为数值参与计算。

四、JDK 与 JVM 内存参数

4.1 JDK 版本

DataFu 兼容 JDK 8 与 JDK 11(实测:CentOS 8 用 JDK 8、Ubuntu 22.04 用 JDK 11 均编译运行成功)。maven-compiler-plugin 建议:

<properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
</properties>

以 JDK 11 编译、目标字节码 1.8,可同时兼容两类运行环境。

4.2 JVM 堆内存

DataFu 单次调用的内存开销不大,按规范建议把堆限制在 256–512 MB。实测统一使用:

java -Xmx384m -cp "target/classes:$(cat cp.txt)" demo.DataFuDemo
  • -Xmx256m:内存极受限场景的最小可用值。
  • -Xmx384m:本文实测默认值,兼顾稳定与占用。
  • -Xmx512m:处理较大 bag(如大样本量采样、分位数估计)时的上限。

4.3 集群侧资源参数

当 DataFu UDF 在 Pig on MapReduce 上运行时,运行内存主要由集群参数决定(以下为通用 MapReduce 参数,供参考):

参数作用
mapreduce.map.memory.mb映射任务可用内存
mapreduce.reduce.memory.mb归约任务可用内存
mapreduce.map.java.opts / mapreduce.reduce.java.opts任务 JVM 参数(如 -Xmx)
pig.exec.reducers.bytes.per.reducer控制 reducer 数量,影响聚合型 UDF(Median/Quantile/VAR)压力

建议任务 JVM 的 -Xmx 取任务内存的约 80%,为堆外与本地库留出余量。

五、参数配置建议汇总

5.1 选型建议

  • 只用核心工具类/UDF:引入 datafu-pig,独立 Java 工程补 pig+hadoop-common,集群工程用 provided。
  • Spark 场景:引入对应的 datafu-spark_2.12(或 2.11),scope 用 provided。
  • Hadoop 增量作业编排:datafu-hourglass,需 Hadoop 环境。

5.2 可复现性建议

  • 需要稳定输出:哈希类(MD5/SHA/Hasher)天然确定;随机类优先选带种子构造(HasherRand(String)、SampleByKey(String,String))。
  • 需要稳定抽样结果但不想改代码:固定输入数据顺序并接受随机性,或在业务侧用固定种子封装。

5.3 常见参数陷阱

Q1: 用 new SHA("SHA-256") 报错?

A: 构造参数只填后缀,用 new SHA("256")。

Q2: 只加 datafu-pig 依赖,编译却报找不到 org.apache.hadoop.io.WritableComparable?

A: provided 依赖不会传递,需显式补 hadoop-common。

Q3: dependency:build-classpath 只输出 datafu-pig 一项,是否解析失败?

A: 正常。因为 datafu-pig 未声明可传递依赖,需按场景自行补充 Pig/Hadoop。