这是我的示例代码:
val file = sc.textFile(fileapath).persist(StorageLevel.MEMORY_AND_DISK_2)
我正在运行一系列任务,例如从hdfs读取文件并计算其记录,然后再做一些预处理器,如binning或join或groupby,然后查找结果计数,然后将文件保存到hdfs。
我注意到有一点,即在使用预处理器连接运行它时,由于数据持续存在,它有时会卡住。
如果我删除此持久性,它将运行。现在我对数据的持久性存有疑虑。为什么坚持只对某些任务有效。
请帮我弄清楚我的怀疑
答案 0 :(得分:4)
您的问题中缺少许多重要数据:
根据您提供的数据:
有可能删除" _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