Apache NiFi 2.x Processor、Input Port和Output Port 说明
1. Processor(处理器)
- 核心作用: 执行数据处理的原子操作,如读取、转换、路由、过滤、写入等。每个处理器通过**关系(Relationships)**定义数据流的去向(例如 success、failure、retry),需在连接时明确指定。支持配置调度策略(如执行频率、并发任务数)和敏感属性(如密码,需通过NiFi的敏感值加密机制保护)。
- 输入与输出: 通过输入连接接收数据(FlowFile),处理完成后根据关系将数据传递到下游。部分处理器仅有输入(如PutKafka)或输出(如GetFile)。
- 示例: FetchFile:从远程系统拉取文件。UpdateAttribute:修改FlowFile属性。RouteOnAttribute:根据属性值路由数据。
2. Input Port(输入端口)
- 核心作用: 作为子流程组或远程流程组的入口,接收来自父流程组或远程NiFi实例的数据。支持模块化设计,隐藏子流程内部逻辑,仅通过端口暴露输入接口。
- 关键规则: 名称必须在所属流程组内唯一,且需与外部连接的输出端口名称匹配。数据来源可以是: 同一NiFi实例的父流程组。远程NiFi实例的Remote Process Group的输出端口。
- 使用场景: 将复杂流程拆分为多个子流程组,通过输入端口串联。
3. Output Port(输出端口)
- 核心作用: 作为子流程组或远程流程组的出口,将数据发送到父流程组或远程NiFi实例。与输入端口配合,实现跨层级或跨实例的数据传递。
- 关键规则: 名称必须与目标输入端口完全匹配,否则连接无法建立。数据仅能发送到: 父流程组中的下游组件。远程NiFi实例的输入端口(通过Remote Process Group配置)。 不可直接连接同一子流程组内的其他组件。
- 使用场景: 子流程组处理完成后,通过输出端口将结果返回给父流程组。
三者协作关系
- 模块化设计: 通过流程组嵌套,用输入/输出端口定义子流程边界。例如: 父流程组调用子流程组时,数据通过子流程组的输入端口传入,处理后经输出端口返回。
- 数据流路径: Processor → Output Port:处理器处理完成后,通过关系(如success)将数据路由到输出端口。Input Port → Processor:输入端口接收外部数据后,传递给子流程组内的处理器处理。
- 跨实例通信: 使用Remote Process Group配置远程NiFi实例的URL,并通过其输入/输出端口实现跨集群数据传输。本地输出端口 → 远程输入端口(或反之)。
补充说明
- Remote Process Group(远程流程组): 需指定目标NiFi实例的URL,并选择其输入/输出端口建立连接。支持双向通信(发送数据到远程实例或从远程实例拉取数据)。
- Funnel(漏斗): 可选组件,用于将多个连接的数据合并到单一连接,简化复杂流程。
- 端口与背压: 输入/输出端口的连接支持配置背压(Back Pressure),防止数据堆积。
示例修正
假设一个跨实例数据流:
- 本地流程组: 使用GenerateFlowFile生成数据,通过Output Port发送到远程流程组。
- Remote Process Group: 配置远程NiFi实例的URL,并连接其Input Port。
- 远程流程组: 通过Input Port接收数据,由PutHDFS处理器写入HDFS。
总结
- Processor:数据处理的执行单元,依赖关系(Relationships)控制流程。
- Input/Output Port:模块化流程的核心,通过唯一命名和严格连接规则管理数据边界。
- 协作逻辑:通过端口连接实现层级化、分布式数据流,支持复杂业务解耦。