2016-09-28 49 views
1

我正在尝试整合Spark/Kafka来构建流媒体应用程序。 Kakfa版本:0.9 spark:1.6.2SparkStreaming/Kafka胶印处理

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

你能否给我更多关于处理偏移量的见解?

火花内置了自动存储和读取偏移吗?还是我需要引导火花来读取某些商店(如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 -> { 

回答

2

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

  • 最多一次:每个消息都会被处理最多一次
  • 至少一次:每个消息最多只能处理一次
  • 恰好一次:最多一次,至少一次在同一时间e

首先,我会推荐阅读those slides以及this blog post

我假设你正在追求,一次,因为其余的很容易弄清楚。总之,一对夫妇的方法来考虑:

检查点

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

优点:易于实现;来自开箱即用

缺点至少一次语义;代码更改后检查点变为无效;偏移量存储在星火,而不是在动物园管理员

事务性数据存储

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

优点恰好一次语义

缺点:难以建立,需要一个事务性数据存储

基于WAL-接收机

您可以使用旧的卡夫卡连接器基于WAL。

优点:与其他数据源一起工作;在Zookeeper中存储偏移量 缺点:它依赖于HDFS;你不能直接访问偏移量;它使得并行性难以实现。总之,这一切都取决于你的要求 - 也许你可以取消一些限制来简化这个问题。

-2

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

1.Receiver基础的方法 在这种方法中,偏移在动物园管理员管理,它在动物园管理员自动更新偏移。了解更多信息。 http://spark.apache.org/docs/latest/streaming-kafka-integration.html#approach-1-receiver-based-approach

2.直接法(不接收) 这种方法的缺点是它不能在动物园管理员更新偏移,因此基于动物园管理员,卡夫卡的监视工具不会显示进度。但是,您可以在每个批次中访问由此方法处理的偏移量,并自己更新Zookeeper。

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

+0

这个答案是非常广泛的,更超过它只是火花文档的副本! – avr