Spark:数据帧检查点的效率与显式写入磁盘的效率

时间:2018-08-09 17:25:07

标签: scala apache-spark apache-spark-sql

检查点版本:

val savePath = "/some/path"
spark.sparkContext.setCheckpointDir(savePath)
df.checkpoint()

写入磁盘版本:

df.write.parquet(savePath)
val df = spark.read.parquet(savePath)

我认为两者都以相同的方式打破了血统。

在我的实验中,磁盘上的检查点要比镶木地板大30倍(689GB与24GB)。就运行时间而言,检查点花费的时间是1.5倍(10.5分钟和7.5分钟)。

考虑到所有这些,使用检查点而不是保存到文件的目的是什么?我想念什么吗?

1 个答案:

答案 0 :(得分:3)

检查点是截断RDD谱系图并将其保存到可靠的分布式(HDFS)或本地文件系统的过程。如果您有一个较大的RDD谱系图,并且希望冻结当前RDD的内容,即在继续下一步之前实现完整的RDD,则通常使用persist或checkpoint。然后,经过检查的RDD可以用于其他目的。

检查点时,RDD已序列化并存储在磁盘中。它不会以拼花形式存储,因此数据没有在磁盘中正确优化存储。与拼花地板相反,拼花地板提供各种压缩和编码以存储优化数据。这可以解释大小上的差异。

  • 您绝对应该考虑在嘈杂的群集中建立检查点。如果有大量的作业和用户争夺资源并且没有足够的资源来同时运行所有作业,则群集称为“嘈杂”。

  • 您必须考虑检查点,如果您的计算真的很昂贵并且需要很长时间才能完成,因为将RDD写入其中可能会更快 HDFS并并行读取,而不是从头开始重新计算。

在spark2.1发布之前会有一点不便;  无法检查数据帧,因此必须检查基础RDD。此issue已在spark2.1及更高版本中解决。

以镶木地板保存到磁盘并读回的问题是

  • 在编码中可能会带来不便。您需要保存和阅读多次。
  • 这可能会减慢工作的整体绩效。因为当您另存为实木复合地板并读回时,需要再次重建数据框。

wiki可能对进一步调查很有帮助

如数据集检查点wiki

中所示
  

检查点实际上是Spark Core的一项功能(Spark SQL用于分布式计算),该功能允许驱动程序在发生故障时重新启动,并且以前计算的分布式计算状态称为RDD。该功能已在Spark Streaming中成功使用,Spark Streaming是现已过时的基于RDD API进行流处理的Spark模块。

     

检查点截断要检查点的RDD的沿袭。这已在Spark MLlib中成功用于迭代式机器学习算法(如ALS)中。

     

Spark SQL中的数据集检查点使用检查点来截断要检查的数据集的基础RDD的沿袭。