为什么持久化数据需要花时间在Scala中执行一系列任务

时间:2017-01-05 11:29:18

标签: scala apache-spark

这是我的示例代码:

val file = sc.textFile(fileapath).persist(StorageLevel.MEMORY_AND_DISK_2)

我正在运行一系列任务,例如从hdfs读取文件并计算其记录,然后再做一些预处理器,如binning或join或groupby,然后查找结果计数,然后将文件保存到hdfs。

我注意到有一点,即在使用预处理器连接运行它时,由于数据持续存在,它有时会卡住。

如果我删除此持久性,它将运行。现在我对数据的持久性存有疑虑。为什么坚持只对某些任务有效。

请帮我弄清楚我的怀疑

1 个答案:

答案 0 :(得分:4)

您的问题中缺少许多重要数据:

  • 输入数据的大小是多少?
  • 执行者的RAM大小是多少?
  • 为什么选择StorageLevel.MEMORY_AND_DISK?为什么MEMORY_AND_DISK _2
  • 您执行转换/操作时使用的实际代码是什么?

根据您提供的数据:

有可能删除" _2"会有所帮助:

MEMORY_ONLY_2,MEMORY_AND_DISK_2等,但复制两个群集节点上的每个分区。 - 你需要复制数据吗?

val file = sc.textFile(fileapath).persist(StorageLevel.MEMORY_AND_DISK)

使用MEMORY_ONLY可能会有所帮助:

val file = sc.textFile(fileapath).persist(StorageLevel.MEMORY_ONLY)

使用MEMORY_ONLY_SER可能会更好:

val file = sc.textFile(fileapath).persist(StorageLevel.MEMORY_ONLY)

MEMORY_ONLY_SER - 将RDD存储为序列化Java对象(每个分区一个字节数组)。这通常比反序列化对象更强<<>>节省空间,尤其是在使用快速序列化器时,但读取CPU密集程度更高。

可在此处找到更多信息:http://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence