剖析Spark

Spark

Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是加州大学伯克利分校的AMP实验室所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

1.和MapReduce相比Spark的比较快的原因:

  1. Spark是粗粒度的资源调度,一次申请多次使用。
  2. Spark支持基于内存迭代,MR不支持。
  3. Spark支持DAG有向无环图 。
  4. Spark可以根据不同场景选择不同shuffle
  5. spark shuffle 比MR性能高(默认sortShuffle产生的磁盘小文件少)

2.Spark的技术栈 

Spark Core用于离线计算

Spark SQL用于交互式查询 

Spark Streaming用于实时流式计算 

Spark MLlib用于机器学习 

Spark GraphX用于图计算 

3.Spark支持的语言类型

  1. scala,极度推荐,spark源码即为scala语言编写,用起来比java清爽不少。
  2. java,推荐,和scala一样都是编译成class文件运行在JVM上,效率上和scala相同,不过代码写起来不如scala简单
  3. Python,一般推荐,需要走一层解释器,相率不如scala和java高。
  4. R语言。。。。用的不多,不推荐。

4.Spark运行模式

  1. standalone模式:运行在Spark自己的资源调度器上。
  2. local模式:本地运行,用于测试阶段,本地开线程模拟任务执行。
  3. Yarn:运行在yarn上。

5.Spark集群的搭建

集群搭建详见洛洛的博客,高可用集群的搭建详见洛洛教你搭建高可用Spark集群。

6.RDD—弹性分布式数据集

RDD特性:

  1. RDD是由一系列的Paratition组成的。(partition个数=split切片数 约等于 block数;Spark没有读文件的方法,依赖MR读文件的方法)
  2. RDD提供的每一个算子实际上是作用在每一个Paratition上的。
  3. RDD实际上是有一系列的依赖关系的,依赖于其他的RDD。(计算的容错性;体现了RDD的弹性;父RDD不一定知道子RDD是谁,子RDD一定知道父RDD是谁)
  4. 可选:分区器作用在内部计算逻辑的返回值是kv格式的RDD上。
  5. 可选:RDD会提供一系列的最佳计算位置。(计算找数据)

RDD提供的算子:

算子分为三类:

1. taransformation类算子:

map(一对一)、flatMap(一对多)、filter(一对N(0、1))、join、leftouterJoin、rightouterJoin、fullouterJoin、sortBy、sortByKey、gorupBy、groupByKey、reduceBy、reduceByKey、sample、union、mappatition、mappatitionwithindex、zip、zipWithIndex。

2. action类算子:

 count、collect(将task的计算结果拉回到Driver端)、foreach(不会回收所有task计算结果,原理:将用户传入的参数推送到各个节点上去执行,只能去计算节点找结果)、saveAsTextFile(path)、reduce、foreachPatition、take、first。

3. 控制类算子。

cache(相当于MEMOORY_ONLY)、
persist(MEMORY_ONLY、DISK_ONLY、MEMORY_AND_DISK)

不过使用控制类算子要注意以下几点:

  1. 控制类算子后不能紧跟action类算子
  2. 缓存单元是partition
  3. 懒执行、需要action类算子触发执行。(如果application中只有一个job,没必要使用控制类算子) 

RDD 的依赖关系

RDD按照依赖关系可以分为窄依赖和宽依赖。

窄依赖:父子RDD之间partition之间的关系是一对一即称之为窄依赖,窄依赖之间不会产生shuffle。

剖析Spark_第1张图片

宽依赖: 父子RDD之间partition之间的关系是一对多,一般来说宽依赖之间都会产生shuffle。

剖析Spark_第2张图片

宽窄依赖的作用

切割job,划分stage。按照RDD的宽窄依赖进行切割,切割点就是宽依赖,这样切出来的stage内部都是窄依赖,stage之间是宽依赖。

为什么要划分出stage?

让每个stage内部的task以管道的形式并行计算,因为窄依赖是一对一的关系,之间也不会产生shuffle,所以可以避免阻塞的执行task,让每个RDD的逻辑都执行起来。

结论:stage与stage之间是宽依赖,stage内部都是窄依赖

DAG(有向无环图)

剖析Spark_第3张图片

RDD中不是存储的真实数据,而是存储的对数据处理的逻辑过程
对于KV格式的RDD应该说:存储的逻辑过程的返回类型是二元组类型我们称为是KV格式的RDD 

 

你可能感兴趣的:(HPE大数据学习)