来源:《spark实战》讲义
- [1.1 ] spark与hadoop联系
Spark可以使用YARN作为它的集群管理器,并且可以处理HDFS的数据。这
对于已经部署Hadoop集群的用户特别重要,毕竟不需要做任何的数据迁移
就可以使用Spark的强大处理能力。
-
[ 1.2] Spark与Hadoop的区别
-
框架:
MR:由Map和Reduce两个阶段,并通过shuffle将两个阶段连接起来的。
Spark:是通用的DAG框架,可以将多个有依赖关系的作业转换为一个大的DAG。核心思想是将Map和Reduce两个操作进一步拆分为多个元操作,这些元操作可以灵活组合,产生新的操作,并经过一些控制程序组装后形成一个大的DAG作业。 -
中间结果存储方式:
MR:在DAG中,由于有多个MapReduce作业组成,每个作业都会从HDFS上读取一次数据和写一次数据(默认写三份),即使这些MapReduce作业产生的数据是中间数据 也需要写HDFS。
Spark: 在Spark中,使用内存(内存不够使用本地磁盘) 替代了使用HDFS存储中间结果。 -
操作模型:
MR:Hadoop只提供了Map和Reduce两种操作
Spark:Spark提供很多种的数据集操作类型比如Transformations 包括map, filter, flatMap,
sample, groupByKey, reduceByKey, union, join, cogroup, mapValues,sort,partionBy等多种操作类型,还提供actions操作包括Count,collect,reduce, lookup, save等多种。 -
编程模型
MR:Hadoop就是唯一的Data Shuffle一种模式
spark用户可以命名,物化,控制中间结果的存储、分区等,编程方式更灵活 -
缓存
MR:Hadoop无法缓存数据集
Spark:spark的60%内存用来缓存RDD,对于缓存后的rdd进行操作,节省IO,效率高 -
应用场景
MR:离线大规模分析处理
Spark:Hadoop适用的场景基本上都适合。对于迭代计算比Hadoop有更大的优势。 -
其他
MR:Hadoop对迭代计算效率低
Spark:
spark使用scala语言,更简洁高效
spark对机器学习算法,图计算能力有很好的支持。
- Spark处理
假设一个用户任务需要进行下面几个操作:
1)从HDFS读取数据; 2)filter;3)map;4)groupByKey;5)union;6)reduceByKey;7)将结果写到
HDFS
说明几点:
• spark是把该任务作为一个job来执行
• 虽然逻辑上是把HDFS上的文件全部拉入内存形成一个巨大的字符串数组, Filter一遍再生成一个略小的新的字符串数组,再map一遍又生成另一个字符串数组,然后再继续下
面的处理,实际上是逐条(构造Iterator)读取数据到内存然后filter、 map等处理,所以进行转换操作时不会占用太大内存。
• GroupByKey、 ReduceByKey等涉及到shuffle操作,不管采用hash方式还是sort方式shuffle后结果都是需要写本地磁盘的,这点与MapReduce类似,在shuffle操作方面, Spark并没有对MapReduce有明显的优势。但是对shuffle后的结果做GroupByKey、 ReduceByKey等类似reduce操作后生成的结果放到内存,这点与MapReduce是很大的不同。
处理步骤
• 从HDFS中逐条读取记录到内存(实际上是读取一个block 64M大小的数据),
然后在内存中逐条执行filter和map操作。
• 执行groupByKey(首先需要对key shuffle,然后才能执行groupByKey操作,其中shuffle操作写本地磁盘),groupByKey生成后的结果还是存放在内存(与MapReduce不同)
• 继续在内存执行union操作
• 执行ReduceByKey(shuffle操作写本地磁盘)
• 生成的结果写HDFS
- MR处理
:
• 其中filter、 map、 union操作都是属于map阶段操作, groupByKey和reduceByKey属于reduce阶段操作。
• 用户该任务被分割成多个job来执行。
• 对于MapReduce而言,没有filter、 union等操作,用户只能自己写程序来实现该功能。
•如果有连续多个map操作, MapReduce经过ChainMapper优化后,与spark类似, spark没有明显的优势;
•进行reduce系列操作时,需要先shuffle,再进行reduce操作。 spark 与MapReduce 进行shuffle后的结果都写本地盘,这点也没有明显区别
• Reduce操作生成的结果, spark是存放在内存中的, MapReduce是写HDFS的。所以用户的操作中涉及到的reduce操作越多, Spark比MapReduce写HDFS的次数就越少, Spark的性能优势就越大。
-
对比 Hadoop MapReduce 和 Spark 的 Shuffle 过程
从 high-level 的角度来看,两者并没有大的差别。 都是将 mapper(Spark 里是
ShuffleMapTask) 的输出进行 partition,
不同的 partition 送到不同的 reducer(Spark 里 reducer 可能是下一个 stage 里的
ShuffleMapTask, 也可能是ResultTask)。 Reducer 以内存作缓冲区,边 shuffle 边
aggregate 数据,等到数据 aggregate 好以后进行 reduce()从 low-level 的角度来看,两者差别不小。 Hadoop MapReduce 是 sort-based, 进入
combine() 和 reduce() 的 records必须先 sort。 这样的好处在于 combine/reduce() 可以
处理大规模的数据,因为其输入数据可以通过外排得到(mapper 对每段数据先做排序,
reducer 的 shuffle 对排好序的每段数据做归并)。目前的 Spark 是 hash-based, 通常使
用 HashMap来对 shuffle 来的数据进行 aggregate, 不会对数据进行提前排序。如果用户
需要经过排序的数据,那么需要自己调用类似sortByKey() 的操作从实现角度来看,两者也有不少差别。 Hadoop MapReduce 将处理流程划分出明显的几
个阶段: map(), spill, merge,shuffle, sort, reduce() 等。每个阶段各司其职,可以按照过程
式的编程思想来逐一实现每个阶段的功能。在 Spark 中, 没有这样功能明确的阶段,只有
不同的 stage 和一系列的 transformation(), 所以 spill, merge, aggregate 等操作需要蕴
含在transformation()中。