基本概念
application
job
stage
- 每一个spark作业都只有一个application,作业中每一个action操作对应一个job,job中的stage是按照shuffle来区分
- 每个Worker节点中的core会启动一个ExecutorBackend进程,进程中一个Executor会持有一个线程池,线程来执行task任务
- spark中每个stage中会有多个数据分片,每个数据分片扔给task来执行计算
- stage将每一个partition数据fetch过来
MapReduce和Spark中shuffle的区别
Hadoop和spark性能区别主要在shuffle上,spark计算速度更快、更吃内存,但是超大规模数据量Hadoop基于sort-based-shuffle机制的优势就体现出来了。
Hadoop中shuffle
- map阶段,将每个split数据读入内存,partitioner之后为每个partition内排好序
- 内存满了就溢写到磁盘,最后每个map将溢写到磁盘的文件归并(partitioner内有序)
- reduce阶段,每个reduce将所有map中自身partition拉到本地做归并
- map和reduce中间可以增加combiner操作
![](https://img.haomeiwen.com/i5189175/192918e16af5b085.png)
spark中shuffle
- shuffle write阶段,同一个CPU核内的bucket合并
- shuffle read阶段,将所有map中相同bucket拉取并合并
- 整个过程都是无序,相同key的合并依赖于内存hashMap结构合并
![](https://img.haomeiwen.com/i5189175/a54332d1c2c21555.png)
区别
- Hadoop中shuffle过程中数据有序,combiner和reduce的时候归并即可,这样能支持更大量数据。
- spark中shuffle过程数据无序,reduce阶段借助hashMap内存结构实现合并,吃内存
- 内存不够,也会spill到硬盘做排序
分片概念
Hadoop和spark都是分布式计算框架,那么计算数据的单位是什么呢?
- 计算是按照分片为单位的。MapReduce中一个分片对应一个map进程
- input中文件比较大,会分成多片,默认是128M;如果文件小于128M,则一个文件就一个分片;一个文件单独起一个线程来执行,如果输入数据中小文件太多会影响性能
- 小文件多,Hadoop中通过combineFile操作解决
相关参数
spark执行一些重要参数
executor-num:参与计算的节点数
executor-core:每个节点的CPU核数
executor-mem:每个计算节点的内存
spark.default.parallelism:并行度参数,shuffle过程才会起作用
出现OOM现象,可以考虑将executor-mem调大、executor-core调小,并行度设置为executor-core总数的2~3倍
网友评论