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)。
它适用于较小的文件,但不适用于较大的文件。请在下面找到我的测试场景:
- 大小为 KB 到 50-60MBytes 的文件,处理没有问题。
- 大于 50-60MB 的文件,它将大约 50MB 写入 HDFS 然后我发现 flume 代理意外退出。
- flume 日志中没有错误消息。
我发现它试图多次创建“.tmp”文件(HDFS),并且每次在意外退出之前写入几兆字节(有时 2MB,有时 45MB)。
一段时间后,最后尝试的“.tmp”文件重命名为已完成(“.tmp”已删除)并且源 spoolDir 中的文件也重命名为“.COMPLETED”,尽管没有将完整文件写入 HDFS。
在真实场景中,我们的文件大小约为 2GB。因此,需要一些强大的 flume 配置来处理工作负载。
注:
- Flume 代理节点是 hadoop 集群的一部分而不是数据节点(它是边缘节点)。
- 假脱机目录是同一台服务器上的本地文件系统运行 flume 代理。
- 都是物理服务器(非虚拟)。
- 在同一个集群中,我们有推特数据馈送 flume 运行 很好(虽然数据量很小)。
请在下面找到我在这里使用的 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。
希望对遇到和我一样问题的人有所帮助。
谢谢,
奥贝德
我正在尝试使用 flume 假脱机目录摄取到 HDFS(SpoolDir > 内存通道 > HDFS)。
我正在使用 Cloudera Hadoop 5.4.2。 (Hadoop 2.6.0,Flume 1.5.0)。
它适用于较小的文件,但不适用于较大的文件。请在下面找到我的测试场景:
- 大小为 KB 到 50-60MBytes 的文件,处理没有问题。
- 大于 50-60MB 的文件,它将大约 50MB 写入 HDFS 然后我发现 flume 代理意外退出。
- flume 日志中没有错误消息。 我发现它试图多次创建“.tmp”文件(HDFS),并且每次在意外退出之前写入几兆字节(有时 2MB,有时 45MB)。 一段时间后,最后尝试的“.tmp”文件重命名为已完成(“.tmp”已删除)并且源 spoolDir 中的文件也重命名为“.COMPLETED”,尽管没有将完整文件写入 HDFS。
在真实场景中,我们的文件大小约为 2GB。因此,需要一些强大的 flume 配置来处理工作负载。
注:
- Flume 代理节点是 hadoop 集群的一部分而不是数据节点(它是边缘节点)。
- 假脱机目录是同一台服务器上的本地文件系统运行 flume 代理。
- 都是物理服务器(非虚拟)。
- 在同一个集群中,我们有推特数据馈送 flume 运行 很好(虽然数据量很小)。
请在下面找到我在这里使用的 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。
希望对遇到和我一样问题的人有所帮助。
谢谢, 奥贝德