Spark基本原理(一)

1、Hadoop中的MR与Spark有什么区别?为什么Spark有优势?

MR的大致过程是:

Map端从HDFS中读取到文件,并简单的进行数据处理,处理后将结果Spill(溢写)到磁盘;Reduce从磁盘读取Map产生的结果,进行处理后通常还是写回到HDFS上。

这样的处理过程会多次的进行磁盘读写,而磁盘读取速度远远低于内存,所以性能有一定的瓶颈。

Spark是使用内存对数据进行操作,输入数据、处理中间结果、存储最终结果。

优势:内存处理速度远远大于磁盘处理速度;Spark提供了许多API,方便开发人员对其进行多种多样的数据处理操作。

2、懒加载

在Spark中,对RDD(一个特殊的集合类型,有容错机制,有分区机制)的操作有两种,其中转换(Transformation)就是懒操作,在执行完一个转换后,并不会马上触发RDD计算,只会生成一个RDD,而是之后再进行计算处理。

3、RDD的特点

弹性分布式数据集,可以将其看做是一种特殊的集合类型,具有容错机制,也具有分区机制(即可以分布式的存储和处理数据集)

弹性:数据集中的分区可以由用户指定

分布式:RDD的分区机制

容错机制:通过RDD之间的依赖关系实现数据的恢复(扩展:在分布式的环境中,可能会使得不同网络下的RDD之间存在依赖,此时为了让减少网络传输的数据量,可以部分中间结果存储到磁盘上

4、Stage的划分

在多个计算逻辑在一起时,就会形成多个RDD之间的依赖关系,这些依赖关系就是DAG。在DAG中,当遇到Action(Spark中的方法有两种,一个是转换-Transformation,另一个是执行-Action)时,会往前回溯进行计算机结果,在回溯过程中,每遇到一个宽依赖,就会形成一个Stage,而遇到窄依赖,由于窄依赖是懒加载,因此会进行流水线优化,直到遇到上一个宽依赖,这时这些经过的窄依赖会形成一个Stage。重复这些操作,就是Stage的划分过程。

Stage可以理解为一组task的集合,一个分区对应一个task

5、Spark程序运行的过程

1)在集群启动时,Master会收集集群中每台Worker的资源情况

2)当程序运行后,Master接受sc的请求,检查可用的Worker,并且启动一个可用的Worker;

3)Master将启动的Worker的列表通知给sc;

4)sc找到对应的Worker,在Worker中启动Executor,运行Task;

5)Task执行完后,Executor将结果返回给sc。

6、TaskScheduler的调度过程

1)从DAGScheduler中接受不同的Stage的任务;

2)向Cluster Manager申请资源;

3)得到资源后,为任务分配资源;

4)将分配好的结果返回给SchedulerBackend,之后,由SchedulerBackend将任务提交。

7、简述Spark中任务调度流程

1)在Client生成Job;

2)通过DAGScheduler对Job划分不同的Stage,并且进行提交;

3)DAGScheduler为需要计算的Partition生成TaskSet;

4)TaskScheduler提交计算任务;

5)调度器SchedulerBuilder调度任务;

6)TaskScheduler为任务分配资源;

7)SchedulerBackend将任务提交到Executor上运行。

8、说一下Spark的Shuffle

Shuffle,中文意思是洗牌,就是将具有共同特征的一类数据汇集到一起的过程

在Spark Shuffle的实际使用中,可能会有很复杂,例如数据量很大、发生多次磁盘读写、为了减少带宽压力而进行的压缩带来时间增加、数据传输。

在数据落地,会有争议,若是不将数据写入磁盘,会导致数据丢失后,需要重新计算依赖所有RDD。

数据持久化的两种方法:

1)Hash Based write Shuffle,此方法的特点是生成的中间文件较多(等于上游Task的数量乘以下游Task的数量),在Task数量较少时,可以使用,但Task数量很大时,就推荐使用Sort Based Write Shuffle;

2)Sort Based Write Shuffle,其生成的中间文件数等于上游Task的数量,同时会生成相同数量的index文件,该文件是用于说明中间文件的,在下游读取中间文件时,会通过index文件进行读取数据。

9、那么Sort Based Write Shuffle有什么缺点呢?

Sort Based Write会通过key对Partition进行排序,这就有点不符合最初避免计算时排序的初衷了,因为Spark比Hadoop的MapReduce快的原因之一就是不自动的对计算结果排序。

10、Spark中的缓存

在Spark中,实现缓存有两种方法,一是调用cache(),二是调用persist(指定的级别)。

缓存的级别:

1)MEMORY_ONIY:默认级别,也是cache()对应的级别。将RDD以反序列化的Java对象的形式存储在JVM中。如果内存空间不够,部分数据分区将不会被缓存,这部分数据再次使用需要重新计算;

2)MEMORY_AND_DISK:将RDD以反序列化的Java对象的形式存储在JVM中。如果内存空间不够,将未缓存的数据分区存储到磁盘,使用时从磁盘读取;

3)MEMORY_ONLY_SER:将RDD以序列化的Java对象的形式进行存储(每个分区为一个byte数组)。这种方式会比反序列化对象的方式节省很多空间,尤其是在使用fast serialize时节省更多的空间,但是在读取时会使得CPU的read变得更加密集。如果内存空间不够,部分数据分区将不会被缓存,在每次需要用到这些数据时重新计算;

4)MEMORY_AND_DISK_SER:将RDD以序列化的Java对象的形式进行存储(每个分区为一个byte数组)。但是内存空间不够,将未缓存的数据分区存储到磁盘,在需要使用这些数据时从磁盘读取;

5)DISK_ONLY:只在磁盘缓存RDD;

6)在上述级别后添加_2,表示每个分区在集群中的两个节点建立副本;

7)OFF_HEAP:将数据存储在off-heap memory(堆外内存)中。

以上的缓存可以等待自动被清理,也可以手动清理RDD..unpersist()。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值