zoukankan      html  css  js  c++  java
  • Kakfa揭秘 Day8 DirectKafkaStream代码解析

    Kakfa揭秘 Day8

    DirectKafkaStream代码解析

    今天让我们进入SparkStreaming,看一下其中重要的Kafka模块DirectStream的具体实现。

    构造Stream

    首先,从工厂方法开始,在工厂方法createDirectStream中,有两类关键内容:

    1. fromOffset:是一个HashMap,指定我们要读取的topic和Partition。
    2. Decoder:为什么需要Decoder,是因为Kafka并不对数据有任何的处理,在发送中并不进行解码,需要在接收端才进行解码。

    Snip20160709_32

    Decoder共包含了三个输入参数,包括KeyDecoderClass,valueDecoderClass和messageHandler。
    messageHandler会调用两个Decoder基于raw message读出数据。
    Snip20160709_34
    Decoder的实现可以自行扩展,可以参照下面这个StringDecoder。需要注意的这里并不设置要解码的内容,所以完全可以应用在图片处理等领域。
    Snip20160709_33

    与Kafka集群的交互

    让我们进入DirectKafkaInputDStream,在这里主要构建了KafkaRDD。

    其中有一个关键点,这里直接构建了KafkaCluster对象,主要向Kafka集群获取一些元数据。
    Snip20160709_35

    让我们进入KafkaRDD,在compute方法中,主要是返回 kafkaRDDIterator。
    Snip20160709_36

    其中有一次出现了一个kc,这个和前面的不同,这里真正要进行数据处理。会调用SimpleComsumer一次性获取一批数据。
    Snip20160709_37

    分区方法

    下面也是最为关键的部分:

    Snip20160709_38

    我们可以看到,spark中的分区,是基于offsetRanges来决定的,offsetRanges的实现逻辑如下:是一个集合,读取过去一段时间产生的新的内容。
    Snip20160709_39

    我可以看到,就是基于kafka数据来源决定的,也就是说partition是由kafka中的partition决定的,一个kafka的partition 加offset,就对应了RDD中的partition。在实际生产环境中,这段代码可以优化,更大的利用机器资源提高并行度。

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

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

  • 相关阅读:
    语音识别系列之区分性训练和LF-MMI【转】
    node、npm安装与升级
    Vue3.0 新特性以及使用经验总结
    div垂直居中的方法
    前端性能优化
    大型网站设计总结
    前端SEO
    前端埋点总结
    jenkins自动构建、自动部署
    Python常见whl文件集合
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5656000.html
Copyright © 2011-2022 走看看