我不知道你用flume读者熟悉无论这两个概念

一开始我是有点困惑,?

没感觉到transactionCapacity的作用啊?

batchSize又是干啥的啊?

……

……

带着这些问题,我们深入源代码来看一下:

batchSize

batchSize这个概念首先它出如今哪里呢?

kafkaSink的process方法

HDFS Sink

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2ltb25jaGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

Exec Source

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2ltb25jaGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

通过上面这三张图,相信大家应该知道batchSize从哪来的了

batchSize是针对Source和Sink提出的一个概念,它用来限制source和sink对event批量处理的。

即一次性你能够处理batchSize个event,这个一次性就是指在一个事务中。

当你处理的event数量超出了batchSize。那么事务就会提交了。

注意,这里有一个隐晦的地方,就是batchSize一定不能大于transactionCapacity

以下再来说说transactionCapacity

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2ltb25jaGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

首先。从这个图中我们就能够看出transactionCapacity这个概念的来源了,它来自于通道中。不同于batchSize(Source,Sink)

那么。在通道中是怎样使用该事务容量的呢??

内存通道中有个内部类MemoryTransaction

 private class MemoryTransaction extends BasicTransactionSemantics {
private LinkedBlockingDeque<Event> takeList;
private LinkedBlockingDeque<Event> putList;
private final ChannelCounter channelCounter;
private int putByteCounter = 0;
private int takeByteCounter = 0; public MemoryTransaction(int transCapacity, ChannelCounter counter) {
putList = new LinkedBlockingDeque<Event>(transCapacity);
takeList = new LinkedBlockingDeque<Event>(transCapacity); channelCounter = counter;
}

这里就用到了事务容量,它就是putList和takeList的容量大小

putList就是用来存放put操作带来的event          channel的put

 if (!putList.offer(event)) {
throw new ChannelException(
"Put queue for MemoryTransaction of capacity " +
putList.size() + " full, consider committing more frequently, " +
"increasing capacity or increasing thread count");
}

每一次put前,都会预判put是否成功,从异常的提示信息就能够看出来。put不成功即事务容量满了

takeList存放的event是用来被take操作消耗的,返回拿到的一个event            channel的take

 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");
}

take前也会预判,假设takeList已经满了。说明take操作太慢了,出现了event堆积的现象,这时候你应该调整事务容量

什么情况下。事务会提交呢,事务提交做了什么呢??

commit即事务提交

两种情况:

1、put的event提交

while(!putList.isEmpty()) {
if(!queue.offer(putList.removeFirst())) {
throw new RuntimeException("Queue add failed, this shouldn't be able to happen");
}

event所有放到queue中。queue才是真正的flume中event的队列。它的容量是capacity。看上一张图就可以。

2、take的event提交

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2ltb25jaGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

由于在take操作的时候就已经将event从queue中取出了。而queue中取出的event正是靠put的提交来的

最后。再看看事务是怎样回滚的??

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2ltb25jaGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

事务回滚针对take操作,你把event拿出去。结果处理失败了,那当然得丢回来,等待下一次处理了!

由于进入了rollback操作,说明commit操作出现异常,也就是commit操作失败了,那putList和takeList两个队列当然也没有被清空

 while(!takeList.isEmpty()) {
queue.addFirst(takeList.removeLast());
}

循环将event又一次加入到queue中。

不知道说。大家对这个更清楚它是否??

版权声明:本文博主原创文章。博客,未经同意不得转载。

【Flume】flume于transactionCapacity和batchSize进行详细的分析和质疑的概念的更多相关文章

  1. WaterfallTree(瀑布树) 详细技术分析系列

    前言 WaterfallTree(瀑布树) 是最强纯C#开源NoSQL和虚拟文件系统-STSdb专有的(版权所有/专利)算法/存储结构. 参考 关于STSdb,我之前写过几篇文章,譬如: STSdb, ...

  2. flume+flume+kafka消息传递+storm消费

    通过flume收集其他机器上flume的监测数据,发送到本机的kafka进行消费. 环境:slave中安装flume,master中安装flume+kafka(这里用两台虚拟机,也可以用三台以上) m ...

  3. [Flume] - flume安装

    Apache Flume是一个分布式的.可靠的.高效的系统,可以将不同来源的数据收集.聚合并移动到集中的数据存储中心上.Apache Flume不仅仅只是用到日志收集中.由于数据来源是可以定制的,fl ...

  4. Flume组件source,channel,sink源码分析

    LifeCycleState: IDLE, START, STOP, ERROR [Source]: org.apache.flume.Source 继承LifeCycleAware{stop() + ...

  5. [Spark][Flume]Flume 启动例子

    Flume 启动例子: flume-ng agent --conf /etc/flume-ng/conf --conf-file /etc/flume-ng/conf/flume.conf --nam ...

  6. cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(6)

    今天我们要讲三个类,这三个类应该算比較简单的 HelpLayer类 NumberLayer类 GetLocalScore类 HelpLayer类,主要放了两个图形精灵上去,一个是游戏的名字,一个是提示 ...

  7. nodejs零基础详细教程1:安装+基础概念

    第一章 建议学习时间2小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  8. node.js零基础详细教程(1):安装+基础概念

    第一章 建议学习时间2小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  9. JAVA异常处理原则和log4j输出详细异常分析

    1.多用try,catch;不要一个try,catch包含所有内容 好处:不同模块抓取不同异常,某一模块异常挂了,不影响其他模块的程序的进行 2.多写几个catche:尽量不要使用Exception这 ...

随机推荐

  1. WPF界面设计技巧(4)—自定义列表项样式

    原文:WPF界面设计技巧(4)-自定义列表项样式 有前面修改按钮样式的基础,我们可以尝试来定制一个即好看又好用的 ListBox ,今天先来讲“好看”部分. 打开 Microsoft Visual S ...

  2. Difference between datacontract and messagecontract in wcf

    在WCF中有两种契约各自是DataContract和MessageContract,这篇博客来讲一下两者的差别.先看一下两者定义契约实体的方式有和不同. 1.数据契约 <span style=& ...

  3. socket用法

    INADDR_ANY是ANY,是绑定地址0.0.0.0上的监听, 能收到任意一块网卡的连接:INADDR_LOOPBACK, 也就是绑定地址LOOPBAC, 往往是127.0.0.1, 只能收到127 ...

  4. shell加法

    echo 1597+1469+1468+2591+1260+1068+1019+993|bc http://bbs.chinaunix.net/thread-161085-1-1.html http: ...

  5. Python学习入门基础教程(learning Python)--3.2 if-else分支语句

    if-else分支语句结构的特点是当conditon条件满足时,执行if下的语句块,当condition条件不满足时执行else下的语句块,也就是说根据条件来控制让某些语句执行,某些语句不被执行. i ...

  6. 主席树(可持久化线段树) 静态第k大

    可持久化数据结构介绍 可持久化数据结构是保存数据结构修改的每一个历史版本,新版本与旧版本相比,修改了某个区域,但是大多数的区域是没有改变的, 所以可以将新版本相对于旧版本未修改的区域指向旧版本的该区域 ...

  7. 第三章 AOP 基于Schema的AOP

    基于Schema定义的切面和前现两种方式定义的切面,内容上都差不多,只是表现形式不一样而已. 3.7.1一般增强的使用 a.目标类 public class Target { public void ...

  8. Preference如何增加在activity生命周期监听器

    转载请注明出处:http://blog.csdn.net/droyon/article/details/41313115 本文主要介绍Preference凭什么Activit一些逻辑的生命周期,使. ...

  9. 【oracle案件】ORA-19502,ORA-27072

    1.1.1. ORA-19502,ORA-27072 日期:2014-05-12 00:12 环境:试验机 [错误号] $ oerr ora 19502 19502, 00000, "wri ...

  10. 很多Python新手教程

    重要提示 这不是一个教程新手程序员准备,你担任很快编程,或者没有使用1至2程序设计语言,请移步!这是一些编程经验准备.它最出名Java或C,理解命令行,Shell等待.简而言之,面向老鸟的,让老鸟高速 ...