【问题标题】:Apache Flume creating new file for every line writeApache Flume 为每一行写入创建新文件
【发布时间】:2026-01-12 16:45:01
【问题描述】:

我正在做一些实验来感受水槽。以下是我的配置文件。

agent.channels.memory-channel.type = memory

agent.sources.tail-source.type = exec
agent.sources.tail-source.command = tail -F /root/test.txt
agent.sources.tail-source.channels = memory-channel

agent.sinks.hdfs-sink.channel = memory-channel
agent.sinks.hdfs-sink.type = hdfs
agent.sinks.hdfs-sink.hdfs.path = hdfs://10.0.7.111/tflume
agent.sinks.hdfs-sink.hdfs.fileType = DataStream

agent.channels = memory-channel
agent.sources = tail-source
agent.sinks = hdfs-sink

对于使用 vi 命令添加到 test.txt 文件的每一行,当查看水槽日志时,它会在 HDFS /tflume 目录中创建新文件。为什么会这样?

我原本希望将水槽附加到我现有的文件中,同时,通过查看日志,写入 hdfs 的数据也花费了太长时间。

感谢您提前回复。

【问题讨论】:

标签: flume flume-ng


【解决方案1】:

这是使用 HDFS 作为接收器时臭名昭著的“许多小 HDFS 文件”问题。

确保至少在 flume.conf 中为 HDFS 接收器设置了属性 rollSize、rollCount、rollInterval 和 idleTimeout,即可轻松解决该问题。如果你不设置它们,Flume 默认为非常低的值。大多数情况下,rollSize 的默认值(仅 1024 kb !!)将规定在 1 个 HDFS 文件中仅记录 3 到 4 条日志记录。 可以通过将默认值设置为 0 来方便地覆盖默认值,但如果您忘记了这一点,默认值将导致一些古怪的行为。

#ALWAYS PROVIDE THESE OVERRIDES OF THE DEFAULTS !!

agent3.sinks.snk1.hdfs.rollSize = 0
agent3.sinks.snk1.hdfs.rollCount = 0
agent3.sinks.snk1.hdfs.rollInterval = 0
agent3.sinks.snk1.hdfs.idleTimeout = 0

#SET TO YOUR NEEDS

#rollCount writes to hdfs every 20 lines
agent3.sinks.snk1.hdfs.rollCount = 20

【讨论】: