2.Spark Streaming运行机制和架构
1 解密Spark Streaming运行机制
上节课我们谈到了技术界的寻龙点穴。这就像过去的风水一样,每个领域都有自己的龙脉,Spark就是龙脉之所在,它的龙穴或者关键点就是SparkStreaming。这是上一节课我们非常清晰知道的结论之一。而且上一节课,我们采用了降维的方式。所谓降维的方式,是指把时间放大,就是把时间变长的情况下,我们做SparkStreaming的案例演示的实战,实战的结果是,我们发现在特定的时间段里面,确实是具体的RDD在工作,那么这一节课有必要在上一节课的基础上去谈一下它的运行机制和具体架构。
SparkStreaming在运行的时候,与其说是基于Spark Core上的一个流式处理的框架,不如说是它更像是SparkCore上的一个应用程序。而且在我们上一节课演示的时候,Spark Streaming在运行的时候启动了很多的Job,这个Job包含了两个层面,第一个就是围绕你每个batch,或者每个window运行的具体的Job,也有是为了框架正常运行而启动的Job,例如我们Receiver启动的时候,它启动了Job,而这个启动的Job是为其他Job服务的,我们由此得出了一个结论:要做复杂的Spark应用程序,往往多个Job之间会进行配合。所以,我们看SparkStreaming运行的时候,我们更多的是感受它是一个复杂的应用程序。上一节课我们说过这样一句话,SparkStreaming就是最复杂的应用程序。如果你对Spark Streaming了如指掌,你对任意的Spark程序的编写也一定没有问题。
我们先回顾下Spark官网(http://spark.apache.org)下面这张图,ApacheSpark就是Spark Core,最开始Spark发布的时候没有Apache Spark上面的子框架,他们是逐步开发出来的。这句话像废话,其实是有意义的,因为我们可以通过上层框架的使用,来洞察出Spark内部的机制到底是怎么样的。我们上节课也讲了从Spark Streaming入手定制Spark源码的原因,也讲了为什么不从其他框架入手的原因,所以我们要通过Spark Streaming彻底地研究Spark。
我们以前基于SparkCore的时候都是基于RDD编程,包括以前的DataFrame,以及Spark 1.6.x推出的DataSet(据说Spark 2.x会成为主流),其实都是基于RDD编程。整个Spark都是基于RDD构建起来的,SparkCore的处理每一步都基于RDD进行操作的,RDD之间有依赖关系,这已经是大家的常识了。
我们再来看下面这张图。右边的RDDGraph显示RDD A依赖RDD M,RDD M进一步依赖RDD J,RDDJ又依赖RDD B。这个A从操作的角度讲就是Sparkaction。这里我们看到有3个Spark Job。如果从DStream的角度讲,这3个Job并没有执行。但从RDD的角度讲,因为是action,所以会具体的执行。为什么这么说呢?首先我们看得是RDD的DAG,Spark Streaming在RDD DAG的基础上加上了时间维度。
回顾昨天课上运行的一个SparkStreaming程序,我们看到Spark Streaming除了自己框架的scheduler.JobScheduler、dstream.SocketInputDStream等内容,还使用了SparkCore的各种类型的RDD,比如rdd.MapPartitionRDD、rdd.PartitionerAwareUnionRDD、rdd.ShuffleRDD和rdd.BlockRDD等。这个Spark Streaming程序跟我们以前写的程序没有太多的区别,只不过是我们看见它在不断的运行,它之所以在不断地运行,就是因为在不断地循环,循环的依据就是基于时间维度。也就是说,DStream是RDD基础之上加上了时间维度,而RDD DAG依赖又叫空间维度,所以说整个Spark Streaming就是时空维度的一个东西。
我们再来看一个下面的图。数据通过inputdata stream不断流进来;流进来就表示是有时间的,Spark Streaming根据时间把流进来的数据划分成不同Job(batches of inputdata),每个Job都有对应的RDD依赖,而每个RDD依赖都有输入的数据,所以这里可以看作是由不同RDD依赖构成的batch,而batch就是Job;然后由Spark Engine得出一个又一个的结果。
我们继续看上图的最下面部分,操作的时候基于个RDD。具体产生了什么样内容的RDD,完全以时间为依据的。这个是SparkStreaming非常厉害的一点,只以时间为依据,和其他的一切逻辑和架构解耦合。我们可以认为SparkStreaming这种以时间为依据划分Job的方式是软件系统中最大解耦合的一种实现。这个确实是非常精妙的。
2 解密Spark Streaming架构
对于时空维度,我们可以想象一下有一个坐标,有X轴和Y轴,Y轴就是对RDD的操作,也就是所谓的RDD的依赖关系构成整个Job的逻辑,X轴就是时间。随着时间的流逝,假设是1秒钟,它会生成一个Job,即Job的实例,由于它在时空中,而时空中万物是运动的,所以1秒钟产生的Job在集群中运行就是运动。我们甚至可以深究其中蕴含的哲学级别的东西,这时候你看它就有一种心旷神怡的感觉。
个秒钟。在这秒钟,一般会有很多的毫秒产生一个秒钟就有个秒钟积累个秒钟的毫秒级别的运行,只是现在的毫秒的样子。我们已经找到了控制毫秒以内的方式。由于时间固定,所以每个时间间隔产生的个个个秒钟的个连续的秒,所以有个对应的batch。从图中看,空间维度是一样的,只不过是时间维度(特指时间点)的不同,导致了流入数据的不同,从而处理的数据量和数据内容的不同,所以导致了不同的RDDDAG依赖关系的实例。而由于RDD Graph脱胎于DStreamGraph,所以DStream Graph就是RDDGraph的模版。
注意:随着时间的流逝,SparkStreaming会继续处理,即使没有输入数据,只不过没有有效输出而已。
我们现在看看从SparkStreaming角度出发,架构中应该有些什么要点:
1) 需要RDD DAG的生成模版:DStreamGraph
由于Spark Streaming基于SparkRDD,那么必须有一种东西表示RDD DAG这种处理逻辑,就是空间维度。
2) 需要基于Timeline的Job控制
3) 需要InputStreamings和OutputStreaming,代表数据的输入和输出
DStreamGraph.scala:
privateval inputStreams = new ArrayBuffer[InputDStream[_]]()
private val outputStreams = new ArrayBuffer[DStream[_]]()
InputDStream.scala:
abstractclass InputDStream[T: ClassTag] (ssc_ : StreamingContext)
extends DStream[T](ssc_) {
4) 具体的Job运行在Spark Cluster之上,此时系统容错就至关重要
- SparkStreaming在流量过大时能限流,能动态的调整CPU、内存等资源。
5) 需要事务处理
- 我们希望流进来的数据一定会被处理,而且只处理一次。在处理出现崩溃的情况下如何保证Exactly once的事务语义。
在结束这节课之前,我们初步看看DStream。
上图中,从前面2个红色框中的代码可以看出,DStream就是Spark Streaming的核心,就像RDD是Spark Core的核心,它也有dependencies和compute。
而第3个红色框中的代码表明generatedRDDs是一个HashMap,以时间为key,RDD数组为value。所以说DStream就是RDD的模版。DStream可以说是逻辑级别的,RDD就是物理级别的,DStream所表达的最终都是转换成RDD去实现。前者是更高级别的抽象,后者是底层的实现。DStream实际上就是在时间维度上对RDD集合的封装,DStream与RDD的关系就是随着时间流逝不断的产生RDD,对DStream的操作就是在固定时间上操作RDD。
DStream有很多子类。
DStream间的转换操作就是子类的转换。也实际上是RDD的转换,然后产生依赖关系的Job,并通过JobScheduler在集群上运行。
总结:
在空间维度上的业务逻辑作用于DStream,随着时间的流逝,每个BatchInterval形成了具体的数据集,产生了RDD,对RDD进行transform操作,进而形成了RDD的依赖关系RDD DAG,形成Job。然后JobScheduler根据时间调度,基于RDD的依赖关系,把作业发布到Spark集群上去运行,不断的产生Spark作业。
本博客内容来源于Spark发行版本定制课程
2.Spark Streaming运行机制和架构的更多相关文章
- 通过案例对 spark streaming 透彻理解三板斧之三:spark streaming运行机制与架构
本期内容: 1. Spark Streaming Job架构与运行机制 2. Spark Streaming 容错架构与运行机制 事实上时间是不存在的,是由人的感官系统感觉时间的存在而已,是一种虚幻的 ...
- 通过案例对 spark streaming 透彻理解三板斧之二:spark streaming运行机制
本期内容: 1. Spark Streaming架构 2. Spark Streaming运行机制 Spark大数据分析框架的核心部件: spark Core.spark Streaming流计算. ...
- Spark Streaming运行流程及源码解析(一)
本系列主要描述Spark Streaming的运行流程,然后对每个流程的源码分别进行解析 之前总听同事说Spark源码有多么棒,咱也不知道,就是疯狂点头.今天也来撸一下Spark源码. 对Spark的 ...
- 【Spark 深入学习 04】再说Spark底层运行机制
本节内容 · spark底层执行机制 · 细说RDD构建过程 · Job Stage的划分算法 · Task最佳计算位置算法 一.spark底层执行机制 对于Spark底层的运行原理,找到了一副很好的 ...
- MySQL运行机制原理&架构
1.MySQL知识普及: MySQL是一个开放源代码的关系数据库管理系统. MySQL架构可以在多种不同场景中应用并发挥良好作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统 ...
- Spark Streaming架构设计和运行机制总结
本期内容 : Spark Streaming中的架构设计和运行机制 Spark Streaming深度思考 Spark Streaming的本质就是在RDD基础之上加上Time ,由Time不断的运行 ...
- 大数据技术之_19_Spark学习_04_Spark Streaming 应用解析 + Spark Streaming 概述、运行、解析 + DStream 的输入、转换、输出 + 优化
第1章 Spark Streaming 概述1.1 什么是 Spark Streaming1.2 为什么要学习 Spark Streaming1.3 Spark 与 Storm 的对比第2章 运行 S ...
- 16.Spark Streaming源码解读之数据清理机制解析
原创文章,转载请注明:转载自 听风居士博客(http://www.cnblogs.com/zhouyf/) 本期内容: 一.Spark Streaming 数据清理总览 二.Spark Streami ...
- Spark Streaming:大规模流式数据处理的新贵(转)
原文链接:Spark Streaming:大规模流式数据处理的新贵 摘要:Spark Streaming是大规模流式数据处理的新贵,将流式计算分解成一系列短小的批处理作业.本文阐释了Spark Str ...
随机推荐
- Maatkit--Mysql的高级管理工具
Maatkit是不错的mysql管理工具,已经成为Percona的一部分.包含以下主要工具: 1.mk-table-checksum 检查主从表是否一致的有效工具 2.mk-table-sync 有效 ...
- 话说Svn与Git的区别
这篇主要是谈谈两者的区别,至于谁优谁劣看官自己思考吧! 把第一条理解到位思想到位了做起来才会有的放矢,其他几条都是用的时候才能体会到 1) 最核心的区别Git是分布式的,而Svn不是分布的.能理解这点 ...
- PHP扩展--Suhosin保护PHP应用系统
什么是Suhosin? Suhosin是一个PHP程序的保护系统.它的设计初衷是为了保护服务器和用户抵御PHP程序和PHP核心中,已知或者未知的缺陷. Suhosin有两个独立的部分,使用时可以分开使 ...
- 长ping域名带时间戳
ping www.baidu.com |awk '{print $0 "\t" strftime("%Y:%m:%d-%H:%M:%S",systime())} ...
- Linux常用命令汇总(持续更新中)
命令 说明 注意点 cat access.log | wc -l 统计行数 awk命令可以做到同样的想过:cat access.log | awk 'END {print NR}' grep vnc ...
- 51nod1667 概率好题
基准时间限制:4 秒 空间限制:131072 KB 分值: 640 甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S ...
- bzoj 1452: [JSOI2009]Count ——二维树状数组
escription Input Output Sample Input Sample Output 1 2 HINT ———————————————————————————————————————— ...
- 超详细的Java面试题总结(一)之Java基础知识篇
面向对象和面向过程的区别 面向过程: 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的因 ...
- Perl6 Bailador框架(2):路径设置
use v6; use Bailador; =begin pod get表示是get发送 post表示是post发送 get/post 后面的 '/name' 表示是路径 => sub {} 是 ...
- Python模块学习 - click
Click模块 click模块是Flask的作者开发的一个第三方模块,用于快速创建命令行.它的作用与Python标准库的argparse相同,但是,使用起来更简单. click是一个第三方库,因此使用 ...