標籤:ace channels 配置 sink 發送 大小 ide ref nbsp
fluem中出現,transactionCapacity查詢一下,得出一下這些:
最近在做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); 源碼來自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。
flume的memeryChannel中transactionCapacity和sink的batchsize需要注意事項