博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spark textFile 困惑与解释
阅读量:2396 次
发布时间:2019-05-10

本文共 1266 字,大约阅读时间需要 4 分钟。

在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性能高低直接影响了整个程序的性能和吞吐量。Spark作为MapReduce框架的一种实现,自然也实现了shuffle的逻辑。

Shuffle

Shuffle是MapReduce框架中的一个特定的phase,介于Map phase和Reduce phase之间,当Map的输出结果要被Reduce使用时,输出结果需要按key哈希,并且分发到每一个Reducer上去,这个过程就是shuffle。由于shuffle涉及到了磁盘的读写和网络的传输,因此shuffle性能的高低直接影响到了整个程序的运行效率。

下面这幅图清晰地描述了MapReduce算法的整个流程,其中shuffle phase是介于Map phase和Reduce phase之间

mapreduce running process

概念上shuffle就是一个沟通数据连接的桥梁,那么实际上shuffle(partition)这一部分是如何实现的的呢,下面我们就以Spark为例讲一下shuffle在Spark中的实现。

Spark Shuffle进化史

先以图为例简单描述一下Spark中shuffle的整一个流程:

spark shuffle process

  • 首先每一个Mapper会根据Reducer的数量创建出相应的bucket,bucket的数量是M×RM×R,其中MM是Map的个数,RR是Reduce的个数
  • 其次Mapper产生的结果会根据设置的partition算法填充到每个bucket中去。这里的partition算法是可以自定义的,当然默认的算法是根据key哈希到不同的bucket中去。
  • 当Reducer启动时,它会根据自己task的id和所依赖的Mapper的id从远端或是本地的block manager中取得相应的bucket作为Reducer的输入进行处理。

这里的bucket是一个抽象概念,在实现中每个bucket可以对应一个文件,可以对应文件的一部分或是其他等。

Apache Spark 的 Shuffle 过程与 Apache Hadoop 的 Shuffle 过程有着诸多类似,一些概念可直接套用,例如,Shuffle 过程中,提供数据的一端,被称作 Map 端,Map 端每个生成数据的任务称为 Mapper,对应的,接收数据的一端,被称作 Reduce 端,Reduce 端每个拉取数据的任务称为 Reducer,Shuffle 过程本质上都是将 Map 端获得的数据使用分区器进行划分,并将数据发送给对应的 Reducer 的过程

 

参考:

http://jerryshao.me/architecture/2014/01/04/spark-shuffle-detail-investigation/

https://ihainan.gitbooks.io/spark-source-code/content/section3/index.html

转载地址:http://zjfob.baihongyu.com/

你可能感兴趣的文章
Listener--ServletContextListener接口的使用详解
查看>>
Listener--HttpSessionListener、ServletRequestListener接口的使用详解
查看>>
Listener--HttpSessionBindingListenerAPI及使用(在线人数统计)详解
查看>>
Struts2--非表单标签
查看>>
MyBatis--工作原理
查看>>
Maven--插件的获取和配置
查看>>
MySQL--基础四(排序查询)
查看>>
MySQL--基础五(单行函数)
查看>>
MySQL--基础六(分组函数)
查看>>
MySQL--基础七(分组查询、排序查询)
查看>>
MySQL--基础八(连接查询)
查看>>
MySQL--基础九(sql99连接查询)
查看>>
MySQL--基础十(子查询)
查看>>
Git--Eclipse操作、忽略文件、推送到远程库
查看>>
Oracle--同义词详解
查看>>
Oracle--存储过程概述、创建和执行
查看>>
Oracle--带参数的存储过程(IN、OUT和IN OUT)
查看>>
Oracle--触发器详解(分类、作用、执行顺序和语法)
查看>>
Oracle--DML触发器
查看>>
Oracle--替代触发器(INSTEAD OF)
查看>>