Spark 流中的容错

Fault tolerance in Spark streaming

我想在这里解释一下容错。假设我在 hdfs 中有 1 到 10 个文件,并且 spark streaming 已经读取了这个文件。不幸的是,现在我的火花流已经停止了。我在 hdfs 中有文件说 1 到 20,其中 1 到 10 个文件已经被 spark streaming 解析,11 到 20 个是新添加的。现在我开始 spark streaming,我可以看到文件 1-30。由于我在 hdfs 中的第 21 个文件时启动 spark,我的 spark styreaming 将丢失文件 11-20。我如何找回丢失的文件。 我使用文件流。

Spark streaming 中fileStream 的行为是监视一个文件夹并从中获取新文件。因此它只会在进程开始后拾取新文件。为了处理 11-20 的文件,您可能需要在处理开始后重命名它们。

处理这种情况的更好方法是使用像 Kafka 这样的消息队列,您可以在其中从任何您喜欢的点继续处理流: https://blog.cloudera.com/blog/2017/06/offset-management-for-apache-kafka-with-apache-spark-streaming/

Spark Streaming 还为 checkpointing 提供选项。 如果启用,该过程将在每个批次开始之前保存检查点(在指定文件夹中)。然后,如果spark streaming进程由于某种原因崩溃了,可以从上一个checkpoint开始。

def createContext(folderName):
    sc = SparkContext(appName='SparkApplication')
    ssc = StreamingContext(sc, 2)  # 2 second window

    ## Your stream configuration here

    ssc.checkpoint(folderName)
    return ssc


ssc = StreamingContext.getOrCreate('/path/to/checkpoint/directory', 
                                   lambda: createContext('/path/to/dir') )
ssc.start()
ssc.awaitTermination()