DeduplicateRecord Processor
描述
该处理器对记录集中的各个记录进行重复数据删除。 它可以使用内存中的哈希集或布隆过滤器在每个文件的基础上进行操作。 当配置分布式地图缓存时,它可以消除多个文件中的重复记录。
标签
属性
| 名称 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
| 去重策略 | single |
| 用于检测和路由重复记录的策略。在单个 FlowFile 内检测重复的选项在内存中运行,而跨多个 FlowFile 的检测则使用分布式映射缓存。 |
| Distributed Map Cache Client | | 控制器服务 API:DistributedMapCacheClientcn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | 当去重策略设置为'多文件'时,此属性是必需的。映射缓存将对每条记录原子性地检查缓存键是否存在,如果不存在则设置它。 |
| 缓存标识符 | | 可选的表达式语言字段,用于覆盖记录的计算缓存键。此字段有一个额外的可用属性:${record.hash.value},其中包含从动态属性(如果设置)或记录字段派生的缓存键。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Cache Entry Identifier | false |
| 对于每条记录,检查缓存标识符是否存在于分布式映射缓存中。如果不存在且此属性为 true,则将标识符放入缓存。 |
| Record Reader | | 控制器服务 API:RecordReaderFactorycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | 指定用于读取传入数据的 Controller Service |
| Record Writer | | 控制器服务 API:RecordSetWriterFactorycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | 指定用于写出记录的 Controller Service |
| Include Zero Record FlowFiles | true |
| 如果发送到重复或非重复关系的 FlowFile 不包含任何记录,将此属性设置为 `false` 会导致该 FlowFile 被丢弃。否则,空的 FlowFile 将被输出。 |
| Record Hashing Algorithm | SHA-256 |
| 用于散列缓存键的算法。 |
| 过滤器类型 | hash-set |
| 用于根据匹配的 RecordPath 条件确定记录是否已被见过的过滤器。如果选择哈希集,将使用 Java HashSet 对象对所有遇到的记录进行去重。如果选择布隆过滤器选项,将使用布隆过滤器。布隆过滤器选项内存占用较少,但有可能出现假阳性。 |
| Filter Capacity Hint | 25000 | 要处理的唯一记录总数的估计值。此数字越准确,BloomFilter 的假阴性就越少。 | |
| 布隆过滤器确定性 | 0.10 | 使用布隆过滤器类型时所需的假阳性概率。例如,使用 0.05 的值可保证有 5% 的概率结果为假阳性。此值越接近 1,结果越精确,但会占用更多存储空间。 |
动态属性
| 名称 | 值 | 描述 |
|---|---|---|
| 属性的名称。 | 指向记录字段的有效 RecordPath,该字段将包含在用于去重的缓存键中。 | 记录的缓存键通过组合每个动态属性的名称与其评估的记录值(由相应的 RecordPath 指定)生成。 |
关系 (Relationships)
| 名称 | 描述 | 自动终止 |
|---|---|---|
duplicate | 检测为重复的记录将路由到此关系。 | 否 |
failure | 如果无法与缓存通信,FlowFile将受到惩罚并路由到此关系 | 否 |
non-duplicate | 在缓存中找不到的记录将路由到此关系。 | 否 |
original | 除非发生致命错误,否则原始输入 FlowFile 将发送到此关系。 | 否 |
写入的 FlowFile 属性
| 名称 | 描述 |
|---|---|
record.count | 写入目标 FlowFile 的记录数。 |
状态管理
该组件不存储状态。
受限 (Restricted)
该组件不受限。
输入要求
该组件要求有传入连接。
系统资源考量
| 资源 | 描述 |
|---|---|
| MEMORY | HashSet 过滤器类型的内存空间与处理的唯一记录数成正比。BloomFilter 类型无论处理多少记录都使用固定内存。 |
| CPU | 如果选择了更高级的哈希算法,对任何特定记录进行哈希处理所需的时间可能会大幅增加。 |
详细说明
DeduplicateRecord
概述
此 Processor 既可以在单个记录集文件内去重,也可以跨多个文件去重,甚至可以利用 DistributedMapCacheClient Controller Service 在整个数据湖范围内去重。对于前者,它使用 HashSet 或布隆过滤器(bloom filter)在内存中进行极快且高精度的计算。对于后一种用例,它使用 该 Controller Service,将生成的哈希值与存储在 ACAL Lynxus 所支持的某种缓存中的 Map 缓存进行比对。
配置单文件去重
在名为 "Deduplication Strategy" 的配置属性下选择 "single file" 选项,然后选择使用布隆过滤器 还是 hash set。请注意设置与你所处理记录集的平均大小相匹配的大小上限。
配置多文件去重
在 "Deduplication Strategy" 下选择 "Multiple Files" 选项,然后配置一个 DistributedMapCacheClient 服务。缓存标识符(cache identifier)有以下几种配置方式:
- 不指定任何动态属性,对整条记录生成哈希。
- 通过动态属性指定参与计算的特定字段来生成哈希。
- 在 cache identifier 属性中手动指定单个 Record Path 语句。注意:
- 这种方式可以与 #1 和 #2 组合使用,因为它支持表达式语言,并且会把 #1 或 #2 计算出的哈希 以 EL 变量 record.hash.value 的形式暴露出来。示例: concat('${some.var}', -, '${record.hash.value}')
动态属性的作用
动态属性的属性名应当可读,取值应当是一个 Record Path 操作。这些 Record Path 操作用于从记录中 提取值,以组装出唯一标识符。示例如下:
- firstName => /FirstName
- lastName => /LastName
记录:
{
"firstName": "John",
"lastName": "Smith"
}
会先生成一个包含 "John" 和 "Smith" 的标识符,然后再基于最终值生成哈希。
如果任何一个 Record Path 缺失,会抛出异常,该 FlowFile 会被发送到 failure Relationship。