我创建了一个简单的NiFi管道,它从Kafka主题中读取数据流(使用ConsumeKafka
)并将其写入HDFS(使用PutHDFS
)。目前,我在HDFS上看到了很多小文件。一个新文件大约每秒创建一次,有些只有一个或两个记录。
我希望将更少,更大的文件写入HDFS。
我在ConsumeKafka
中有以下设置:
Message Demarcator = <new line>
Max Poll Records = 10000
Max Uncommitted Time = 20s
过去我使用的是Flume而不是Nifi,它有batchSize
和batchDurationMillis
,这使我可以调整HDFS文件的大小。似乎Nifi中的ConsumeKafka
缺少batchDurationMillis
等效项。
NiFi中的解决方案是什么?
答案 0 :(得分:1)
使用Message Demarcator和Max Poll Records是获取每个流文件多个消息的正确方法。您可能希望通过从0秒调整运行时间表(在调度选项卡上)来减慢ConsumeKafka处理器的速度,这意味着尽可能快地运行,达到1秒或任何有意义的东西来获取更多数据。
即使使用上述内容,您仍可能希望在PutHDFS之前粘贴MergeContent处理器,并根据大小合并流文件,以便在写入HDFS之前可以等到具有适当数量的数据。
如何使用MergeContent将取决于您要合并的数据类型...如果您有Avro,则Avro有一个特定的合并策略。如果你有JSON,你可以一个接一个地合并它们,或者你可以用页眉,页脚和分界符包装它们来制作一个有效的JSON数组。