Kakfa揭秘 Day6 Consumer源码解密
2016-08-08 21:34
162 查看
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标签: Kafka
相关文章推荐
- Kakfa揭秘 Day6 Consumer源码解密
- Kakfa揭秘 Day7 Producer源码解密
- Kakfa揭秘 Day7 Producer源码解密
- Kakfa揭秘 Day3 Kafka源码概述
- 第37课:Kafka源码解读Consumer内幕解密
- 37:Kafka源码解读Consumer内幕解密
- 第88课:SparkStreaming从Flume Poll数据案例实战和内部源码解密
- Android应用开发揭秘的第19个程序5_14_GetDisplay修改版和高仿版的源码注释
- 源码推荐(5.21):可进行简单的二进制数运算的二进制计算器,ios加解密知识分享
- 用php进行md5解密的源码,亲测可用
- [Spark內核] 第41课:Checkpoint彻底解密:Checkpoint的运行原理和源码实现彻底详解
- Java 加密解密zip文件(亲测有效,附源码和jar包)
- dubbo源码分析-consumer端3-Invoker创建流程
- Lua源码揭秘(四)一个不算难的string库扩展
- Scala深入浅出实战经典:31,Option使用和实现内幕源码揭秘
- scala-31:Option使用和实现内幕源码揭秘
- Catalyst揭秘 Day6 Physical plan解析
- 网络分析技术揭秘-书籍源码下载
- 揭秘直销软件系统PHP源码开发价格与奖金制度设计方案
- 大数据IMF传奇行动绝密课程第91课:SparkStreaming基于Kafka Direct案例实战和内幕源码解密