Flume Spooling Directory来源:无法加载文件较大的文件

时间:2015-12-31 04:36:17

标签: hadoop large-files flume

我正在尝试使用flume假脱机目录摄取到HDFS(SpoolDir> Memory Channel> HDFS)。

我正在使用Cloudera Hadoop 5.4.2。 (Hadoop 2.6.0,Flume 1.5.0)。

适用于较小的文件,但是文件较大时会失败。请在下面找到我的测试场景:

  1. 文件大小为Kbytes到50-60MBytes,处理没有问题。
  2. 大于50-60MB的文件,它向HDFS写入大约50MB,然后我发现水槽代理意外退出。
  3. 水槽日志上没有错误消息。 我发现它正试图创建" .tmp"文件(HDFS)多次,每次在意外退出之前写入几兆字节(一些时间2MB,一些时间45MB)。 过了一段时间,最后一次尝试了#34; .tmp"文件重命名为已完成(" .tmp"已删除),源spoolDir中的文件也重命名为" .COMPLETED"虽然完整文件没有写入HDFS。
  4. 在真实场景中,我们的文件大小约为2GB。因此,需要一些强大的水槽配置来处理工作量。

    注意:

    1. Flume代理节点是hadoop集群的一部分,而不是datanode(它是边缘节点)。
    2. 假脱机目录是运行flume agent的同一服务器上的本地文件系统。
    3. 所有都是物理服务器(非虚拟)。
    4. 在同一个群集中,我们有twitter数据传输,水槽运行良好(尽管数据非常少)。
    5. 请在下面找到我在这里使用的flume.conf文件:

      #############start flume.conf####################
      
      spoolDir.sources = src-1
      
      spoolDir.channels = channel-1
      
      spoolDir.sinks = sink_to_hdfs1
      
      ######## source
      
      
      spoolDir.sources.src-1.type = spooldir
      
      spoolDir.sources.src-1.channels = channel-1
      
      spoolDir.sources.src-1.spoolDir = /stage/ETL/spool/
      
      spoolDir.sources.src-1.fileHeader = true
      
      spoolDir.sources.src-1.basenameHeader =true
      
      spoolDir.sources.src-1.batchSize = 100000
      
      ######## channel
      spoolDir.channels.channel-1.type = memory
      
      spoolDir.channels.channel-1.transactionCapacity = 50000000
      
      spoolDir.channels.channel-1.capacity = 60000000
      
      spoolDir.channels.channel-1.byteCapacityBufferPercentage = 20
      
      spoolDir.channels.channel-1.byteCapacity = 6442450944
      
      ######## sink 
      spoolDir.sinks.sink_to_hdfs1.type = hdfs
      
      spoolDir.sinks.sink_to_hdfs1.channel = channel-1
      
      spoolDir.sinks.sink_to_hdfs1.hdfs.fileType = DataStream
      
      spoolDir.sinks.sink_to_hdfs1.hdfs.path = hdfs://nameservice1/user/etl/temp/spool
      
      spoolDir.sinks.sink_to_hdfs1.hdfs.filePrefix = %{basename}-
      
      spoolDir.sinks.sink_to_hdfs1.hdfs.batchSize = 100000
      
      spoolDir.sinks.sink_to_hdfs1.hdfs.rollInterval = 0
      
      spoolDir.sinks.sink_to_hdfs1.hdfs.rollSize = 0
      
      spoolDir.sinks.sink_to_hdfs1.hdfs.rollCount = 0
      
      spoolDir.sinks.sink_to_hdfs1.hdfs.idleTimeout = 60
      
      #############end flume.conf####################
      
    6. 请建议我配置是否有任何问题,或者我错过了什么。

      或者,Flume SpoolDir无法处理更大的文件是一个已知问题。

      此致

      -Obaid

      • 我已将相同的主题发布到另一个开放社区,如果我从其他人那里得到解决方案,我会在此更新,反之亦然。

2 个答案:

答案 0 :(得分:1)

我已经测试了几个大小文件的水槽,最后得出的结论是“水槽不适用于较大尺寸的文件”。

所以,最后我开始使用HDFS NFS Gateway。这真的很酷,现在我甚至不需要本地存储中的假脱机目录。使用scp。

将文件直接推送到nfs挂载的HDFS

希望它会帮助那些像我一样面临同样问题的人。

谢谢, 奥贝德

答案 1 :(得分:0)

尝试使用文件通道,因为它比内存通道更可靠。

使用以下配置添加文件频道。

spoolDir.channels = channel-1

spoolDir.channels.channel-1.type = file

spoolDir.channels.channel-1.checkpointDir = / mnt / flume / checkpoint

spoolDir.channels.channel-1.dataDirs = / mnt / flume / data