【Spark】Spark Core 架构原理

1、BDAS: Berkeley Data Analytics Stack

2、Spark和MapReduce的对比

  MapReduce Spark
数据存储结构 磁盘中的HDFS文件系统 使用内存构建弹性分布式数据集RDD,对数据进行运算和缓存
编程范式 Map+Reduce DAG(有向无环图):Transformation+Action
中间数据 计算的中间数据需要落入磁盘,IO及序列化反序列化代价大 计算中间数据在内存中维护,存取速度是磁盘的多个数量级
运行方式 Task以进程方式维护,任务启动就有数秒 Task以线程方式维护,对小数据集的读取能达到亚秒级的延迟

1)MapReduce:分布式的计算框架
缺点:
执行速度慢,IO瓶颈(磁盘IO,网络IO);
shuffle机制:数据需要输出到磁盘,而且每次shuffle都需要进行排序操作;
框架机制:只有Map和Reduce两个算子,对于比较复杂的任务,需要构建多个job来执行;
中间数据:当存在job依赖的时候,job之间的数据需要落盘(输出到HDFS上);
MapReduce应用框架:
一个应用就是一个Job,一个Job包含两个Stage,分别是Map阶段和Reduce阶段,每个阶段一个Task任务(MapTask/ReduceTask);
执行任务的角色角度:ApplicationMaster + Container。
2)Spark:基于内存的分布式计算框架,是一个执行引擎
起源于加州大学伯克利分校的AMPLib实验室。
Spark应用框架:一个应用可以包含多个Job,一个Job可以包含多个Stage,一个Stage可以包含多个Task;
执行任务的角色角度: Driver + Executors。
Driver:进行初始化操作的进程;Executor:真正运行Task任务的进程。
官方网站:http://spark.apache.org/
官方博客:https://databricks.com/blog

3、Spark 1.x 源码编译

(1)编译方式
1)SBT编译
2)Maven编译

mvn clean package -DskipTests -Phadoop-2.4 -Dhadoop.version=2.5.0 -Pyarn -Phive -Phive-thriftserver

3)打包编译make-distribution.sh

./make-distribution.sh --tgz -Phadoop-2.4 -Dhadoop.version=2.5.0-cdh5.3.6 -Pyarn -Phive -Phive-thriftserver

4、运维监控

运维人员有专门的监控工具进行监控,比如:zabbix等;
使用CM(CDH)、Ambari(Apache、HDP)大数据的专门的运维监控工具;
可以通过软件自带的web界面进行监控;
Oozie等调度工具监控job的运行情况。

5、Spark应用构建及提交流程

(1)Driver中RDD的构建;
(2)RDD Job被触发(需要将rdd的具体执行步骤提交到executor中执行);
(3)Driver中的DAGScheduler将RDD划分为Stage阶段;
(4)Driver中的TaskScheduler将一个一个stage提交到executor上执行。
Spark应用的执行过程:
(1)client向资源管理服务(ResourceManager、Master等)申请运行的资源(driver资源),如果是client模式下,driver的资源不用进行申请操作;
(2)启动driver;
(3)driver向资源管理服务(ResourceManager、Master等)申请运行的资源(executor资源);
(4)启动executor;
(5)RDD构建;
(6)RDD执行。

6、Spark内存管理机制

参考文献:http://spark.apache.org/docs/1.6.1/configuration.html#memory-management
优化建议:如果spark应用缓存比较多shuffle比较少,则调高缓存的内存占比;反之亦然。
(1)Spark 1.6之前
Spark应用中代码使用内存:编写的程序中使用到的内存占20%;
Spark数据缓存的时候用到的内存占60%:spark.storage.memoryFraction;Spark shuffle过程中使用到的内存占20%:spark.shuffle.memoryFraction;
(2)Spark 1.6
Reserved Memory:固定300M,不能进行修改,作用:加载class的相对比较固定的对象以及计算最小Spark的Executor内存,为1.5* Reserved Memory = 450M;
User Memory:用户代码中使用到的内存, 默认占比:1-spark.memory.fraction;
Spark Memory: Spark应用执行过程中进行数据缓存和shuffle操作使用到的内存:spark.memory.fraction:0.75;
缓存(Storage Memory)和shuffle(Execution Memory)的内存分配是动态的,Storage最少固定占用的内存大小比例:spark.memory.storageFraction:0.5。
a. 如果Storage Memory和Execution Memory都是空的(都有容量):
如果有数据需要缓存,storage会占用execution部分的空余内存,同理execution也会占用storage部分的空余内存。
b. 如果storage memory满了,execution memory有空余:
如果有数据缓存操作,storage会占用execution部分的空余内存;
如果有执行过程内存需要,execution操作会占用storage部分的内存,会将storage部分存储的数据进行删除操作。
c. 如果storage memory有空余,execution memory满了:
如果数据有缓存操作,不能占用execution部分的内存;
如果有执行过程内存需要,execution操作会占用storage部分的内存。
备注:execution过程中使用到的内存是不允许进行删除操作的,storage的数据可以进行删除操作。
例如:默认1G。Reserved Memory:300M,Spark Memory: ( 1G - 300M) * 0.75 = 543M,storage memory最小: (1G - 300M) * 0.5 = 362M,User Memory: 1G - 300M - 543M = 181M。
(3)Spark动态资源分配
含义:指Executor的数量可以根据job中需要的资源来进行申请。
参考文献:http://spark.apache.org/docs/1.6.1/configuration.html#dynamic-allocation
现阶段来讲:SparkStreaming中实现的不太好,SparkCore和SparkSQL都可以应用。配置如下:
spark.dynamicAllocation.enabled:false,开启动态资源分配(true);
spark.dynamicAllocation.initialExecutors:初始化的时候给定默认executor的数量;
spark.dynamicAllocation.maxExecutors:infinity,动态资源分配最多允许分配多少资源;
spark.dynamicAllocation.minExecutors:0,动态资源最少分配的executor数量。

7、Spark开发

核心开发:离线批处理 / 延迟性的交互式数据处理。
SQL查询和实时计算:底层都是RDD和计算操作。
Spark核心编程原理图:

Spark架构原理图:

发布了219 篇原创文章 · 获赞 603 · 访问量 129万+

猜你喜欢

转载自blog.csdn.net/gongxifacai_believe/article/details/86709783
今日推荐