Apache NiFi技术问询:如何以单个处理器替代5个FetchHDFS处理器实现HDFS文件读取
替代多个FetchHDFS处理器的NiFi解决方案
嘿,我来给你几个实用的方案,帮你摆脱维护5个重复FetchHDFS处理器的麻烦,同时完美满足保留HDFS文件、支持多次测试的需求:
方案1:ListHDFS + 单个FetchHDFS(推荐,灵活适配文件变化)
这是最通用的方案,刚好匹配你的场景——因为FetchHDFS本身不会删除源文件(只有GetHDFS会自动删除),搭配ListHDFS可以自动发现目录下的目标文件:
- 配置
ListHDFS处理器:- 设置
HDFS Directory为你的目标XML文件所在路径 - 将
Listing Strategy设置为Modified Timestamp或Filename,确保能正确识别目标文件 - 关键:不要勾选
Delete Source File,保证源文件留存以便多次测试 - 配置
State Management:开启状态跟踪可以避免重复处理文件,如果需要重新测试,只需手动清除处理器状态,或者设置Max Age for State让状态自动过期,就能重新扫描处理所有文件
- 设置
- 配置单个
FetchHDFS处理器:- 将
HDFS File属性设置为${filename}(ListHDFS会把文件完整路径自动写入filename属性) - 连接
ListHDFS的success关系到FetchHDFS的输入
- 将
- 完成配置后,
ListHDFS会扫描目录下的所有XML文件,每个文件生成一个流文件,FetchHDFS会逐个读取文件内容,最终输出的流文件可以直接传入TransformXML处理器。
方案2:GenerateFlowFile + 单个FetchHDFS(适合固定处理指定5个文件)
如果你的目标就是那5个固定的XML文件,不需要扫描目录,可以用这个更直接的方式:
- 配置
GenerateFlowFile:- 设置
Batch Size为5,每次生成5个流文件 - 在
Custom Properties里添加自定义属性hdfs_file_path,用表达式语言为每个流文件设置不同的文件路径:- 比如第一个文件路径:
/your/hdfs/dir/file1.xml - 第二个可以用
${hdfs_file_path:replace('file1','file2')},以此类推生成剩下3个文件的路径
- 比如第一个文件路径:
- 或者更简单:把5个文件路径按行写在
Text字段里,再用SplitText处理器按行拆分,每个拆分后的流文件对应一个路径,最后用UpdateAttribute把路径写入hdfs_file_path属性
- 设置
- 配置单个
FetchHDFS处理器:- 将
HDFS File属性设置为${hdfs_file_path},引用自定义的文件路径属性
- 将
- 这种方式不需要扫描目录,直接针对指定的5个文件读取,同样不会删除源文件,适合固定文件的多次重复测试场景。
额外提示
- 不管用哪个方案,都要确保
FetchHDFS的HDFS Configuration Resources(或Kerberos凭证,若启用Kerberos)配置正确,能正常访问目标HDFS目录 - 重复测试时,方案1只需重置
ListHDFS的状态,方案2只需重新触发GenerateFlowFile即可,源文件会一直保留在HDFS中
内容的提问来源于stack exchange,提问作者Ankur Kumar
相关产品推荐
相关产品推荐

