我正在尝试使用flume假脱机目录摄取到HDFS(SpoolDir> Memory Channel> HDFS)。
我正在使用Cloudera Hadoop 5.4.2。 (Hadoop 2.6.0,Flume 1.5.0)。
适用于较小的文件,但是文件较大时会失败。请在下面找到我的测试场景:
在真实场景中,我们的文件大小约为2GB。因此,需要一些强大的水槽配置来处理工作量。
注意:
请在下面找到我在这里使用的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无法处理更大的文件是一个已知问题。
此致
-Obaid
答案 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