Pyspark Kafka Direct Stream的容错功能不起作用。检查点目录不存在

Pyspark Kafka Direct Stream的容错功能不起作用。检查点目录不存在,pyspark,apache-kafka,fault-tolerance,checkpoint,spark-streaming-kafka,Pyspark,Apache Kafka,Fault Tolerance,Checkpoint,Spark Streaming Kafka,我为卡夫卡主题中的读取数据编写应用程序。而且我无法在驾驶员出现故障的情况下实现容错。应用程序使用spark submit在k8s集群中运行。当我第一次运行应用程序时,一切都很顺利,但是当我从集群中删除pod时,重新启动应用程序会导致错误检查点目录不存在:文件:/opt/spark/../rdd-541。我使用容错存储。下面是一段代码和一个更详细的错误。谢谢你的帮助。如果没有什么细节,请告诉我 def functionToCreateContext(): sc = SparkContext

我为卡夫卡主题中的读取数据编写应用程序。而且我无法在驾驶员出现故障的情况下实现容错。应用程序使用spark submit在k8s集群中运行。当我第一次运行应用程序时,一切都很顺利,但是当我从集群中删除pod时,重新启动应用程序会导致错误<代码>检查点目录不存在:文件:/opt/spark/../rdd-541。我使用容错存储。下面是一段代码和一个更详细的错误。谢谢你的帮助。如果没有什么细节,请告诉我

def functionToCreateContext():
    sc = SparkContext("spark-master", "kafka_spark")
    sc.setLogLevel('ERROR')
    ssc = StreamingContext(sc, 20)
    kafkaParams = {'bootstrap.servers': 'kafka.cluster'}
    kafkaStream = KafkaUtils.createDirectStream(ssc, ['topic'], kafkaParams)
    statistic_window = kafkaStream.transform(parse_reduce).reduceByKeyAndWindow(lambda x, y: x + y, 
                     lambda x, y: x - y,60, 20)
    top = statistic_window.transform(found)
    top.pprint()
    ssc.checkpoint(cpd)
    return ssc

if __name__ == "__main__":
    ssc = StreamingContext.getOrCreate(cpd, functionToCreateContext)
    ssc.start()
    ssc.awaitTermination()
回溯:

20/03/10 14:05:19 INFO SparkContext: Created broadcast 1 from checkpointFile at DStreamCheckpointData.scala:114
Traceback (most recent call last):
  File "/app-spark/kafka_spark.py", line 75, in <module>
    ssc = StreamingContext.getOrCreate(cpd, functionToCreateContext)
  File "/opt/spark/python/lib/pyspark.zip/pyspark/streaming/context.py", line 105, in getOrCreate
  File "/opt/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/opt/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o2.tryRecoverFromCheckpoint.
: java.lang.IllegalArgumentException: requirement failed: Checkpoint directory does not exist: file:/opt/spark/.../rdd-541
        at scala.Predef$.require(Predef.scala:224)
20/03/10 14:05:19信息SparkContext:从DStream CheckpointData的checkpointFile创建广播1。scala:114
回溯(最近一次呼叫最后一次):
文件“/app spark/kafka_spark.py”,第75行,在
ssc=StreamingContext.getOrCreate(cpd,functionToCreateContext)
文件“/opt/spark/python/lib/pyspark.zip/pyspark/streaming/context.py”,第105行,在getOrCreate中
文件“/opt/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,第1257行,in_u调用__
文件“/opt/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py”,第328行,在get_return_值中
py4j.protocol.Py4JJavaError:调用o2.tryRecoverFromCheckpoint时出错。
:java.lang.IllegalArgumentException:要求失败:检查点目录不存在:文件:/opt/spark/../rdd-541
在scala.Predef$.require处(Predef.scala:224)

我猜您会遇到此错误,因为您的检查点目录不是持久卷。因此,当您删除pod时,指定的目录也会被删除,并且您得到的是
检查点目录不存在
错误

解决方案是使用检查点目录


您也可以在完全相同的主题中找到一个示例。

谢谢,我忘了添加,pod中的文件夹存在,但名称不同。例如/opt/spark/../rdd-205。流媒体上下文希望在删除pod后开始使用/opt/spark/../rdd-183。文件夹/opt/spark/../rdd-183以前存在并已消失。