在Spark中对DataFrame进行排序时,在钩子下会发生什么?
例如,
df = spark.read.format('csv').option('foo')
df.sort(i)
我知道当您将数据读取到DataFrame时会发生什么,但是我很好奇您进行排序时会发生什么?与MapReduce相比有什么区别?
答案 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分区并发缓冲区的数量。
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慢
Spark性能更好的原因包括:
总结