Spark 在工作进程中写入文件
Spark write the file inside the worker process
我有一个 Spark 作业正在生成一组带有统计信息的结果。我的工作项目数量超过奴隶数量。所以我对每个奴隶做不止一个处理。
我在生成 RDD
对象后得到 cache
结果,以便能够重用它们,因为我有多个写入操作:一个用于结果对象,另一个用于统计。两个写操作都使用 saveAsHadoopFile
。
在没有缓存的情况下,Spark 会在每次写入操作时重新运行该作业,这会花费很长时间并重做两次相同的执行(如果我有更多写入,则更多)。
使用缓存,我达到了内存限制。一些先前计算的结果在缓存过程中丢失了,我看到了 "CacheManager:58 - Partition rdd_1_0 not found, computing it"
条消息。 Spark 最终会进入无限循环,因为它试图缓存更多结果,同时丢失一些其他结果。
我知道 Spark 有不同的缓存存储级别。使用内存+磁盘可以解决我们的问题。但是我想知道我们是否可以在不生成 RDD
对象的情况下直接在 worker 中写下文件。我不确定这是否可能。是吗?
事实证明,在 Spark 工作进程中写入文件与在 Java 进程中写入文件没有什么不同。写操作只需要创建将文件序列化并保存到 HDFS 的功能。 This question 有几个关于如何做的答案。
saveAsHadoopFile
只是一种方便的方式。
我有一个 Spark 作业正在生成一组带有统计信息的结果。我的工作项目数量超过奴隶数量。所以我对每个奴隶做不止一个处理。
我在生成 RDD
对象后得到 cache
结果,以便能够重用它们,因为我有多个写入操作:一个用于结果对象,另一个用于统计。两个写操作都使用 saveAsHadoopFile
。
在没有缓存的情况下,Spark 会在每次写入操作时重新运行该作业,这会花费很长时间并重做两次相同的执行(如果我有更多写入,则更多)。
使用缓存,我达到了内存限制。一些先前计算的结果在缓存过程中丢失了,我看到了 "CacheManager:58 - Partition rdd_1_0 not found, computing it"
条消息。 Spark 最终会进入无限循环,因为它试图缓存更多结果,同时丢失一些其他结果。
我知道 Spark 有不同的缓存存储级别。使用内存+磁盘可以解决我们的问题。但是我想知道我们是否可以在不生成 RDD
对象的情况下直接在 worker 中写下文件。我不确定这是否可能。是吗?
事实证明,在 Spark 工作进程中写入文件与在 Java 进程中写入文件没有什么不同。写操作只需要创建将文件序列化并保存到 HDFS 的功能。 This question 有几个关于如何做的答案。
saveAsHadoopFile
只是一种方便的方式。