Spark Streaming揭秘 Day8 RDD生命周期研究 今天让我们进一步深入SparkStreaming中RDD的运行机制.从完整的生命周期角度来说,有三个问题是需要解决的: RDD到底是怎么生成的 具体执行的时候和Spark Core上的执行有所不同 运行之后对RDD如何处理,怎么对已有的RDD进行管理 今天主要聚焦于第一个问题. 从DStream开始 DStream类的注释很明确的说明了,DStream中包含以下内容: DStream依赖的其他DStream(第一个DStream是…
Spark Streaming揭秘 Day10 从BlockGenerator看接收数据的生命周期 昨天主要介绍了SparkStreaming中对于Receiver的生命周期管理,下面让我们进入到Receiver内部,研究下其工作机制. 首先,先总结下SparkStreaming中接收数据的特点: 数据需要不间断的按照次序接收 由于在driver中需要保存元数据,在存储数据之后,需要不断汇报给driver 让我们进入接收数据关键的BlockGenerator进行分析. Block概念 Block…
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揭秘 Day19 架构设计和运行机制 今天主要讨论一些SparkStreaming设计的关键点,也算做个小结. DStream设计 首先我们可以进行一个简单的理解:DStream就是加上时间维度的RDD.RDD的模板是DStream,DAG的模板是DStreamGraph,RDD的依赖关系就是DStream的依赖关系. 但是,从DStream的设计来看,我们会发现,DStream的操作和RDD并不是一一对应的,DStream并不直接支持join.orderBy等操作…
Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展 Receiver是SparkStreaming的输入数据来源,从对Receiver整个生命周期的设计,我们可以充分领略到Spark框架设计之巧妙,废话少说,让我们来看代码. 解决的问题 在开始之前,让我们先明确一个概念,就是Receiver于inputDStream之间的关系,从如下代码中,我们可以看到,receiver其实是由inputDStream映射得到的,也就是说Receiver和inputDS…
Spark Streaming揭秘 Day17 资源动态分配 今天,让我们研究一下一个在Spark中非常重要的特性:资源动态分配. 为什么要动态分配?于Spark不断运行,对资源也有不小的消耗,在默认情况下,Spark采用的是粗粒度分配,那么低峰值时会产生大量的资源浪费. 比较有意思的是,在Spark Core和Spark Streaming中对于动态资源管理,采用了两种不同的思路. Spark core:动态资源控制 在SparkContext启动时,可以看到就有一个动态资源分配的属性控制,默…
Spark Streaming揭秘 Day14 State状态管理 今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作.State是SparkStreaming中用来管理历史数据的结构.目前主要提供了updateStateByKey和MapWithStateRDD两个方法. updateStateByKey 首先,让我们先找一下这个方法的位置. 我们可以发现updateStateByKey这个方法并不在DStream中,而是在PairDStreamFunc…
Spark Streaming揭秘 Day11 Receiver Tracker的具体实现 ReceiverTracker是运行在Driver上Receiver管理程序,今天让我们深入学习一下. 核心:ReceivedBlockTracker 通过阅读代码,我们会发现ReceiverTracker中最为重要的是其中的成员ReceivedBlockTracker,主要存放实际的Block数据,这是一个典型的facade模式的实现. 数据结构:两个Map 在ReceivedBlockTracker中…
Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们开始解密吧. 1.创建StreamingContext StreamingContext是Spark Streaming是运行基础,也是负责管理和其运行的重要组件. 我们需要特别注意下面这段代码: 可以看到,StreamingContext内部包涵了一个SparkContext,这个可以告诉我们St…