【Flume】flume中transactionCapacity和batchSize概念的具体分析和解惑

不知道各位用过flume的读者对这两个概念是否熟悉了解

一开始本人的确有点迷惑,觉得这是不是重复了啊?

没感觉到transactionCapacity的作用啊?

batchSize又是干啥的啊?

……

……

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

batchSize

batchSize这个概念首先它出现在哪里呢?

kafkaSink的process方法

HDFS Sink

Exec Source

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

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

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

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

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

下面再来说说transactionCapacity

首先,从这个图中我们就可以看出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提交

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

最后,再看看事务是如何回滚的??

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

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

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

循环将event重新添加到queue中。

不知道这样说,大家对这个是否更加清楚了呢??

时间: 2024-08-03 08:36:01

【Flume】flume中transactionCapacity和batchSize概念的具体分析和解惑的相关文章

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

软件开发中几个基本概念

软件开发中几个基本概念 Peixu.Zhu 自己真的深切理解那些经常挂在嘴边的概念么? 抽象 Abstract 抽象的特点是仅存在于思想和理论之中,而非物理或者具体的存在.(不是指C++中的抽象类) 抽象是永存的,不会随着时空而发生变化. 具体 Concrete 具体的特点是物化的或者是具备物理形态,是真实存在的. 具体不是永存的,是随着时空而发生变化的,仅存于具体的时空之中. 具体和抽象的最大区别是是否随着时空而发生变化,即是否存在于我们的四维空间. 实体 Entity 实体是单独的个体事物(

elasticsearch中的几个概念总结

1.Geo spatial search : 地理空间搜索,可以在搜索查询中指定的某一距离内查找所要的内容,也能够返回以当前为圆心,逐渐增加圆的半径,直到找到所匹配到的内容. 参考:http://www.forwardsearch.dk/en/ForwardSearch/InDepth/Geo-spatial%20search.aspx 2.Multi tenancy:多租户 (1)Multi-tenancy means that different customers can have dif

云计算中的一些重要概念

什么是云计算      曾经被人严肃的问到过一个问题,那就是如果要你用一句话,向一个完全没有计算机知识的农民解释什么是云计算,你该如何说,记得我当时说了一堆类似服务器虚拟化,存储虚拟化等相关的东西,这个显然不够浅显.如果再给我一次机会,我会说:云计算就是把计算机放到了"云"上,家里面不用放计算机,使用的人只要从云上拉一根网线下来就可以做任何电脑相关的事情了,虽然这种解释对搞云计算的程序员来说不太准确,但是我想这差不多解释了云计算内涵的八九成了.  为什么需要云计算 IT相关技术的发展总

HTTP中关于幂等概念的理解

幂等性是分布式系统设计中十分重要的概念 幂等的方法意味着请求成功执行所得到的的结果不依赖于该方法被执行的次数.幂等指的是当你使用相同的值调用相同的功能时,结果完全一致,这是它的数学定义 如果具有相同输入的一个操作没有改变任何的事情,那么它是幂等的.但是,如果这个操作改变了任意的状态,比如说它记录了这个请求的最后时间,那么它就不是幂等的. 根据这一原则分析一下HTTP中的方法的幂等性 HTTP1.1规范声明GET,HEAD,PUT方法是幂等的,不过也可以自定义一个非幂等的doGet方法(但不应该这

Activity中UI框架基本概念

Activity中UI框架基本概念 Activity 是应用程序的基本组成部分,提供了可视的界面,与用户进行交互: 具体Acitivity是怎么样显示这些事视图元素以及响应事件交互的. 一Activity相关概念 Activity:Activity包含一个Window,该Window在Activity的attach方法中通过调用 PolicyManager.makeNewWindo创建: View:最基本的UI组件,表示屏幕上的一个矩形区域: DecorView:是Window中View的Roo

OC中多线程的一些概念

1.进程1.1>进程是指在系统中正在运行的一个应用程序(同时打开QQ和Xcode,系统会分别启动2个进程)1.2>每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内 2.线程1.1>一个进程想要执行任务,必须得有线程(每个进程至少要有一条线程,即主线程)1.2>线程是进程的基本执行单元,进程的所有任务都在线程中执行3.多线程3.1>一个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务      进程→车间, 线程→车间工人3.2>多线程技术

CSS中的几个概念--------Day39

世界杯疯狂来袭,让这个原本就高温的夏季瞬间被引爆了,这肆虐的激情仿佛让一切都灼热了起来,绽放着刺目的光,工作之余总有那么一群人在那激烈的讨论着争辩着,抑不住的亢奋. 很不巧,往往这群身影中总有我的存在,哪怕我未曾说过一句话,可我依然很享受这种氛围.我常常想起那些青葱的校园时光,也总是和那么一群斗志满满,激情无限的家伙,打篮球,说篮球,就像这次马刺踏平热火,如果都还能聚在一起,估计又是一片争吵.是的,我爱篮球,胜过足球许多,但我还是坐在这里,假装着伪球迷的身份.终归是年龄有些大了,不再像以前那么苛

C++中关于位域的概念

原文来自于http://topic.csdn.net/t/20060801/11/4918904.html中的回复 位域 有些信息在存储时,并不需要占用一个完整的字节,   而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1   两种状态,   用一位二进位即可.为了节省存储空间,并使处理简便,C/C++语言又提供了一种数据结构,称为“位域”或“位段”.所谓“位域”是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.