zoukankan      html  css  js  c++  java
  • Kakfa揭秘 Day6 Consumer源码解密

    Kakfa揭秘 Day6

    Consumer源码解密

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

    简单例子

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

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

    • 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方法。

    Snip20160702_9

    这里面有两个关键步骤:

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

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

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

    KafkaInputStream

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

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

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

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

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

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

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

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

    总得来说,思路和简单例子类似,都是分为两阶段进行,不过由于持续服务的特性,引入了多线程和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

  • 相关阅读:
    《Linux系统free命令的使用》学习笔记
    《postfix MAIL服务搭建(第一篇):》RHEL6
    RHEL(RedHat Enterprise Linux)5/6 ISO镜像下载
    《samba搭建win客户端和linux客户端的区别》
    《怎样实现通过shell脚本将用户踢出系统》
    《DDNS服务器的搭建和案例解决方法》
    《Usermod:user lee is currently logged in 家目录不能改变解决方法》
    你们看不懂为什么写这个博客吧
    JS几种数组遍历方式以及性能分析对比
    从概念到业务来看 To B 和 To C 产品区别在哪?
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5635034.html
Copyright © 2011-2022 走看看