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

  • 相关阅读:
    使用vue-cli4 F5刷新 报错:Uncaught SyntaxError: Unexpected token <
    visual stuido 删除虚拟目录
    visual studio2017 使用内联变量 编译失败 但不显示错误信息
    spring boot 整合CXF创建web service
    .net 解析以竖线,美元符等分割符分割的字符串为实体
    c# 动态构造实体属性的lambda Expression表达式
    spring boot 创建web service及调用
    JPA使用log4jdbc输出sql日志
    JPA 使用log4j2输出SQL日志到文件
    JPA 使用logback输出SQL日志到文件
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5635034.html
Copyright © 2011-2022 走看看