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方法。
这里面有两个关键步骤:
- 发起fetch操作,将数据拉去到本地。
- 将本地获得的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上。然后,我们怎么去获取数据。
- 数据在哪里,被zk管理,所以连上zk的话,会请求topic和partition,zk会根据leader和followers的信息,把数据所在的broker具体topic的partition给你,每个partition都会产生一个线程来抓取。
- 抓取线程线程启动之后内部不断的循环,获取数据后会放入一个堵塞队列。抓到一条数据就给阻塞队列。
- consumer本身用一个线程从堵塞队列拿数据,完成消费,可以看到整个过程都是并行的。
欲知后事如何,且听下回分解!
DT大数据每天晚上20:00YY频道现场授课频道68917580
Kakfa揭秘 Day6 Consumer源码解密的更多相关文章
-
Kakfa揭秘 Day7 Producer源码解密
Kakfa揭秘 Day7 Producer源码解密 今天我们来研究下Producer.Producer的主要作用就是向Kafka的brokers发送数据.从思考角度,为了简化思考过程,可以简化为一个单 ...
-
Kakfa揭秘 Day9 KafkaReceiver源码解析
Kakfa揭秘 Day9 KafkaReceiver源码解析 上一节课中,谈了Direct的方式来访问kafka的Broker,今天主要来谈一下,另一种方式,也就是KafkaReceiver. 初始化 ...
-
Kakfa揭秘 Day3 Kafka源码概述
Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...
-
实战录 | Kafka-0.10 Consumer源码解析
<实战录>导语 前方高能!请注意本期攻城狮幽默细胞爆表,坐地铁的拉好把手,喝水的就建议暂时先别喝了:)本期分享人为云端卫士大数据工程师韩宝君,将带来Kafka-0.10 Consumer源 ...
-
Catalyst揭秘 Day2 Catalyst源码初探
Catalyst揭秘 Day2 Catalyst源码初探 这节课从源码角度来讲catalyst. 首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高.因为除了指令执行性能以外,更重要的是架构 ...
-
Spark Streaming揭秘 Day26 JobGenerator源码图解
Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在Sp ...
-
Spark Streaming揭秘 Day22 架构源码图解
Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...
-
[Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...
-
[Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
本課主題 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 [引言部份:你希望读者看完这篇博客 ...
随机推荐
-
100735G
很明显,我们构造出一个串后,无非就是两个结果:最长的是黑的,最长的是白的,因此选两个中小的就可以了 #include<iostream> using namespace std; int ...
-
python基础知识八
当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了.上述这些情况可以使用异常来处理. 如你的程序中有一些 ...
-
ORACLE 视图的 with check option
ORACLE 视图的 with check option 我们来看下面的例子: create or replace view testview as select empno,ename from e ...
-
【ElementUI】日期选择器时间选择范围限制
ElementUI是饿了么推出的一套基于vue2.x的一个ui框架.官方文档也很详细,这里做一个element-ui日期插件的补充. 官方文档中使用picker-options属性来限制可选择的日期, ...
-
JS兼容问题
//1.滚动条到顶端的距离 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //2.滚动条 ...
-
让docker容器开机启动
网上有些文章说,要让docker 的容器自动在开机启动,是写脚本,比如在 rc.local 中写.其实完全没必要这么麻烦,docker 有相关指令,docker run 指令中加入 --restart ...
-
[development][C][thread_local] 线程全局变量
线程全局变量, 线程本地存储, thread_local storage 只需要在变量定义的最前边添加 __thread 关键字. 用法: https://gcc.gnu.org/onlinedocs ...
-
React 事件处理函数
触摸事件:onTouchCancel\onTouchEnd\onTouchMove\onTouchStart (只会在移动设备上接受) 键盘事件:onKeyDown\onKeyPress\onKeyU ...
-
如何使用button在tab中新建打开一个链接页
在APPBOX某页中如何使用button按钮打开一个新的链接页.比如说百度.谷歌等 在后台的单击事件中使用以下语句即 string url = "DownloadIma ...
-
leetcode933
public class RecentCounter { Queue<int> Q; public RecentCounter() { Q = new Queue<int>() ...