Flume内存通道到HDFS接收器

时间:2015-09-08 16:03:12

标签: cloudera-cdh flume-ng

我正面临Flume的问题(Cloudera CDH 5.3上的1.5):

spoolDir source -> memory channel -> HDFS sink

我正在尝试做什么:每隔5分钟,大约20个文件被推送到假脱机目录(从远程存储中抓取)。每个文件包含多行,每行是一个日志(以JSON格式)。文件大小在10KB到1MB之间。

启动代理时,所有文件都成功推送到HDFS。 1分钟后(这就是我在flume.conf中设置的内容),文件被滚动(删除.tmp后缀并关闭)。

但是,当在假脱机目录中找到新文件时,我收到消息:

org.apache.flume.source.SpoolDirectorySource: The channel is full, and cannot write data now. The source will try again after 250 milliseconds

尝试了很多不同的配置但没有成功(增加/减少频道事务容量和容量,增加/减少batchSize等),我请求你的帮助。

这是我最新的水槽配置:

# source definition
sebanalytics.sources.spooldir-source.type = spooldir
sebanalytics.sources.spooldir-source.spoolDir = /var/flume/in
sebanalytics.sources.spooldir-source.basenameHeader = true
sebanalytics.sources.spooldir-source.basenameHeaderKey = basename
sebanalytics.sources.spooldir-source.batchSize = 10
sebanalytics.sources.spooldir-source.deletePolicy = immediate
# Max blob size: 1.5Go
sebanalytics.sources.spooldir-source.deserializer = org.apache.flume.sink.solr.morphline.BlobDeserializer$Builder
sebanalytics.sources.spooldir-source.deserializer.maxBlobLength = 1610000000
# Attach the interceptor to the source
sebanalytics.sources.spooldir-source.interceptors = json-interceptor
sebanalytics.sources.spooldir-source.interceptors.json-interceptor.type = com.app.flume.interceptor.JsonInterceptor$Builder
# Define event's headers. basenameHeader must be the same than source.basenameHeaderKey (defaults is basename)
sebanalytics.sources.spooldir-source.interceptors.json-interceptor.basenameHeader = basename
sebanalytics.sources.spooldir-source.interceptors.json-interceptor.resourceHeader = resources
sebanalytics.sources.spooldir-source.interceptors.json-interceptor.ssidHeader = ssid

# channel definition
sebanalytics.channels.mem-channel-1.type = memory
sebanalytics.channels.mem-channel-1.capacity = 1000000
sebanalytics.channels.mem-channel-1.transactionCapacity = 10

# sink definition
sebanalytics.sinks.hdfs-sink-1.type = hdfs
sebanalytics.sinks.hdfs-sink-1.hdfs.path = hdfs://StandbyNameNode/data/in
sebanalytics.sinks.hdfs-sink-1.hdfs.filePrefix = %{resources}_%{ssid}
sebanalytics.sinks.hdfs-sink-1.hdfs.fileSuffix = .json
sebanalytics.sinks.hdfs-sink-1.hdfs.fileType = DataStream
sebanalytics.sinks.hdfs-sink-1.hdfs.writeFormat = Text
sebanalytics.sinks.hdfs-sink-1.hdfs.rollInterval = 3600
sebanalytics.sinks.hdfs-sink-1.hdfs.rollSize = 63000000
sebanalytics.sinks.hdfs-sink-1.hdfs.rollCount = 0
sebanalytics.sinks.hdfs-sink-1.hdfs.batchSize = 10
sebanalytics.sinks.hdfs-sink-1.hdfs.idleTimeout = 60

# connect source and sink to channel
sebanalytics.sources.spooldir-source.channels = mem-channel-1
sebanalytics.sinks.hdfs-sink-1.channel = mem-channel-1

1 个答案:

答案 0 :(得分:0)

完整通道意味着:通道无法从源接收更多事件,因为接收器比源更慢地消耗这些事件。

增加信道容量只能解决问题。可能的解决方案:

  • 改善接收器的处理...如果接收器是自定义的(改进/避免循环,使用更有效的后端API等)。在这种情况下,由于您使用的是默认HDFS接收器,因此似乎无法实现。
  • 降低数据发送到源的频率。然而,由于您的处理要求,我猜你不想/不能这样做。
  • 添加更多并行工作的接收器。我对此并不确定,但我可以想象Flume的设计师决定在一个独立的线程中运行每个接收器。如果这是真的,那么您可以尝试多个并行HDFS接收器。为了将数据拆分为多个接收器,您必须使用与multiplexing selector不同的default replicating one

HTH!