我使用Spark来使用Kafka的数据。在消耗了一些数据后重新启动Spark时,如何确保Spark将从它停止的偏移开始消耗?
例如,如果第一次运行时,Spark消耗了直到偏移标识x
。如何确保在下次运行时它将以偏移标识x+1
开始?
SparkConf sparkConf = new SparkConf().setAppName("name");
JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(2000));
Map<String,String> kafkaParams = new HashMap<>();
kafkaParams.put("zookeeper.connect", "127.0.0.1");
kafkaParams.put("group.id", App.GROUP);
JavaPairReceiverInputDStream<String, EventLog> messages =
KafkaUtils.createStream(jssc, String.class, EventLog.class, StringDecoder.class, EventLogDecoder.class,
kafkaParams, topicMap, StorageLevel.MEMORY_AND_DISK_SER_2());
答案 0 :(得分:1)
在基于接收器的方法中(您通过KafkaUtils.createStream
使用),偏移量由WAL (Write Ahead Log)保存和处理,Direct (receiverless) API streaming approach负责从适当的偏移量恢复您的应用程序。如果您希望能够准确控制从中恢复申请的位置,请查看KafkaUtils.createDStream
以及{{3}}并重载fromOffsets: Map[TopicAndPartition, Long]
。