MergeRecord Processor
描述
此处理器将多个面向记录的 FlowFile 合并为一个 FlowFile,包含所有输入 FlowFile 的记录。
标签
使用场景
将多个任意记录合并以创建单个更大的文件
配置 "Record Reader" 以指定适合传入数据类型的 Record Reader。
配置 "Record Writer" 以指定适合所需输出数据类型的 Record Writer。
将 "Merge Strategy" 设置为 `Bin-Packing Algorithm`。
将 "Minimum Bin Size" 设置为合并输出文件的期望文件大小。例如,值 `1 MB` 将导致在至少有
1 MB 数据可用之前不合并数据(除非先达到 Max Bin Age)。如果没有期望的最小文件大小,保留默认值 `0 B`。
将 "Minimum Number of Records" 属性设置为应包含在合并输出文件中的最小 Record 数。例如,将值
设置为 `10000` 可确保输出文件中至少有 10,000 条 Record(除非先达到 Max Bin Age)。
将 "Max Bin Age" 设置为指定合并前保留数据的最长时间。这可以被视为一个“超时”,届时处理器将
合并其拥有的任何数据,即使尚未达到 "Minimum Bin Size" 和 "Minimum Number of Records"。始终建议设置该值。
如果没有其他延迟要求,合理的默认值可以是 `10 mins`。
将 'merged' Relationship 连接到流程中的下一个组件。自动终止(Auto-terminate)'original' Relationship。
多处理器协同场景
将数据中特定字段具有相同值的多个记录合并,以创建单个更大的文件
配置 "Record Reader" 以指定适合传入数据类型的 Record Reader。
配置 "Record Writer" 以指定适合所需输出数据类型的 Record Writer。
添加一个额外的属性。该属性的名称应描述数据据以合并在一起的字段。
该属性的值应是一个 RecordPath,用于指定 Record 属于哪个输出 FlowFile。
例如,要合并 "productSku" 字段具有相同值的数据,添加一个名为 `productSku`、值为 `/productSku` 的属性。
将 "success" Relationship 连接到 MergeRecord。
自动终止(Auto-terminate)"original" Relationship。
配置 "Record Reader" 以指定适合传入数据类型的 Record Reader。
配置 "Record Writer" 以指定适合所需输出数据类型的 Record Writer。
将 "Merge Strategy" 设置为 `Bin-Packing Algorithm`。
将 "Minimum Bin Size" 设置为合并输出文件的期望文件大小。例如,值 `1 MB` 将导致在至少有
1 MB 数据可用之前不合并数据(除非先达到 Max Bin Age)。如果没有期望的最小文件大小,保留默认值 `0 B`。
将 "Minimum Number of Records" 属性设置为应包含在合并输出文件中的最小 Record 数。例如,将值
设置为 `10000` 可确保输出文件中至少有 10,000 条 Record(除非先达到 Max Bin Age)。
将 "Maximum Number of Records" 属性设置为至少与 "Minimum Number of Records." 一样大的值。如果无需限制每个文件的
最大记录数,可以将此数字设置为一个永远不会达到的值,例如 `1000000000`。
将 "Max Bin Age" 设置为指定合并前保留数据的最长时间。这可以被视为一个“超时”,届时处理器将
合并其拥有的任何数据,即使尚未达到 "Minimum Bin Size" 和 "Minimum Number of Records"。始终建议设置该值。
如果没有其他延迟要求,合理的默认值可以是 `10 mins`。
将 "Correlation Attribute Name" 属性的值设置为你在 PartitionRecord 处理器中添加的属性的名称。例如,如果根据
"productSku" 字段合并数据,PartitionRecord 中的属性名为 `productSku`,因此 "Correlation Attribute Name" 属性的值应
为 `productSku`。
将 "Maximum Number of Bins" 属性设置为至少与 Correlation Attribute 将呈现的不同值数量一样大的值。
例如,如果你预期有 1,000 个不同的 SKU,请将此值设置为至少 `1001`。但不建议将该值设置为超过 10,000。
将 'merged' Relationship 连接到流程中的下一个组件。
自动终止(Auto-terminate)'original' Relationship。
属性
| 名称 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
| 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 |
| Merge Strategy | Bin-Packing Algorithm |
| 指定用于合并记录的算法。'Defragment'(碎片整理)算法将相关联的 Fragment 属性重新组合为单个一致的 FlowFile。'Bin-Packing'(装箱)算法生成一个由任意选择的 FlowFile 填充的 FlowFile |
| Correlation Attribute Name | | 如果指定,仅当两个 FlowFile 具有相同的此属性值时才会将它们放入同一个 bin 中。如果未指定,FlowFile 将按照从队列中拉取的顺序进行分组。 | |
| Attribute Strategy | Keep Only Common Attributes |
| 确定哪些 FlowFile 属性应添加到捆绑包中。如果选择 'Keep All Unique Attributes',则捆绑包中任何 FlowFile 上的任何属性都会被保留,除非其值与另一个 FlowFile 的值冲突。如果选择 'Keep Only Common Attributes',则仅保留捆绑包中所有 FlowFile 上都存在且值相同的属性。 |
| Minimum Number of Records | 1 | bin 中包含的最小记录数 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Maximum Number of Records | 1000 | bin 中包含的最大记录数。这是一个 '软限制',因为如果将 FlowFile 添加到 bin 中,该 FlowFile 中的所有记录都会被添加,因此此限制可能会超出最多最后一个输入 FlowFile 中的记录数。 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Minimum Bin Size | 0 B | 料箱的最小尺寸 | |
| Maximum Bin Size | | bin 的最大大小。如果未指定,则没有最大值。这是一个'软限制',因为如果将 FlowFile 添加到 bin 中,该 FlowFile 中的所有记录都将被添加,因此此限制可能会超出最多一个输入 FlowFile 的字节数。 | |
| Max Bin Age | | 触发 bin 完成的最大 bin 存在时间。预期格式为 <持续时间> <时间单位>,其中 <持续时间> 是正整数,时间单位为秒、分钟或小时。 | |
| Maximum Number of Bins | 10 | 指定可以同时保存在内存中的最大 bin 数量。此数量不应小于此处理器的最大并发线程数,否则创建的 bin 通常仅包含单个传入的 FlowFile。 |
关系 (Relationships)
| 名称 | 描述 | 自动终止 |
|---|---|---|
failure | 如果无法创建bundle,则用于创建bundle的所有FlowFiles将转为失败 | 否 |
merged | 包含合并记录的 FlowFile | 否 |
original | 用于创建捆绑包的 FlowFiles | 否 |
读取的 FlowFile 属性
| 名称 | 描述 |
|---|---|
fragment.identifier | 仅在 <Merge Strategy> 属性设置为 Defragment 时适用。所有具有相同此属性值的 FlowFile 将被捆绑在一起。 |
fragment.count | 仅在 <Merge Strategy> 属性设置为 Defragment 时适用。此属性必须存在于具有相同 fragment.identifier 属性值的所有 FlowFile 上。同一包中的所有 FlowFile 必须具有相同的此属性值。此属性的值指示给定包中应有多少 FlowFile。 |
写入的 FlowFile 属性
| 名称 | 描述 |
|---|---|
record.count | 合并的 FlowFile 将具有 'record.count' 属性,指示写入 FlowFile 的记录数。 |
mime.type | Record Writer指示的 MIME 类型 |
merge.count | 合并到此捆绑包中的 FlowFile 数量 |
merge.bin.age | 箱被合并和输出时的存在时间(毫秒)。实际上这是此捆绑包中任何 FlowFile 在此处理器中等待输出的最长时间 |
merge.uuid | 将添加到原始 FlowFiles 属性的合并 FlowFile 的 UUID |
merge.completion.reason | 此处理器允许为合并 FlowFile 配置多个阈值。此属性指示哪个阈值导致 FlowFile 被合并。有关每个可能值及其含义的说明,请参阅处理器的使用/文档并查看'附加详细信息'页面。 |
<Attributes from Record Writer> | 配置的Record Writer返回的任何属性都将添加到FlowFile中。 |
状态管理
该组件不存储状态。
受限 (Restricted)
该组件不受限。
输入要求
该组件要求有传入连接。
详细说明
MergeRecord
简介
MergeRecord Processor 允许用户把多个由面向记录的数据(任何存在可用 Record Reader 的数据格式) 组成的 FlowFile 合并为一个更大的 FlowFile。在把数据推送到偏好大批次数据的下游系统(例如 HDFS)之前,这样做可能更好;或者为了通过减少系统中流转的 FlowFile 数量来提升 Lynxus 流程的 性能(从而降低 FlowFile Repository、Provenance Repository、Content Repository 和 FlowFile 队列上的竞争压力)。
该 Processor 会创建若干个"箱(bin)"来放置 FlowFile。默认最多使用 5 个箱,但可以通过更新
FlowFile 如何装箱
Processor 决定把 FlowFile 放入哪个箱,取决于若干配置选项。首先是 Merge Strategy。
Merge Strategy 可以设置为两个选项之一:Bin Packing Algorithm(装箱算法)或 Defragment
(碎片重组)。如果目标只是把较小的 FlowFile 合并成更大的 FlowFile,应使用
Bin Packing Algorithm。该算法根据以下条件选择箱:按大小和
当需要把记录显式地分配到同一个箱时,可以使用 "Defragment" 合并策略。例如,如果用 SplitRecord Processor 拆分了数据,每个拆分结果可以独立处理,之后再用本 Processor (Merge Strategy 设为 Defragment)合并回来。要在这种配置下把 FlowFile 加入同一个箱, 这些 FlowFile 的 "fragment.identifier" Attribute 必须具有相同的值。具有相同标识符的每个 FlowFile 还必须具有相同的 "fragment.count" Attribute 值(表示箱中应包含多少个 FlowFile)以及唯一的 "fragment.index" Attribute 值,以便正确排序。
要被放入同一个箱,两个 FlowFile 必须是"相似(like)的"。两个相似 FlowFile 必须具有相同的
schema;如果设置了
只把某个字段值相同的记录装进同一个箱往往很有用。例如,如果有销售点(POS)数据,也许希望把 属于同一门店(由 'storeId' 字段标识)的记录装在一起。这可以通过在 MergeRecord 之前使用 PartitionRecord Processor 来实现。该 Processor 允许把一个或多个字段配置为分区标准, 并会为对应的值创建 Attribute。如有需要,还可以用 UpdateAttribute Processor 把多个 Attribute 组合为单个关联属性(如上所述)。更多细节请参阅这些 Processor 的文档。
箱何时合并
上面讨论了如何为给定的 FlowFile 选择箱。一旦创建了箱并向其中添加了 FlowFile,就需要某种方式 判断箱何时"满了",从而把这些 FlowFile 合并成一个 "merged" FlowFile。
如果
如果
箱合并成单个 FlowFile 之后,有时了解箱为何在那个时刻被合并会很有用。例如,如果达到允许的 最大箱数量,合并产生的 FlowFile 可能只包含远少于预期数量的记录。为帮助理解这种行为, 该 Processor 在创建合并的 FlowFile 时会发出 JOIN Provenance 事件,该事件包含一个 "Details" 字段,解释箱为何在那个时刻被合并。例如,如果箱达到了最小阈值且之后没有再添加 FlowFile,事件会显示 "Records Merged due to: Bin is full";如果箱是因为配置的最大箱数量 已满、需要为新箱腾出空间而被合并,事件则可能显示 "Records Merged due to: Maximum number of bins has been exceeded"。
失败发生时
当一个箱被装满时,Processor 负责把这些 FlowFile 中的所有记录合并成单个 FlowFile。如果 Processor 因任何原因失败(例如无法从某个输入 FlowFile 中读取记录),该箱中的所有 FlowFile 都会被路由到 'failure' Relationship。Processor 不会跳过出问题的那个 FlowFile 而合并其他的。选择这种行为是出于两点考虑:首先,缺少了那些问题记录,箱可能并不 真正算满,因为没有那些记录可能达不到最小箱大小;其次,更重要的是,如果问题 FlowFile 在问题记录之前包含 100 条"好"记录,这 100 条记录已经写入了 "merged" FlowFile,我们无法撤销已写入的记录。如果把这 100 条记录继续发送出去,并把问题 FlowFile 路由到 'failure',那么一旦 "failure" Relationship 最终又被路由回 MergeRecord,就可能不断重复这 100 条已成功处理的记录。
示例
为了更好地理解该 Processor 的工作方式,我们给出几个示例。为简单起见,这些示例使用 CSV 格式的数据并把合并结果也写为 CSV 格式,但数据格式本身并不重要,只要有能读取数据的 Record Reader 和能以期望格式写出数据的 Record Writer 即可。
示例 1 - 把许多小 FlowFile 组成批次
当我们想把许多小 FlowFile 组成批次以创建一个更大的 FlowFile 时,可以通过 "Bin Packing Algorithm" 合并策略实现。思路是在最小/最大记录数和箱大小的范围内, 尽可能多地把 FlowFile 打包在一起。假设设置了以下属性:
| 属性名 | 属性值 |
|---|---|
| Merge Strategy | Bin Packing Algorithm |
| Minimum Number of Records | 3 |
| Maximum Number of Records | 5 |
再假设队列中有如下数据,schema 包含 Name 和 Age 两个字段:
| FlowFile ID | FlowFile 内容 |
|---|---|
| 1 | Mark, 33 |
| 2 | John, 45 Jane, 43 |
| 3 | Jake, 3 |
| 4 | Jan, 2 |
由于没有配置 Correlation Attribute,且所有 FlowFile 具有相同的 schema,Processor 会 尝试把这些 FlowFile 全部加入同一个箱。因为 Minimum Number of Records 是 3、 Maximum Number of Records 是 5,所有 FlowFile 都会被加入同一个箱。输出是一个内容为 如下所示的单个 FlowFile:
Mark, 33 John, 45 Jane, 43 Jake, 3 Jan, 2
Processor 运行时,会把能从队列取到的 FlowFile 都装箱。之后,它会合并任何"足够满"的箱。 因此,如果队列中只有 3 个 FlowFile,这 3 个会被加入,等第 4 个出现时会在下一次迭代中 创建新箱。但如果队列中有 8 个,只有 5 个会被加入第一个箱,另外 3 个会被加入第二个箱, 该箱因为也达到了最小阈值 3 而会被合并。