Spark
Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是加州大学伯克利分校的AMP实验室所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
1.和MapReduce相比Spark的比较快的原因:
Spark是粗粒度的资源调度,一次申请多次使用。
Spark支持基于内存迭代,MR不支持。
Spark支持DAG有向无环图 。
Spark可以根据不同场景选择不同shuffle
spark shuffle 比MR性能高(默认sortShuffle产生的磁盘小文件少)
2.Spark的技术栈
Spark Core用于离线计算
Spark SQL用于交互式查询
Spark Streaming用于实时流式计算
Spark MLlib用于机器学习
Spark GraphX用于图计算
3.Spark支持的语言类型
- scala,极度推荐,spark源码即为scala语言编写,用起来比java清爽不少。
- java,推荐,和scala一样都是编译成class文件运行在JVM上,效率上和scala相同,不过代码写起来不如scala简单
- Python,一般推荐,需要走一层解释器,相率不如scala和java高。
- R语言。。。。用的不多,不推荐。
4.Spark运行模式
- standalone模式:运行在Spark自己的资源调度器上。
- local模式:本地运行,用于测试阶段,本地开线程模拟任务执行。
- Yarn:运行在yarn上。
5.RDD—弹性分布式数据集
RDD特性:
- RDD是由一系列的Paratition组成的。(partition个数=split切片数 约等于 block数;Spark没有读文件的方法,依赖MR读文件的方法)
- RDD提供的每一个算子实际上是作用在每一个Paratition上的。
- RDD实际上是有一系列的依赖关系的,依赖于其他的RDD。(计算的容错性;体现了 RDD的弹性;父RDD不一定知道子RDD是谁,子RDD一定知道父RDD是谁)
- 可选:分区器作用在内部计算逻辑的返回值是kv格式的RDD上。
- 可选:RDD会提供一系列的最佳计算位置。(计算找数据)
RDD提供的算子:
算子分为三类:
- taransformation类算子:
map(一对一)、flatMap(一对多)、filter(一对N(0、1))、join、leftouterJoin、rightouterJoin、fullouterJoin、sortBy、sortByKey、gorupBy、groupByKey、reduceBy、reduceByKey、sample、union、mappatition、mappatitionwithindex、zip、zipWithIndex。
- action类算子:
count、collect(将task的计算结果拉回到Driver端)、foreach(不会回收所有task计算结果,原理:将用户传入的参数推送到各个节点上去执行,只能去计算节点找结果)、saveAsTextFile(path)、reduce、foreachPatition、take、first。
- 控制类算子。
cache(相当于MEMOORY_ONLY)、
persist(MEMORY_ONLY、DISK_ONLY、MEMORY_AND_DISK)
不过使用控制类算子要注意以下几点:
- 控制类算子后不能紧跟action类算子
- 缓存单元是partition
- 懒执行、需要action类算子触发执行。(如果application中只有一个job,没必要使用控制类算子)
RDD 的依赖关系
RDD按照依赖关系可以分为窄依赖和宽依赖。
窄依赖:父子RDD之间partition之间的关系是一对一即称之为窄依赖,窄依赖之间不会产生shuffle。
宽依赖: 父子RDD之间partition之间的关系是一对多,一般来说宽依赖之间都会产生shuffle。
宽窄依赖的作用
切割job,划分stage。按照RDD的宽窄依赖进行切割,切割点就是宽依赖,这样切出来的stage内部都是窄依赖,stage之间是宽依赖。
为什么要划分出stage?
让每个stage内部的task以管道的形式并行计算,因为窄依赖是一对一的关系,之间也不会产生shuffle,所以可以避免阻塞的执行task,让每个RDD的逻辑都执行起来。
结论:stage与stage之间是宽依赖,stage内部都是窄依赖
DAG(有向无环图)
RDD中不是存储的真实数据,而是存储的对数据处理的逻辑过程
对于KV格式的RDD应该说:存储的逻辑过程的返回类型是二元组类型我们称为是KV格式的RDD