我正在尝试使用flume spooling目录摄取hdfs(spooldir>memory channel>hdfs)。
我正在使用ClouderaHadoop5.4.2(hadoop 2.6.0和flume 1.5.0)。
它可以很好地处理较小的文件,但是在处理较大的文件时会失败。请在下面找到我的测试场景:
大小为KB到50-60MB的文件,未经处理。
大于50-60mb的文件,它将50mb写入hdfs,然后我发现flume代理意外退出。
Flume日志上没有错误消息。我发现它多次尝试创建“.tmp”文件(hdfs),每次都会在意外退出之前写入数兆字节(有时是2mb,有时是45mb)。一段时间后,最后尝试的“.tmp”文件重命名为completed(“.tmp”已删除),源spooldir中的文件也重命名为“.completed”,尽管完整文件未写入hdfs。
在真实场景中,我们的文件大小约为2gb。因此,需要一些健壮的flume配置来处理工作负载。
注:
flume代理节点是hadoop集群的一部分,而不是datanode(它是一个边缘节点)。
spool目录是运行flume代理的同一服务器上的本地文件系统。
都是物理服务器(不是虚拟服务器)。
在同一个集群中,我们使用flume运行twitter数据馈送(尽管数据量非常小)。
请找到我在这里使用的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无法处理更大的文件。
当做,
-奥贝德
我已经将同一主题发布到另一个开放社区,如果我从另一个社区获得解决方案,我将在这里更新,反之亦然。
2条答案
按热度按时间628mspwn1#
我用几个大小的文件测试了flume,最后得出结论“flume不适合较大的文件”。
所以,我终于开始使用hdfs-nfs网关了。这真的很酷,现在我甚至不需要在本地存储spool目录。使用scp将文件直接推送到nfs挂载的hdfs。
希望它能帮助像我一样面临同样问题的人。
谢谢,奥贝德
rjjhvcjd2#
尝试使用文件通道,因为它比内存通道更可靠。
使用以下配置添加文件通道。
spooldir.channels=通道1
spooldir.channels.channel-1.type=文件
spooldir.channels.channel-1.checkpointdir=/mnt/flume/checkpoint
spooldir.channels.channel-1.datadirs=/mnt/flume/data