flume的memeryChannel中transactionCapacity和sink的batchsize需要注意事项
来源:互联网 发布:linux 开机挂载硬盘 编辑:程序博客网 时间:2024/06/16 04:54
最近在做flume的实时日志收集,用flume默认的配置后,发现不是完全实时的,于是看了一下,原来是memeryChannel的transactionCapacity在作怪,因为他默认是100,也就是说收集端的sink会在收集到了100条以后再去提交事务(即发送到下一个目的地),于是我修改了transactionCapacity到10,想看看是不是会更加实时一点,结果发现收集日志的agent启动的时候报错了。
16/04/29 09:36:15 ERROR sink.AbstractRpcSink: Rpc Sink avro-sink: Unable to get event from channel memoryChannel. Exception follows.
org.apache.flume.ChannelException: Take list for MemoryTransaction, capacity 10 full, consider committing more frequently, increasing capacity, or increasing thread count
at org.apache.flume.channel.MemoryChannel$MemoryTransaction.doTake(MemoryChannel.java:96)
at org.apache.flume.channel.BasicTransactionSemantics.take(BasicTransactionSemantics.java:113)
at org.apache.flume.channel.BasicChannelSemantics.take(BasicChannelSemantics.java:95)
at org.apache.flume.sink.AbstractRpcSink.process(AbstractRpcSink.java:354)
at org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:68)
at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147)
at java.lang.Thread.run(Thread.java:745)
于是很纳闷,为什么默认值100可以,而设置10就会说小了呢,于是查阅资料,发现原来是sink的batchsize参数在作怪,下面,我就来理一理这个来龙去脉,这个sink的batchsize是什么意思呢,就是sink会一次从channel中取多少个event去发送,而这个发送是要最终以事务的形式去发送的,因此这个batchsize的event会传送到一个事务的缓存队列中(takeList),这是一个双向队列,这个队列可以在事务失败时进行回滚(也就是把取出来的数据吐memeryChannel的queue中),它的初始大小就是transactionCapacity定义的大小,源码中有: takeList = new LinkedBlockingDeque<Event>(transCapacity); 源码来自https://segmentfault.com/a/1190000003586635的分享。
再看这个错误抛出的地方:
if(takeList.remainingCapacity() == 0) {
throw new ChannelException("Take list for MemoryTransaction, capacity " +
takeList.size() + " full, consider committing more frequently, " +
"increasing capacity, or increasing thread count");
}
在上面的情况中,sink一次取100个events,塞到takelist中,在塞了10个后,就会引发上述异常,因此,这个错误的解决办法就是:在sink中,channel的transactionCapacity参数不能小于sink的batchsize。有点不明白,这么明显的一个坑,apache为什么不去补一下呢?
- flume的memeryChannel中transactionCapacity和sink的batchsize需要注意事项
- 【Flume】flume中transactionCapacity和batchSize概念的具体分析和解惑
- 论述flume中batchSize,capacity,transactionCapacity参数之间的关系
- flume使用hdfs sink时需要注意的几点
- flume 几个比较有用的source、sink和decorator
- flume 几个比较有用的source、sink和decorator
- flume 几个比较有用的source、sink和decorator
- flume 的source 、channel和sink 多种组合
- flume 的source 、channel和sink 多种组合
- 【Flume】flume中Avro Sink到Avro Source的性能测试,是否压缩,是否加密
- flume hdfs sink gzip 压缩的问题
- flume的source, channel, sink 列表
- flume 的kafka sink及 taill 命令
- flume的source, channel, sink 列表
- flume中几种常见的source、channel、sink
- 【Flume】flume输出sink到hbase的实现
- epoch、 iteration 和 batchsize 的理解
- epoch、 iteration和batchsize的区别
- NoSuchMethodError: org.hibernate.SessionFactory.openSession
- Jquery伪类选择器加与不加空格的区别
- Android ExpandableListView 实现购物车页面 全选 多选编辑删除
- 锋利的jQuery ajax(三)
- 未能加载 noesis.javascript ......
- flume的memeryChannel中transactionCapacity和sink的batchsize需要注意事项
- WINDOWS 64位机ODBC的数据源DSN添加和移除问题
- bootstrap响应式设计简单实践。
- Android TextView实现滚动跑马灯效果Marquee
- shell数组处理
- Java敏感字符串处理工具类(河蟹专用)
- execv使用
- 十大编程算法助程序员走上高手之路
- hello world