在Spark中对DataFrame进行排序时,在钩子下会发生什么?

时间:2018-08-13 23:07:31

标签: apache-spark

在Spark中对DataFrame进行排序时,在钩子下会发生什么?

例如,

df = spark.read.format('csv').option('foo')
df.sort(i)

我知道当您将数据读取到DataFrame时会发生什么,但是我很好奇您进行排序时会发生什么?与MapReduce相比有什么区别?

1 个答案:

答案 0 :(得分:3)

Spark和MapReduce都是数据处理框架。实际上,它们之间的主要区别在于处理方式:Spark可以在内存中完成,而Hadoop MapReduce必须从磁盘读取和写入磁盘。结果,处理速度明显不同– Spark可能快100倍。但是,处理的数据量也有所不同:Hadoop MapReduce能够处理比Spark大得多的数据集。

  • 采样阶段 MapReduce的采样阶段由轻量级的中央程序执行,并且非常快 而磁盘使用率很高,而火花的CPU使用率很低

  • 地图阶段 在映射阶段,Spark和MapReduce都受CPU限制。即使Spark和MapReduce使用不同的shuffle框架,它们的地图阶段也受到地图输出压缩的限制。此外,对于Spark,我们观察到,与采样阶段相比,在磁盘映射阶段磁盘I / O明显减少,尽管其磁盘映射阶段也扫描了整个输入文件。磁盘I / O减少是由于在采样阶段读取了OS缓冲区中缓存的输入文件块的结果。

  • 减少阶段 Spark和MapReduce中的reduce阶段都使用外部排序来对混洗后的地图输出进行总排序。在此阶段,MapReduce比Spark快2.8倍。加快速度的主要原因是,混洗阶段与映射阶段重叠,从而掩盖了网络开销。

随机播放组件的比较(Spark与MapReduce)

  • Spark在早期版本的Apache Spark 1.1中使用基于哈希的混洗(Spark-Hash),这要求保持内存中reduce分区并发缓冲区的数量。

  • 在Apache Spark 1.1及更高版本中基于
  • sort-based shuffle(Spark-Sort)和MapReduce。 在基于排序的随机播放中,在任何给定的点上都只需要一个缓冲区。这样可以大大减少洗牌期间的内存开销,并且可以在单个阶段支持数十万个任务的工作负载(我们的PB排序使用250,000个任务)。

  • MapReduce接收来自“ Map Function”的输出列表,并执行这两个子操作, 对每个键值对进行操作。

    合并步骤将具有相同键的所有键值对组合在一起(即,将键组 通过比较“键”来获得值对)。此步骤返回>。 排序步骤从“合并”步骤获取输入,并使用“键”对所有键值对进行排序。 此步骤还返回>输出,但具有排序的键值对。

首先,对于Spark-Hash和Spark-Sort,映射阶段的执行时间随着我们减少任务数量的增加而增加。这是因为处理打开的文件和磁盘写入的提交操作增加了开销。

与Spark相比,reduce任务的数量对MapReduce映射阶段的执行时间影响很小。 reduce任务的数量不会影响Spark的reduce阶段的执行时间。

但是, 对于MapReduce,由于使用更多的减少任务,减少阶段的执行时间会增加,因为随着减少任务数量的增加,与地图阶段并行复制的地图输出会更少。 对于MapReduce和Spark,当缓冲区大小增加时,减少的磁盘溢出量不会导致执行时间的减少,因为磁盘I / O并非瓶颈。但是,由于GC开销的增加以及OS缓冲区高速缓存中的页面交换,缓冲区大小的增加可能会导致Spark的运行速度变慢。

MapReduce在以下两个阶段中比Spark慢

  • 首先,MapReduce中的加载时间比Spark中的加载时间慢得多。
  • 第二,(1)读取输入(读取)和(2)在输入(Map)上应用映射功能的总次数大于Spark。

Spark性能更好的原因包括

  1. Spark会从OS缓冲区高速缓存中读取部分输入,因为其采样阶段会扫描整个输入文件。另一方面,MapReduce在采样期间仅部分读取输入文件,因此OS缓冲区缓存在映射阶段不是很有效。
  2. MapReduce在将地图输出刷新到磁盘之前将地图输出收集到地图侧缓冲区中,但是Spark的基于哈希的随机写入器将每个地图输出记录直接写入磁盘中,从而减少了延迟。

总结

  1. 在MapReduce中,reduce阶段比Spark快,因为MapReduce可以与 shuffle阶段和map阶段,有效地隐藏了网络开销。
  2. 在Spark中,map阶段的执行时间随着reduce任务数量的增加而增加 增加。此开销是由打开的文件数引起的,并且与打开的文件数成比例 同时。
  3. 对于MapReduce和Spark,在洗牌阶段减少磁盘溢出 由于磁盘I / O并非瓶颈,因此可能不会加快速度。但是,对于Spark, 缓冲区增加可能会导致速度变慢,因为GC和OS的开销增加了 页面交换。