Kafka结构化流媒体检查点

时间:2017-10-06 18:50:42

标签: hadoop pyspark spark-structured-streaming

我正在尝试从Kafka进行结构化流式传输。我打算在HDFS中存储检查点。我读了一篇Cloudera博客,建议不要在HDFS中存储检查点以进行Spark流式传输。是否与结构流检查点相同。 https://blog.cloudera.com/blog/2017/06/offset-management-for-apache-kafka-with-apache-spark-streaming/

在结构化流媒体中,如果我的spark程序停止了一段时间,我如何从检查点目录获取最新的偏移量并在该偏移量之后加载数据。 我将检查点存储在目录中,如下所示。

 df.writeStream\
        .format("text")\
        .option("path", '\files') \
        .option("checkpointLocation", 'checkpoints\chkpt') \
        .start()

更新

这是我的结构化流媒体程序读取Kafka消息,解压缩并写入HDFS。

df = spark \
        .readStream \
        .format("kafka") \
        .option("kafka.bootstrap.servers", KafkaServer) \
        .option("subscribe", KafkaTopics) \
        .option("failOnDataLoss", "false")\
         .load()
Transaction_DF = df.selectExpr("CAST(value AS STRING)")
Transaction_DF.printSchema()

decomp = Transaction_DF.select(zip_extract("value").alias("decompress"))
#zip_extract is a UDF to decompress the stream

query = decomp.writeStream\
    .format("text")\
    .option("path", \Data_directory_inHDFS) \
    .option("checkpointLocation", \pathinDHFS\) \
    .start()

query.awaitTermination()

4 个答案:

答案 0 :(得分:3)

在长期存储(HDFS,AWS S3等)上存储检查点是最优选的。我想在此处添加一点,即属性“failOnDataLoss”不应设置为false,因为它不是最佳实践。数据丢失是任何人都无法承受的。休息你在正确的道路上。

答案 1 :(得分:0)

在您的查询中,尝试应用检查点,同时将结果写入某些持久性存储,如HDFS,如某些格式,如镶木地板。它对我有用。

你可以分享你的代码,以便我们可以进一步了解吗?

答案 2 :(得分:0)

据我所知,人工推荐维护偏移管理:Hbase,Kafka,HDFS或Zookeeper。

  

“值得一提的是,您还可以在存储中存储偏移量   像HDFS这样的系统。在HDFS中存储偏移是一种不太流行的方法   与上述选项相比,HDFS具有更高的延迟   其他系统如ZooKeeper和HBase。“

您可以在Spark文档中找到如何从现有检查点重新启动查询:http://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#recovering-from-failures-with-checkpointing

答案 3 :(得分:0)

  

在结构化流媒体中,如果我的Spark程序在一段时间内关闭,   如何从检查点目录获取最新偏移并加载数据   在该偏移量之后。

在checkpointdir文件夹下,您将找到一个名为“ offsets”的文件夹。文件夹“偏移”会保留下一个要从kafka请求的偏移。打开“偏移量”文件夹下的最新文件(最新批处理文件),下一个预期的偏移量将采用

下方的格式
{"kafkatopicname":{"2":16810618,"1":16810853,"0":91332989}}

要在该偏移量之后加载数据,请在spark读取流中将below属性设置为

 .option("startingOffsets", "{\""+topic+"\":{\"0\":91332989,\"1\":16810853,\"2\":16810618}}")

0,1,2是主题中的分区。