1.Spark是MapReduce的进阶架构
2.Spark相对于MapReduce的优势
MapReduce存在的问题
1. MapReduce框架局限性
1)仅支持Map和Reduce两种操作
2)处理效率低效。
a)Map中间结果写磁盘,Reduce写HDFS,多个MR之间通过HDFS交换数据; 任务调度和启动开销大;
b)无法充分利用内存
c)Map端和Reduce端均需要排序
3)不适合迭代计算(如机器学习、图计算等),交互式处理(数据挖掘) 和流式处理(点击日志分析)
2. MapReduce编程不够灵活
1)尝试scala函数式编程语言
3. 主要用于hue或者支持hive sql 的表/视图创建、清空、删除,数据的查询,表结构的设置与查看。
Spark
1. 高效,快3-5倍
一般来说,Spark比MapReduce运行速度快的原因主要有以下几点:
- task启动时间比较快,Spark是fork出线程;而MR是启动一个新的进程;
- 更快的shuffles,Spark只有在shuffle的时候才会将数据放在磁盘,而MR却不是。
- 更快的工作流:典型的MR工作流是由很多MR作业组成的,他们之间的数据交互需要把数据持久化到磁盘才可以;而Spark支持DAG以及pipelining,在没有遇到shuffle完全可以不把数据缓存到磁盘。
- 缓存:虽然目前HDFS也支持缓存,但是一般来说,Spark的缓存功能更加高效,特别是在SparkSQL中,我们可以将数据以列式的形式储存在内存中
1)内存计算引擎,提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的IO开销
3)使用多线程池模型来减少task启动开稍,shuffle过程中避免 不必要的sort操作以及减少磁盘IO操作
2. 易用
1)提供了丰富的API,支持Java,Scala,Python和R四种语言
2)代码量比MapReduce少2~5倍
3. 与Hadoop集成 读写HDFS/Hbase 与YARN集成
3.MapReduce和Spark的Shuffle过程对比
MapReduce | Spark | |
collect | 在内存中构造了一块数据结构用于map输出的缓冲 | 没有在内存中构造一块数据结构用于map输出的缓冲,而是直接把输出写到磁盘文件 |
sort | map输出的数据有排序 | map输出的数据没有排序 |
merge | 对磁盘上的多个spill文件最后进行合并成一个输出文件 | 在map端没有merge过程,在输出时直接是对应一个reduce的数据写到一个文件中,这些文件同时存在并发写,最后不需要合并成一个 |
copy框架 | jetty | netty或者直接socket流 |
对于本节点上的文件 | 仍然是通过网络框架拖取数据 | 不通过网络框架,对于在本节点上的map输出文件,采用本地读取的方式 |
copy过来的数据存放位置 | 先放在内存,内存放不下时写到磁盘 | 一种方式全部放在内存; 另一种方式先放在内存 |
merge sort | 最后会对磁盘文件和内存中的数据进行合并排序 | 对于采用另一种方式时也会有合并排序的过程 |
4.MapReduce Shuffle可优化方向
-
压缩:对数据进行压缩,减少写读数据量;
-
减少不必要的排序:并不是所有类型的Reduce需要的数据都是需要排序的,排序这个nb的过程如果不需要最好还是不要的好;
-
内存化:Shuffle的数据不放在磁盘而是尽量放在内存中,除非逼不得已往磁盘上放;当然了如果有性能和内存相当的第三方存储系统,那放在第三方存储系统上也是很好的;这个是个大招;
-
网络框架:netty的性能据说要占优了;
-
本节点上的数据不走网络框架:对于本节点上的Map输出,Reduce直接去读吧,不需要绕道网络框架。
5.Spark Shuffle可优化方向
Spark作为MapReduce的进阶架构,对于Shuffle过程已经是优化了的,特别是对于那些具有争议的步骤已经做了优化,但是Spark的Shuffle对于我们来说在一些方面还是需要优化的。
-
压缩:对数据进行压缩,减少写读数据量;
-
内存化:Spark历史版本中是有这样设计的:Map写数据先把数据全部写到内存中,写完之后再把数据刷到磁盘上;考虑内存是紧缺资源,后来修改成把数据直接写到磁盘了;对于具有较大内存的集群来讲,还是尽量地往内存上写吧,内存放不下了再放磁盘。
-
6. mapReduce 的具体过程
mapShuffle
数据存到hdfs中是以块进行存储的,每一个块对应一个分片,maptask就是从分片中获取数据的
在某个节点上启动了mapTask,mapTask读取是通过k-v来读取的,读取的数据会放到环形缓存区,这样做的目的是为了防止IO的访问次数,然后环形缓存区的内存达到一定的阀值的
时候会把文件益写到磁盘,溢出的各种小文件会合并成一个大文件,这个合并的过程中会进行排序,这个排序叫做归并排序
map阶段会涉及到
1.sort排序(默认按字典排序)
2.合并(combiner合并)
3.文件合并(merage合并总共有三种,默认是内存到磁盘)
4.压缩(设置压缩就会执行)
reduceShuffle
归并排序完成后reduce端会拉取map端的数据,拉取的这个过程叫做copy过程,拉取的数据合并成一个文件,GroupComparator(默认,这个我们也可以自定义)是专门对文件夹里面的key进行分组
然后就形成k-List(v1,v2,v3)的形式,然后reduce经过业务处理,最终输出到hdfs,如果设置压缩就会执行,不设置则不执行
reduce阶段会涉及到:
1.sort排序
2.分组(将相同的key的value放到一个容器的过程)
3.merage文件合并
4.压缩