zoukankan      html  css  js  c++  java
  • Spark Streaming揭秘 Day5 初步贯通源码

    Spark Streaming揭秘 Day5

    初步贯通源码

    引子

    今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们开始解密吧。

    1.创建StreamingContext

    StreamingContext是Spark Streaming是运行基础,也是负责管理和其运行的重要组件。
    我们需要特别注意下面这段代码:
    Snip20160508_45

    可以看到,StreamingContext内部包涵了一个SparkContext,这个可以告诉我们Streaming就是Spark Core上的一个应用程序,体现了不重复造轮子的原则,也是Spark Streaming能如此快发展的一个重要原因。

    2.创建SocketInputDStream

    还是以Demo代码为例,让我们进入StreamingContext的初始化
    Snip20160508_51
    其最终是生成了一个SocketInputDstream
    Snip20160508_50

    在继承关系中,比较关键是下面下两类:
    SocketInputDStream*
    -->DStream*

    让我们一步一步分析:

    2.1 SocketInputDStream
    关键是其内部类SocketReceiver
    Snip20160508_53

    调用流程:
    ReceiverSupervisor.start()
    -->启动线程调用SocketReceiver.onStart()
    -->SocketReceiver.receive()
    Snip20160508_52
    receive方法是实现具体的逻辑代码(根据不同类型的receiver有不同的实现,建立Socket连接,然后一直循环store)

    2.2 DStream,本身是RDD的模板,主要提供生成新RDD的功能
    2.2.1 RDD的存储:
    Snip20160508_49
    可以看到RDD是使用HashMap存储起来,DStream的本质就是存储的一系列的数据流。
    2.2.2 RDD的生成:
    Snip20160508_47

    getOrCompute方法完成了RDD的生成,是SparkStreaming的核心部分,后续会再深入各个子类的compute方法进行研究。

    3.StreamingContext启动(start)

    让我们进入start方法
    Snip20160508_59
    这里有两个要注意的地方:
    首先,会出现一个判断状态,其作用主要是用来确保一个程序中不能有多个SparkContext,这个也是所有Spark程序都会有的一个限制。
    其次,采用了新建Thread的方式进行启动,其中Property采用的是ThreadLocal变量,从确保不同线程间参数信息不会混淆。

    让我们进入启动代码的主体:
    Snip20160508_58

    首先,开启一个eventLoop进行异步调用,进行一些状态信息的管理,eventLoop是Spark中延时调度的实现,非常的精彩,建议仔细阅读下。
    其次,启动了rateController速率控制器,这个是SparkStreaming高容错特性的核心。

    之后,又到了Day4中提到的ReceiverTrack和JobGenerator

    下面,出现了一个很有特色的代码
    Snip20160508_55

    runDummySparkJob 从注释看,这个Job主要确保Slave在正常工作,是的,这就是三个谜团中提到的Job0,我们可以把其认为是系统自检。

    然后,通过调度算法,可以决定在哪个地方启动receiver
    Snip20160508_60

    让我们再往下,有一个关键出现了:
    Snip20160508_54
    是的,这个就是三个谜团中提到的Job1 ,利用这个Job,我们可以传递函数至Executor启动ReceiverSupervisor,这里巧妙的利用了Spark分布式机制来实现对于receiver这样基础设施的分布式管理,在不动声色间搞定了一切!!!

    最后是JobGenerator的调用,这里,最为关键的概念就是线程池,这个在Day4中已经解析过,就不再重复。

    小结

    至此,我们走读了SparkContext启动时的关键代码,同时解密了Job0和Job1的作用!!!Spark Streaming中的重要功能基本也是在Spark Core的基础上构造的,它其实是Spark Core上的一个应用程序,那么我们自己编写应用程序的时候,是不是可以有所借鉴呢?

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

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

  • 相关阅读:
    一个支持asp.net2.0和Sql server及Access的免费空间
    ASP.NET2.0数据指南中文版索引
    所阅读的ASP.NET 2.0文章
    SQL SERVER实用技巧
    2000/XP/2003常见问题集锦
    解讀多重啟動引導文件——BOOT.INI
    【译】Html5游戏开发示例(2)
    unity3d 鼠标事件穿透GUI的处理
    【译】Html5游戏开发示例(3)
    unity3d 截屏
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5469746.html
Copyright © 2011-2022 走看看