Spark官方文档-Spark编程指南(第五节)

Spark官方文档-Spark编程指南(第五节)

Transformations

下面的表格列举了Spark支持的一些常见transformations。细节请参考RDD API文档(Scala, Java, Python, R)和pair RDD functions文档(Scala, Java)。

表格请查看原文:Transformations

Actions

下面的表格列举了Spark支持的一些常见actions。细节请参考RDD API文档(Scala, Java, Python, R)和pair RDD functions文档(Scala, Java)。

表格请查看原文:Actions

Spark RDD API还暴露了一些actions的异步版本,例如对应于foreach的foreachAsync,异步actions会马上给调用者返回一个FutureAction,而不是阻塞等待action完成。这可以用于管理或者等待action的异步执行。

Shuffle操作

Spark内部的某些特定操作会触发一个叫做shuffle的事件。Shuffle是Spark为了重新分配数据的机制,所以它在不同partitions上会进行不同的分组。这包含了在executors和机器之间的数据拷贝,使得shuffle成为一个复杂且高成本的操作。

背景

为了理解在shuffle期间发生了什么,我们可以考虑reduceByKey操作这个例子。reduceByKey操作会生成一个新的RDD,会将某个key的所有values合并到一个tuple中-key和对所有与该key相关的values执行一个reduce函数的结果。问题是对于某个key所有的values不一定都属于同一个partition,甚至不属于同一个机器,但是它们又必须同地协作来计算结果。

在Spark中,对于一个特定的操作,为了让数据处于必要的位置,通常不能将数据分布在不同的partitions。在计算期间,单个任务将会操作一个单独的partition-因此,为了能为单个reduceByKey这个reduce任务组织所有数据,Spark需要执行一个all-to-all操作。它必须从所有partitions找到对于所有keys的所有values,然后将不同partitions上的values放到一起,来为各个key计算最终的结果-这就叫做shuffle。

尽管重新shuffled的数据的各个partition上的元素集合是确定的,partitions本身的顺序也是确定的,但是这些元素的顺序是不确定的。如果想要在shuffle时获得可预测顺序的数据,可以使用:

  • mapPartitions来排序各个partition,例如使用.sorted
  • repartitionAndSortWithinPartitions来高效地排序partitions,并同时进行repartition操作
  • sortBy来得到一个全局有序的RDD

可以引起shuffle的操作包括repartition操作,例如repartitioncoalesce,ByKey类操作(除了counting),例如groupByKeyreduceByKey,以及join操作,例如cogroupjoin

性能影响

由于Shuffle包括了磁盘I/O,数据序列化以及网络I/O,因此它是一种开销很高的操作。为了给shuffle组织数据,Spark会生成map任务集合来组织数据,以及reduce任务集合来聚合数据。这些术语来自于MapReduce,并且与Spark的map和reduce操作没有直接关系。

来自单个map任务的结果会一直保存在内存中,直到它们存不下为止。然后,就会基于目标partition将它们排序,并写入单个文件中。在reduce这边,任务会读取相关的有序的blocks。

特定的shuffle操作会消耗大量堆存储空间,这是因为这些操作在转移数据前后,会采用内存数据结构来组织它们。ByKey类的操作会在reduce这边生成这些结构,特殊地,reduceByKey和aggregateByKey会在map这边创建这些结构。当数据在内存中存不下时,Spark就会将这些表格写入磁盘,这会造成额外的磁盘I/O和垃圾回收开销。

Shuffle还会在磁盘上产生很多中间文件。在Spark 1.3中,这些文件会一直保留到对应的RDDs不再使用并被垃圾回收。这样的话如果lineage被重新计算,那么shuffle文件就不需要被重新创建了。如果应用程序保持对这些RDDs的引用或者垃圾回收的频率不高,那么垃圾回收可能会在很长一段时间之后才执行。这意味着长时间运行的Spark jobs可能会消耗大量磁盘空间。临时存储目录是当配置Spark环境时,通过配置参数spark.local.dir指定的,

Shuffle的行为可以通过一系列配置参数来调整。请在Spark配置指南中阅读“Shuffle行为”章节。

上一篇:Spark官方文档-Spark编程指南(第四节)

下一篇:Spark官方文档-Spark编程指南(第六节)

参考资料

本文译自Spark Programming Guide

发表评论

电子邮件地址不会被公开。 必填项已用*标注