【问题标题】:SparkStreaming/Kafka Offset handlingSpark Streaming/Kafka 偏移处理
【发布时间】:2017-02-06 21:59:21
【问题描述】:

我正在尝试集成 Spark/Kafka 以构建流式应用程序。 卡发版本:0.9 火花:1.6.2

在 RDD 批处理中处理数据后如何处理偏移量。

你能告诉我更多关于处理偏移的见解吗?

spark 是否内置了自动存储和读取偏移量的功能?还是我需要引导 spark 从 mongo 或 oracle 等商店读取偏移量?

JavaInputDStream<String> directKafkaStream = KafkaUtils.createDirectStream(jsc, String.class, String.class,
                StringDecoder.class, StringDecoder.class, String.class, kafkaParams, topicMap,
                (Function<MessageAndMetadata<String, String>, String>) MessageAndMetadata::message);

        directKafkaStream.foreachRDD(rdd -> {

【问题讨论】:

    标签: java apache-spark apache-kafka spark-streaming


    【解决方案1】:

    您的问题的答案取决于您想要的消息传递语义:

    • 最多一次:每条消息最多处理一次
    • 至少一次:每条消息最多处理一次
    • 恰好一次:最多一次且同时至少一次

    首先,我建议阅读those slidesthis blog post

    我假设您正在追求 exactly-once,因为其余的很容易弄清楚。无论如何,有几种方法可以考虑:

    检查点

    Spark Streaming 允许您检查您的DStreams。如果您使用来自KafkaUtils 的直接流,则偏移量也将被检查点。流作业可能会在检查点之间的任何地方失败,因此可能会重播某些消息。要使用这种方法实现恰好一次语义,必须使用幂等输出操作(换句话说 - 下游系统能够区分/忽略重播消息)。

    优点:容易实现;开箱即用

    缺点至少一次语义;代码更改后检查点失效;偏移量存储在 Spark 中,而不是 Zookeeper 中

    事务性数据存储

    您可能希望自己将偏移量存储在支持事务的自定义数据存储中,即 MySQL 等关系数据库。在这种情况下,您需要确保处理流和保存偏移量包含在单个事务中。

    优点恰好一次语义

    缺点:难以设置,需要事务性数据存储

    基于 WAL 的接收器

    您可以使用基于 WAL 的旧版 Kafka 连接器。

    优点:也适用于其他数据源;在 Zookeeper 中存储偏移量 缺点:依赖于 HDFS;您不能直接访问偏移量;它使并行​​性更难实现

    总而言之,这完全取决于您的要求——也许您可以解除一些限制来简化这个问题。

    【讨论】:

      【解决方案2】:

      当您想使用 Spark Streaming 使用来自 Kafka 主题的数据时,有两种方法可以做到这一点。

      1.基于接收者的方法 在这种方法中,偏移量在 Zookeeper 中进行管理,它会自动更新 Zookeeper 中的偏移量。了解更多信息。 http://spark.apache.org/docs/latest/streaming-kafka-integration.html#approach-1-receiver-based-approach

      2。直接接近(无接收器) 这种方法是它不会更新 Zookeeper 中的偏移量,因此基于 Zookeeper 的 Kafka 监控工具不会显示进度。但是,您可以在每个批次中访问此方法处理的偏移量并自行更新 Zookeeper。

      http://spark.apache.org/docs/latest/streaming-kafka-integration.html#approach-2-direct-approach-no-receivers

      【讨论】:

      • 这个答案非常广泛,而且不仅仅是 spark 文档的副本!
      猜你喜欢
      • 2021-05-22
      • 2018-09-22
      • 2020-09-03
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 2018-04-12
      • 2020-01-18
      相关资源
      最近更新 更多