首页 文章

HDFS Flume接收器 - 按文件滚动

提问于
浏览
1

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

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

感谢您的输入 .

4 回答

  • 0

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

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

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

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

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

  • 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
    
  • 0

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

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

    hdfs.rollCount = 1
    

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

  • 0

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

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

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

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

相关问题