Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在Job Scheduler的启动代码中,我们发现其采用了新建Thread的方式来启动代码 在更早的Spark版本中,并没有采用这种方式,为啥要这么多做? 从注释中,很明确的指出了,这么做的原因主要是对于变量的隔离 通过启动线程,可以使运行和用户处理线程没有关系,从而避免用户线程中变量设置的干扰 从变…
Spark Streaming揭秘 Day34 解析UI监听模式 今天分享下SparkStreaming中的UI部分,和所有的UI系统一样,SparkStreaming中的UI系统使用的是监听器模式.监听器模式是指,首先注册事件源,当事件或者数据发生改变时,监听器就会接收到这个改变,并对这种改变做出响应,监听器模式可以简单的理解为一种MVC的模式. SparkStreaming中的UI系统有两个非常的支持,就是处理时间process time和Batch等待时间Scheduler Delay.一…
Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统,可以简单的认为是一个文件系统,其作用类似于BlockManager, 我们首先看一下官方的说明: 这里有三个要点: 总体上,sparksteaming是用WAL去保存接收到的数据,并且在写入数据后,要把元数据汇报给Driver,这样失败了才能恢复起来. 每当写入一个log,就返回一个handle,h…
Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28已经分析过local模式下的日志,集群模式会比较类似,这次主要是对集群模式在的web监控台,进行统一的深度刨析. 我们从wordcount程序开始,代码如下,为了展示出SparkStreaming在集群中的运行,Batch Duration设置为5分钟. 系统作业 为了观察持续运行的情况,我们运行了…
Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountOnline这个Demo. 启动过程 SparkStreaming启动是从如下日志开始: 16/06/16 21:26:44 INFO ReceiverTracker: Starting 1 receivers 16/06/16 21:26:44 INFO ReceiverTracker: Recei…
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是JobScheduler的启动. StreamingContext启动 我们首先看下start方法的上半部分. 首先进行模式匹配,这是一个标准的条件判断,默认是INITIALIZED状态. 这里有三个关键部分: validate方法,会进行一些前置条件的判断.其中比较关键的是对DStreamGraph进…
Spark Streaming揭秘 Day18 空RDD判断及程序中止机制 空RDD的处理 从API我们可以知道在SparkStreaming中,对于RDD的操作一般都是在foreachRDD和Transform方法里. 在使用foreachRDD时,有一个风险,就是如果RDD为空可能会导致计算失败,那么应用如何来判断为空呢? 方法1:使用RDD.count count方法会直接触发一个Job,代价有些大 方法2:调用RDD.paritions.isEmpty 我们可以看到partitions是…
Spark Streaming揭秘 Day16 数据清理机制 今天主要来讲下Spark的数据清理机制,我们都知道,Spark是运行在jvm上的,虽然jvm本身就有对象的自动回收工作,但是,如果自己不进行管理的,由于运行过程中大量产生对象,内存很快就会耗尽.我们可以认为数据清理就是SparkStreaming自己的"GC". 从DStream开始 RDD是在DStream中产生的,RDD的操作也是在DStream中进行的,所以DStream会负责RDD数据的生命周期. 在DStream中…
Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们开始解密吧. 1.创建StreamingContext StreamingContext是Spark Streaming是运行基础,也是负责管理和其运行的重要组件. 我们需要特别注意下面这段代码: 可以看到,StreamingContext内部包涵了一个SparkContext,这个可以告诉我们St…
Spark Streaming揭秘 Day2 五大核心特征 引子 书接上回,Streaming更像Spark上的一个应用程序,会有多个Job的配合,是最复杂的Spark应用程序.让我们先从特征角度进行理解. 特征1:逻辑管理 DStream是对RDD封装的集合,作用于DStream的操作会对其中每个RDD进行作用,DStream Graph就是RDD Graph的模板,其逻辑管理完全继承RDD的DAG关系. 特征2:时间管理 Spark Streaming的最大特征是引入了时间属性,DStrea…
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来做的.抛开任何具体的东西,现在考虑下Spark core是个什么东西. 解析rdd 程序就是数据+代码.所以首先,我们需要考虑spark core由什么数据结构构成,一共就三种:rdd,broadcast,accumulator,最重要.最核心的是rdd. rdd可以简单的认为是一个数组,只不过是一…
Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的使用.另外,会看下在应用程序重新启动时,是如何处理checkpoint的. Checkpoint保存什么 checkpoint作为容错的设计,基本思路是把当前运行的状态,保存在容错的存储系统中(一般是hdfs).对于容错的处理,肯定是围绕作业紧密相关的,保存内容包括元数据和数据两部分. 从元数据角度…
Spark Streaming揭秘 Day31 集群模式下SparkStreaming日志分析(续) 今天延续昨天的内容,主要对为什么一个处理会分解成多个Job执行进行解析. 让我们跟踪下Job调用过程. 从框架代码开始 我们从生成Job开始,generateJobs方法产生了Job,之后,提交了一个JobSet来进行处理. JobSet会根据输出情况来确定Job数量,有多少个输出就有多少个Job,在我们的演示代码中,只有一个outputDStream,所以job是一个.jobExecutor…
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为Structured Streaming,和之前的很不同,功能更强大,效率更高,跟其他的组件整合性也更好. 连续应用程序continuous application 首先,也是最重要的,在2.x中,提出了一个叫做continuous applications连续应用程序的概念. 如下图所示,数据从Kaf…
Spark Streaming揭秘 Day27 Job产生机制 今天主要讨论一个问题,就是除了DStream action以外,还有什么地方可以产生Job,这会有助于了解Spark Streaming的本质. 我们从一个print方法触发,来看一下常用的action操作方式: 传统流程 一般来说,产生Job需要DStream的action操作,比如print方法 第一步,在print方法中,返回了一个ForeachDStream 第二步,在ForeachDStream中,通过被DStreamGr…
Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在SparkCore上,作为应用程序,需要开发者提供一些信息才能够运行. 简述 JobGenerator这个类会负责从DStream中产生Jobs,同时进行checkpoint和清理数据. JobGenerator的核心是一个钟,这里采用反射生成,并提供给定时器,根据周期性触发事件 generateJob…
Spark Streaming揭秘 Day24 Transformation和action图解 今天我们进入SparkStreaming的数据处理,谈一下两个重要的操作Transfromation和action背后的故事. InputReceiver 根据前面的课程,我们知道Transformation是逻辑级别的状态转换,并没有真的发生. 让我们从第一个Transformation,也就是SocketTextStream开始. 这里需要注意的是,这里返回的是字符串类型,这个是通过convert…
Spark Streaming揭秘 Day23 启动关闭源码图解 今天主要分析一下SparkStreaming的启动和关闭过程. 从Demo程序出发,主要聚焦在两段代码: 启动代码: 关闭代码: 启动过程 StreamingContext是对SparkContext的封装,是个装饰器模式,相当于给SparkCore化妆. 其中最关键的参数是Batch Duration,Driver和Executor上的两个定时器都是基于这个参数. 在构造时创建的关键对象如下: DStreamGraph,DStr…
Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreaming会源源不断的接收数据源,然后根据时间切割成不同的Batch,每个Batch都会产生RDD,RDD运行在Spark的引擎之上,处理会产生运行的结果. 我们对其进行细化,可以分解为8个步骤: Step1:获取外部数据源,最经典的来源于Kafka,其它例如Flume.数据库.HBase等 Step2.3…
Spark Streaming揭秘 Day21 动态Batch size实现初探(下) 接昨天的描述,今天继续解析动态Batch size调整的实现. 算法 动态调整采用了Fix-point迭代算法,其本质是一种回归计算,算法如下: 有点类似机器学习,学习当前SparkStreaming的状况,根据状况把Batch Duration调到最小,来获得最高的稳定性. 下面这张图比较重要,是主要描述了算法的实现思想: 基本思想是按100ms一个小的批次,根据处理情况,Job Generator会调整自…
Spark Streaming揭秘 Day20 动态Batch size实现初探(上) 今天开始,主要是通过对动态Batch size调整的论文的解析,来进一步了解SparkStreaming的处理机制,因为比较偏理论,么有代码演示. 缘起 从目前的业务发展来看,线上处理目前来看已经越来越重要,而一个突出的矛盾就是,传统框架Oracle+j2ee的框架下,存在一个致命的问题,就是无法突破单台机器的局限,可能容纳此刻流入的数据,于是分布式流处理程序越来越火热. 流处理的核心是追求更快的处理速度.但…
Spark Streaming揭秘 Day19 架构设计和运行机制 今天主要讨论一些SparkStreaming设计的关键点,也算做个小结. DStream设计 首先我们可以进行一个简单的理解:DStream就是加上时间维度的RDD.RDD的模板是DStream,DAG的模板是DStreamGraph,RDD的依赖关系就是DStream的依赖关系. 但是,从DStream的设计来看,我们会发现,DStream的操作和RDD并不是一一对应的,DStream并不直接支持join.orderBy等操作…
Spark Streaming揭秘 Day17 资源动态分配 今天,让我们研究一下一个在Spark中非常重要的特性:资源动态分配. 为什么要动态分配?于Spark不断运行,对资源也有不小的消耗,在默认情况下,Spark采用的是粗粒度分配,那么低峰值时会产生大量的资源浪费. 比较有意思的是,在Spark Core和Spark Streaming中对于动态资源管理,采用了两种不同的思路. Spark core:动态资源控制 在SparkContext启动时,可以看到就有一个动态资源分配的属性控制,默…
Spark Streaming揭秘 Day15 No Receivers方式思考 在前面也有比较多的篇幅介绍了Receiver在SparkStreaming中的应用,但是我们也会发现,传统的Receiver虽然使用比较方便,但是还是存在不少问题的,今天主要围绕kafka direct access讨论下,如果抛开Receiver来实现inputDStream该怎么做. KafkaRDD 我们知道,在Spark中,数据的访问主要是通过RDD来进行,而针对Kafka的数据,是使用了KafkaRDD.…
Spark Streaming揭秘 Day14 State状态管理 今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作.State是SparkStreaming中用来管理历史数据的结构.目前主要提供了updateStateByKey和MapWithStateRDD两个方法. updateStateByKey 首先,让我们先找一下这个方法的位置. 我们可以发现updateStateByKey这个方法并不在DStream中,而是在PairDStreamFunc…
Spark Streaming揭秘 Day13 数据安全容错(Driver篇) 书接上回,首先我们要考虑的是在Driver层面,有哪些东西需要维持状态,只有在需要维持状态的情况下才需要容错,总的来说,一共有三个组件需要容错: 数据层面:ReceiverBlockTracker,专门负责管理整个SparkStreaming运行数据的元数据,主要用来跟踪数据,需要状态. 逻辑层面:DStream和DStreamGraph,表达依赖关系,在恢复的时候需要恢复计算逻辑级别的依赖关系. 作业生成层面:Jo…
Spark Streaming揭秘 Day12 数据安全容错(Executor篇) 今天,让我们研究下SparkStreaming在Executor端的数据安全及容错机制. 在SparkStreaming中一共使用了两种容错方式: 存储数据副本 支持数据重放 副本机制 这是默认的处理方式,先让我们进入数据存储代码: 我们发现,SparkStreaming中存储是直接调用了blockManager中进行,blockManager本身就支持数据副本,是通过stoageLevel字段的定义. 一直往代…
Spark Streaming揭秘 Day11 Receiver Tracker的具体实现 ReceiverTracker是运行在Driver上Receiver管理程序,今天让我们深入学习一下. 核心:ReceivedBlockTracker 通过阅读代码,我们会发现ReceiverTracker中最为重要的是其中的成员ReceivedBlockTracker,主要存放实际的Block数据,这是一个典型的facade模式的实现. 数据结构:两个Map 在ReceivedBlockTracker中…
Spark Streaming揭秘 Day10 从BlockGenerator看接收数据的生命周期 昨天主要介绍了SparkStreaming中对于Receiver的生命周期管理,下面让我们进入到Receiver内部,研究下其工作机制. 首先,先总结下SparkStreaming中接收数据的特点: 数据需要不间断的按照次序接收 由于在driver中需要保存元数据,在存储数据之后,需要不断汇报给driver 让我们进入接收数据关键的BlockGenerator进行分析. Block概念 Block…
Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展 Receiver是SparkStreaming的输入数据来源,从对Receiver整个生命周期的设计,我们可以充分领略到Spark框架设计之巧妙,废话少说,让我们来看代码. 解决的问题 在开始之前,让我们先明确一个概念,就是Receiver于inputDStream之间的关系,从如下代码中,我们可以看到,receiver其实是由inputDStream映射得到的,也就是说Receiver和inputDS…