nag*_*dra 7 mapreduce apache-spark rdd
我正在努力深刻理解火花洗牌过程.当我开始阅读时,我遇到了以下几点.
Spark在完成时将Map任务(ShuffleMapTask)输出直接写入磁盘.
我想了解Hadoop MapReduce的以下内容.
如果Map-Reduce和Spark都将数据写入本地磁盘,那么spark shuffle进程与Hadoop MapReduce有何不同?
由于数据在Spark中表示为RDD,为什么这些输出不会保留在节点执行程序内存中?
Hadoop MapReduce和Spark的Map任务输出有何不同?
如果有很多小的中间文件作为输出,火花如何处理网络和I/O瓶颈?
zer*_*323 12
首先,Spark不能以严格的map-reduce方式工作,map
除非有必要,否则输出不会写入磁盘.磁盘写入shuffle文件.
这并不意味着shuffle之后的数据不会保留在内存中.Spark中的随机文件主要是为了避免在多个下游操作的情况下重新计算.为什么要写入文件系统?至少有两个交错的原因:
除了正在进行的低级优化工作和实施细节之外,洗牌本身并没有什么不同.它基于相同的基本方法及其所有限制.
Hadoo地图的任务有何不同?Justin Pihony很好地说明了不需要改组的多个转换在一个任务中被压缩在一起.由于这些操作在标准的Scala迭代器上,因此可以对各个元素进行操作.
关于网络和I/O瓶颈,这里没有灵丹妙药.虽然Spark可以减少写入磁盘或通过组合转换,内存缓存和提供转换感知工作者首选项而混洗的数据量,但它受到与任何其他分布式框架相同的限制.
如果Map-Reduce和Spark都将数据写入本地磁盘,那么Spark Shuffle进程与Hadoop MapReduce有何不同?
当您执行Spark应用程序时,第一件事就是启动第SparkContext
一个,它成为多个互连服务的所在地DAGScheduler
,TaskScheduler
并且SchedulerBackend
是最重要的服务之一。
DAGScheduler
是主要的协调器,负责将RDD谱系图(即RDD的有向无环图)转换为阶段。在执行此操作时,DAGScheduler
遍历最终RDD的父依赖关系,并创建一个ResultStage
with parent ShuffleMapStages
。
A ResultStage
(主要是)ShuffleMapStages
成为其父母的最后阶段。我说主要是因为我想我可能已经看到您可以“安排”某人了ShuffleMapStage
。
这是Spark应用于您的Spark作业(一起创建一个Spark应用程序)的最早期和第一个优化- 执行流水线,其中将多个转换连接在一起以创建一个阶段(因为它们之间的相互关系很窄)。这就是为什么Spark可以比Hadoop MapReduce更快的原因,因为两个或多个转换可以一个接一个地执行,而没有可能在内存中进行任何数据转换。
直到命中为止,一个阶段是一样宽的ShuffleDependency
(又称广泛依赖)。
有RDD转换会导致改组(由于创建ShuffleDependency
)。那时候Spark非常类似于Hadoop的MapReduce,因为它将将部分洗牌输出保存到执行器上的本地磁盘上。
当Spark应用程序启动时,它会从集群管理器中请求执行者(支持三种:Spark Standalone,Apache Mesos和Hadoop YARN)。这就是SchedulerBackend
为了管理Spark应用程序和群集资源之间的通信。
(假设您未使用外部随机播放管理器)
执行器托管自己的local BlockManager
,它们负责管理保存在本地硬盘驱动器上的RDD块(可能在内存中也可以复制)。您可以使用cache
和persist
运算符以及StorageLevel来控制RDD块的持久性。您可以使用Web UI中的Storage
和Executors
标签来跟踪块的位置和大小。
Spark在本地(在执行程序上)存储数据和Hadoop MapReduce之间的区别是:
部分结果(计算后ShuffleMapStages
)保存在本地硬盘驱动器上,而不是HDFS上,HDFS是一种分布式文件系统,保存成本非常高。
只有一些文件被保存到本地硬盘驱动器中(在流水线化操作之后),而在将所有地图保存到HDFS的Hadoop MapReduce中则不会发生。
让我回答以下问题:
如果有很多小的中间文件作为输出,那么spark如何处理网络和I / O瓶颈?
这是Spark执行计划中最棘手的部分,并且在很大程度上取决于改组的范围。如果仅使用本地数据(在一台计算机上有多个执行程序),则由于数据已经存在,因此将看不到数据流量。
如果需要数据改组,执行程序将在彼此之间发送数据,这将增加流量。
只是为了详细说明Spark应用程序中节点之间的流量。
广播变量是从驱动程序向执行程序发送数据的方法。
累加器是将数据从执行程序发送到驱动程序的方法。
像collect这样的操作员会将所有远程块从执行程序拉到驱动程序。
归档时间: |
|
查看次数: |
2133 次 |
最近记录: |