Kakfa揭秘 Day6

Consumer源码解密

今天主要分析下Consumer是怎么来工作的,今天主要是例子出发,对整个过程进行刨析。

简单例子

Example中Consumer.java是一个简单的例子:

首先,是有一些重要的参数:

  • MAX_POLL_RECORDS_CONFIG 表示一次获取的最多记录数。
  • ENABLE_AUTO_COMMIT_CONFIG 定时提交功能,开启后,Kafka会定期向zk中更新我们consumer获取的最后一个batch的first mesasage offset。
  • AUTO_COMMIT_INTERVAL ConsumerConfig consumer向zk更新offset的时间间隔
  • FETCH_MIN_BYTES_CONFIG 指定了消息最小的字节,kafka判断如果消息小于这个大小时,就不抓了,默认是1个字节。

这个例子的主体是doWork方法,会不停的被调用,其中主要是调用了poll方法。

这里面有两个关键步骤:

  1. 发起fetch操作,将数据拉去到本地。
  2. 将本地获得的record返回给客户端。

从具体的fetch逻辑来看,是循环获取每个partition的数据,并且将其存到record中。

从这个简单的例子,我们可以看到consumer在获取brokers数据的时候,是个两阶段处理,采用多线程,在线程里会循环各partition获取数据,全部循环完成后,再统一将数据返回客户端。

KafkaInputStream

在SparkStreaming中使用到的KafkaInputStream需要不断持续的获取数据,是一个比较复杂的例子。和上面的简单例子不同的是,数据是不断流进来。

让我们从KafkaInputDStream开始,其中最关键的是调用了consumerConnector的createMessageStreams方法。

这个方法是在类ZookeeperConsumerConnector中实现。

consumer通过zookeeper与kafka集群进行交互,在构造实例时调用connectZk构建了zk的client,直接连接并注册给zookeeper。

往下,会调用consume方法,其中有两个关键,一是为每个topic构建了一个blockingQueue,第二步是对fetcher进行启动。

对于第二步fetcher的启动,我们可以一直跟踪到updateFetcher这个方法,这个里面调用了ConsumerFetcherManager的startConnections方法。

再往下,可以看到,程序中为每个partition启动了一个fetcherThread。

而在每个fetcherThread中,会具体获取数据,并将其压入在consume方法中生成的blockingQueue中。

总得来说,思路和简单例子类似,都是分为两阶段进行,不过由于持续服务的特性,引入了多线程和BlockingQueue的处理。

小结

总结来说,kafka有很多的broker,每个broker里面都有很多topic,topic有很多partition,如果我们现在读取topic的多个parititon,放在多个broker上。然后,我们怎么去获取数据。

  1. 数据在哪里,被zk管理,所以连上zk的话,会请求topic和partition,zk会根据leader和followers的信息,把数据所在的broker具体topic的partition给你,每个partition都会产生一个线程来抓取。
  2. 抓取线程线程启动之后内部不断的循环,获取数据后会放入一个堵塞队列。抓到一条数据就给阻塞队列。
  3. consumer本身用一个线程从堵塞队列拿数据,完成消费,可以看到整个过程都是并行的。

欲知后事如何,且听下回分解!

DT大数据每天晚上20:00YY频道现场授课频道68917580

Kakfa揭秘 Day6 Consumer源码解密的更多相关文章

  1. Kakfa揭秘 Day7 Producer源码解密

    Kakfa揭秘 Day7 Producer源码解密 今天我们来研究下Producer.Producer的主要作用就是向Kafka的brokers发送数据.从思考角度,为了简化思考过程,可以简化为一个单 ...

  2. Kakfa揭秘 Day9 KafkaReceiver源码解析

    Kakfa揭秘 Day9 KafkaReceiver源码解析 上一节课中,谈了Direct的方式来访问kafka的Broker,今天主要来谈一下,另一种方式,也就是KafkaReceiver. 初始化 ...

  3. Kakfa揭秘 Day3 Kafka源码概述

    Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...

  4. 实战录 | Kafka-0.10 Consumer源码解析

    <实战录>导语 前方高能!请注意本期攻城狮幽默细胞爆表,坐地铁的拉好把手,喝水的就建议暂时先别喝了:)本期分享人为云端卫士大数据工程师韩宝君,将带来Kafka-0.10 Consumer源 ...

  5. Catalyst揭秘 Day2 Catalyst源码初探

    Catalyst揭秘 Day2 Catalyst源码初探 这节课从源码角度来讲catalyst. 首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高.因为除了指令执行性能以外,更重要的是架构 ...

  6. Spark Streaming揭秘 Day26 JobGenerator源码图解

    Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在Sp ...

  7. Spark Streaming揭秘 Day22 架构源码图解

    Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...

  8. [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等

    本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...

  9. [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕

    本課主題 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 [引言部份:你希望读者看完这篇博客 ...

随机推荐

  1. uva10004 Bicoloring 黑白染色问题,DFS

    又是水题,最近切题目只能切出水题...orz 给出一个联通图,要求在个点上染上两种颜色,相邻的点颜色不能相同,看能不能染色成功. 用dfs搜索一个点的每条边,着色递归,如果已经染过色的且颜色出现矛盾就 ...

  2. iPhone screen size

      iPhone 4 iPhone 5 iPhone 6 iPhone 6 Plus Display Size 3.5 in 4 in 4.7 in 5.5 in Screen Size 320 x ...

  3. log4net在WinForm和ASP.net下的设置

    下载log4net.dll,放到bin目录下,然后引用到工程.下面说明配置和调用方法. 1.AssemblyInfo.cs末尾添加 [assembly: log4net.Config.XmlConfi ...

  4. Nginx环境下配置PHP使用的SSL认证(https)

    最近一段时间发现好多网站都从http协议变成了加密的https协议,比如说百度.吾志等等.https看起来比http高端了好多,而且在不同的浏览器向上还会显示出不同于http的URL展示效果(比如说c ...

  5. echars3.0 柱状图大小设置

    { name:'百度', type:'bar', barWidth : 10, stack: '搜索引擎', data:[620, 732, 701, 734, 1090, 1130, 1120] } ...

  6. 做一个聪明的.net程序员

    最近看了传智播客(http://net.itcast.cn/)的.net培训视频,感受颇深,忍不住要把感受写下来跟网友分享一下. 我从接触.net到现在已经至少过去了三五个年头,用.net也已经做了若 ...

  7. Android报错:The content of the adapter has changed...与Channel is unrecoverably broken and will be disposed的分析与解决办法

    在Android中adapter错误: The content of the adapter has changed but ListView did not receive a notificati ...

  8. centos6.5下逻辑卷操作

    1.将两块独立磁盘分别分区 2.创建物理卷-pvcreate 3.创建卷组 4.创建逻辑卷 5.格式化逻辑卷 6.扩展逻辑卷 7.缩小逻辑卷

  9. win7下将主分区转换成逻辑分区

    在了解怎么转换之前,先搞清楚主分区,扩展分区,逻辑分区的基本概念. 主分区,也称为主磁盘分区,和扩展分区.逻辑分区一样,是一种分区类型.主分区中不能再划分其他类型的分区,因此每个主分区都相当于一个逻辑 ...

  10. Memcached学习(二)

    4.协议简介 Memcached服务与各客户端间通过Tcp链接通讯(也可通过Udp链接). 各客户端间与服务间不需要发送特别的命令关闭链接,只要在不需要的时候直接关闭链接即可.建议客户端与服务间保持长 ...