一,Spark为什么快,Spark SQL 一定比 Hive 快吗

Spark相对于Hadoop更快,很多人说是因为spark运用内存计算,这种理解不得要领。Hadoop在计算时也是在内存中计算,内存计算不是spark快的原因。

spark比hadoop快的根本原因在于spark基于DAG的任务调度机制。

首先,spark根据基于宽窄依赖的规则将复杂的数据运算华为分多个stage。stage内部不同算子的数据交换直接在内存中进行,不需要通过HDFS。而Hadoop的Map与Map、Map与Reduce之间必须要通过HDFS文件系统进行数据交换,可以说Hadoop就慢在大量的磁盘IO。

其次,shuffle导致的数据网络分发是分布式系统的性能杀手,Hadoop对此无能为力,在满足条件的情况下,spark可以使用广播变量代替shuffle低效的网络数据分发。

第三,hadoop每个map或者reduce任务运行在单独的进程,而spark的taskExecutor是可以复用的,在并发大的情况下,重用节省的资源开销大大提高应用的执行效率。

spark sql绝大多数情况下比hive快,如果任务本身很简单,没有shffule,没有磁盘数据交换,也不一定。

二,RDD, DAG, Stage, Task 和 Job 怎么理解?

RDD:弹性分布式数据集

要理解RDD,要从它的五个属性开始:

  • 分区器。分布式计算的核心是将数据规模化整为零,将单任务处理海量数据转换为多任务处理数据子集,这就涉及到将海量数据集划分为多个小规模数据集。如果划分由分区器决定。
  • 分区。经过分区器划分而成的小规模数据集称之为分区。
  • 依赖。spark通过算子将一个RDD转换为另一个RDD,这两个RDD称之为父子RDD,这种关系称之为依赖。多个RDD之间的依赖形成的有向无环图称之为DAG。
  • compute。开发过程中,绝大部分时间都是在写compute,即对分区数据集的处理逻辑。
  • preferLocations。这是spark任务调度本地性的依据,我们都知道,移动计算比移动数据便宜,根据preferLocations确定计算在哪里计算最为高效,preferLocations指向当前进程时最为高效。

DAG:有向无环图

多个RDD之间的依赖形成的有向无环图称之为DAG。

STAGE、task
基于宽窄依赖将DAG划为分不同stage,同一个stage的不同算子组成一个任务task

job

spark有两类算子,一类是transform,一类是action,transform不会触发任务调度和执行,action会触发任务调度和执行,一个action会触发一个job。

三,宽依赖、窄依赖怎么理解?

概念上来看:

宽窄依赖是父子RDD依赖的两种类型,根据父RDD和子RDD的分区之间数据的流转方式来区分宽窄依赖,父RDD的一个分区的数据分发到子RDD的多个分区,则称之为宽依赖;一个父RDD一个分区的数据对应子RDD的一个分区,称之为窄依赖。

作用:

spark基于宽窄依赖将DAG划分为不同的stage,基于stage创建task,作为调度单位进行调度;

在数据分发上的不同:

宽依赖总是与shuffle如影随形,shuffle会导致数据在集群内通过网络进行分发,是作业性能低下的最大原因。

在错误恢复上的差异:

在task并发执行过程中给,某个task执行失败,对于窄依赖来说,只需要其父RDD的一个分区重新计算即可;而对于宽依赖来说,因为其依赖多个分区,父RDD需要在多个甚至全部分区上重新计算