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 ...
随机推荐
- 006.C++头文件
1.引用头文件 标准头文件 #include <iostream> 自定义头文件 #include "complex.h" 2.防卫式(guard)声明 ...
- linux环境下,接着lnmp,安装redis
linux环境下,安装redis 操作记录: 回到家目录 cd ~查看 ls进入 lump cd lnmp1.3-fullls??? sudo ./addons.sh //---进入后选 ...
- 【转】Pyhton 单行、多行注释符号使用方法及规范
转自:Pyhton 单行.多行注释符号使用方法及规范 python中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的.python注释也有自己的规范,在文章中会介绍到.注释可以起到一个 ...
- 阿里云oss命令详解
SYNOPSIS 上传,下载或拷贝Objects SYNTAX ossutil cp file_url cloud_url [-r] [-f] [-u] [--output-dir=odir] [-- ...
- 企业CEO最核心的应该是销售意识
一个企业的本质是赚利润,利润怎么来?靠卖东西,所以企业里面最重要的应该是销售人员.在一些500强的外企里有一个规定,没有做过销售的人是很难升到总经理的,在以色列的军队中,没有当过班长,是不可以被提拔为 ...
- Java中哈希表(Hashtable)是如何实现的
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
- 【poj2947】高斯消元求解同模方程组【没有AC,存代码】
题意: p start enda1,a2......ap (1<=ai<=n)第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x, ...
- 【BZOJ】3038: 上帝造题的七分钟2 && 3211: 花神游历各国
[算法]线段树||树状数组&&并查集 [题解]修改必须暴力单点修改,然后利用标记区间查询. 优化:一个数经过不断开方很快就会变成1,所以维护区间最大值. 修改时访问到的子树最大值< ...
- UIImageView属性---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/C ...
- html+js+node实现五子棋线上对战,五子棋最简易算法
首先附上我的github地址,https://github.com/jiangzhenfei/five,线上实例:http://47.93.103.19:5900/client/ 线上实例,你可以随意 ...