Flume 假脱机目录源:无法加载更大的文件

Flume Spooling Directory Source: Cannot load files larger files

我正在尝试使用 flume 假脱机目录摄取到 HDFS(SpoolDir > 内存通道 > HDFS)。

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

它适用于较小的文件,但不适用于较大的文件。请在下面找到我的测试场景:

  1. 大小为 KB 到 50-60MBytes 的文件,处理没有问题。
  2. 大于 50-60MB 的文件,它将大约 50MB 写入 HDFS 然后我发现 flume 代理意外退出。
  3. flume 日志中没有错误消息。 我发现它试图多次创建“.tmp”文件(HDFS),并且每次在意外退出之前写入几兆字节(有时 2MB,有时 45MB)。 一段时间后,最后尝试的“.tmp”文件重命名为已完成(“.tmp”已删除)并且源 spoolDir 中的文件也重命名为“.COMPLETED”,尽管没有将完整文件写入 HDFS。

在真实场景中,我们的文件大小约为 2GB。因此,需要一些强大的 flume 配置来处理工作负载。

注:

  1. Flume 代理节点是 hadoop 集群的一部分而不是数据节点(它是边缘节点)。
  2. 假脱机目录是同一台服务器上的本地文件系统运行 flume 代理。
  3. 都是物理服务器(非虚拟)。
  4. 在同一个集群中,我们有推特数据馈送 flume 运行 很好(虽然数据量很小)。
  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####################
    

如果我的配置有任何问题或者我遗漏了什么,请告诉我。

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

此致,

-奥拜德

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

使用如下配置添加File-Channel。

spoolDir.channels = 通道 1

spoolDir.channels.channel-1.type = 文件

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

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

我用几个大小的文件测试了flume,最后得出的结论是"flume is not for larger size files"。

所以,我终于开始使用 HDFS NFS 网关了。这真的很酷,现在我什至不需要本地存储中的假脱机目录。使用 scp 将文件直接推送到 nfs 挂载的 HDFS。

希望对遇到和我一样问题的人有所帮助。

谢谢, 奥贝德