RDD.checkpoint()不在检查点目录中存储任何数据

时间:2016-06-12 17:49:55

标签: apache-spark pyspark

我已使用sc.setCheckpointDir方法设置了检查点目录。

/checkpointDirectory/

然后我创建了一个rdd:rdd.checkpoint()的检查点,在目录中,我现在看到一个代表新检查点的新目录,以随机字符串的形式出现。在该目录中没有任何内容。

/checkpointDirectory/37d2812a-bca2-4fc5-b5d4-221ae03a6d25/  [empty]

然后在做了几次转换后,我再次运行rdd.checkpoint(),最近创建的目录中仍然没有任何内容

/checkpointDirectory/37d2812a-bca2-4fc5-b5d4-221ae03a6d25/  [empty]

我使用checkpoint()错了吗?我应该在该目录中看到什么才能知道它的正常工作?

2 个答案:

答案 0 :(得分:5)

checkpoint,与Spark中的许多其他操作一样,是懒惰的。当且仅当给定的RDD具体化时,才对数据进行实际检查。您看到的空目录是特定于应用程序的检查点目录。

如果要进行检查点,则必须触发一个将评估相应RDD的操作。例如(本地模式):

import glob
import os
from urllib.parse import urlparse

sc.setCheckpointDir("/tmp/checkpoints/")
ch_dir = os.path.join(urlparse(sc._jsc.getCheckpointDir().orElse("")).path, "*")

rdd = sc.range(1000, 10)
plus_one = rdd.map(lambda x: x + 1)
plus_one.cache()
plus_one.checkpoint()  # No checkpoint dir here yet

[os.path.split(x)[-1] for x in glob.glob(ch_dir)]
## []
plus_one.isCheckpointed()
## False

# After count is executed you'll see rdd specific checkpoint dir
plus_one.count()  
[os.path.split(x)[-1] for x in glob.glob(ch_dir)]
## ['rdd-1']
plus_one.isCheckpointed()
## True

您还可以在以下之前分析调试字符串:

## (8) PythonRDD[1] at RDD at PythonRDD.scala:48 [Memory Serialized 1x Replicated]
##  |  ParallelCollectionRDD[0] at parallelize at PythonRDD.scala:475 [Memory Serialized 1x Replicated]

并采取行动后:

## (8) PythonRDD[1] at RDD at PythonRDD.scala:48 [Memory Serialized 1x Replicated]
##  |       CachedPartitions: 8; MemorySize: 168.0 B; ExternalBlockStoreSize: 0.0 B; DiskSize: 0.0 B
##  |  ReliableCheckpointRDD[3] at count at <ipython-input-16-96e746c56973>:1 [Memory Serialized 1x Replicated]

正如您所见,RDD将从头开始计算,但在count之后,您将获得ReliableCheckpointRDD

答案 1 :(得分:-1)

将定期进行检查点(即检查点持续时间)。您需要告诉检查点持续时间到您的spark上下文。