【问题标题】:Spark output to kafka exactly-onceSpark 输出到 kafka 恰好一次
【发布时间】:2017-01-14 14:00:53
【问题描述】:

我想将 spark 和 spark 流输出到 kafka 一次。但正如医生所说 “输出操作(如 foreachRDD)具有至少一次语义,也就是说,在工作人员失败的情况下,转换后的数据可能会多次写入外部实体。”。
做事务性更新,spark 建议使用批处理时间(在 foreachRDD 中可用)和 RDD 的分区索引来创建标识符。此标识符唯一地标识流应用程序中的 blob 数据。代码如下:

dstream.foreachRDD { (rdd, time) =>
  rdd.foreachPartition { partitionIterator =>
    val partitionId = TaskContext.get.partitionId()
    val **uniqueId** = generateUniqueId(time.milliseconds, partitionId)
    // use this uniqueId to transactionally commit the data in  partitionIterator
  }
}

但是如何在kafka中使用uniqueId进行事务提交。

谢谢

【问题讨论】:

    标签: scala apache-spark apache-kafka


    【解决方案1】:

    Kixer 的高级软件工程师 Cody Koeninger 在 Spark 峰会上讨论了 Kafka 的一次性解决方案。本质上,该解决方案涉及存储偏移量和数据并同时提交。

    在 2016 年的一次 Confluent 聚会上,工程师们在向工程师提及恰好一次的主题时,引用了 Cody 关于该主题的讲座。 Cloudera 在http://blog.cloudera.com/blog/2015/03/exactly-once-spark-streaming-from-apache-kafka/ 上发表了他的演讲。 Cody 的论文位于 http://koeninger.github.io/kafka-exactly-once/#1,他的 github(针对本主题)位于 https://github.com/koeninger/kafka-exactly-once。网上也有他演讲的视频。

    更高版本的 Kafka 引入了 Kafka Streams 来处理没有 Spark 的完全一次场景,但该主题只值得一个脚注,因为问题的框架是使用 Spark。

    【讨论】:

      猜你喜欢
      • 2020-05-12
      • 2020-10-04
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      相关资源
      最近更新 更多