HDFS Flume接收器 - 按文件滚动

时间:2015-05-11 06:37:23

标签: flume

只要单个文件(来自Flume源,假设假脱机目录)结束,而不是在某些字节(hdfs.rollSize),时间(hdfs.rollInterval)或事件之后滚动,HDFS Flume接收器是否可以滚动? hdfs.rollCount)?

可以配置Flume以便单个文件是单个事件吗?

感谢您的意见。

4 个答案:

答案 0 :(得分:0)

重写您的第一个问题,由于接收器逻辑与断开连接,因此无法实现。我的意思是,一个接收器只能看到被放入通道的事件,必须由他处理;接收器不知道事件是关于文件的第一个还是最后一个。

当然,您可以尝试创建自己的源(或扩展现有源),以便为事件添加标头,其值为“这是最后一个事件”。然后,另一个自定义接收器可能会根据这样的标头行为:例如,如果未设置标头,则事件不会持久存储,而是存储在内存中直到看到标头;然后所有信息都作为bach持久存在最终后端。另一种可能性是自定义接收器将数据保留在文件中,直到看到标题;然后文件关闭,另一个文件被打开。

关于你的第二个问题,它取决于接收器。 spooldir源的行为基于deserializer参数;默认情况下,其值为LINE,表示:

  

指定用于将文件解析为事件的反序列​​化程序。默认将每行解析为事件。指定的类必须实现EventDeserializer.Builder。

但是,如上所述,可以配置其他自定义Java类;例如,对整个文件进行反序列化。

答案 1 :(得分:0)

您可以将rollize设置为较小的数字并与BlobDeserializer一起按文件加载文件而不是组合成块。当您有不可分割的二进制文件(如PDF或gz文件)时,这非常有用。

这是相关配置的一部分:

#Set deserializer to BlobDeserializer and set the maximum blob size to be 1GB.
#Notice that the blobs have to fit in memory so this doesn't work for files that cannot fit in memory.
agent.sources.spool.deserializer = org.apache.flume.sink.solr.morphline.BlobDeserializer$Builder
agent.sources.spool.deserializer.maxBlobLength = 1000000000

#Set rollSize to 1024 to avoid combining multiple small files into one part.
agent.sinks.hdfsSink.hdfs.rollSize = 1024
agent.sinks.hdfsSink.hdfs.rollCount = 0
agent.sinks.hdfsSink.hdfs.rollInterval = 0

答案 2 :(得分:0)

问题的答案“可以配置Flume以便单个文件是单个事件吗?”是的。

只需要将以下属性配置为1:

hdfs.rollCount = 1

我正在寻找第一个问题的解决方案,因为有时文件太大而且需要将文件分成几个块。

答案 3 :(得分:0)

您可以在hdfs.path中使用任何事件标头。 (https://flume.apache.org/FlumeUserGuide.html#hdfs-sink

如果您使用假脱机目录来源,则可以使用fileHeaderKeybasenameHeaderKeyhttps://flume.apache.org/FlumeUserGuide.html#spooling-directory-source)启用文件名。

  

可以配置Flume以便单个文件是单个事件吗?

可能是,但不推荐。底层实现(protobuf)将文件大小限制为64m。由于其结构和设计,Flume事件的规模很小。 (容错等)