Spark Streaming地图处理相同的消息多次

时间:2017-08-03 21:41:05

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

我的数据流是:

FTP - > NiFi - >卡夫卡 - > Spark Streaming - >卡夫卡

NiFi - > Kafka 主题有3个分区,我使用3个执行程序。 Spark Streaming作业使用直接API从Kafka读取数据。工作流程是:

JavaInputDStream<ConsumerRecord<String, byte[]>> consumerStream = KafkaUtils.createDirectStream(javaStreamingContext, LocationStrategies.PreferConsistent(),
            ConsumerStrategies.<String, byte[]>Subscribe(CONSUME_TOPICS,
                    kafkaConsumeParams));

JavaDStream<KeyValue<String, byte[]>> messagesStream = consumerStream
            .map(new Function<ConsumerRecord<String, byte[]>, KeyValue<String, byte[]>>() {

        private static final long serialVersionUID = 1L;

        @Override
        public KeyValue<String, byte[]> call(ConsumerRecord<String, byte[]> kafkaRecord) throws Exception {
            ...
            LOGGER.info("processing messages with key: " + key);
            return new KeyValue<>(key, valueBytesStream.toByteArray());
        }
    });

messagesStream.foreachRDD(new VoidFunction<JavaRDD<KeyValue<String, byte[]>>>() {
    public void call(JavaRDD<KeyValue<String, byte[]>> rdd) throws Exception {
     rdd..foreach(new VoidFunction<KeyValue<String, byte[]>>() {
                    ...
     }
});

我观察到我消耗了55条消息,而生成了69条消息。 1434消费消息产生1438条消息。

在两种情况下工作正常:

  1. 对Kafka主题进行单一分区并使用单个执行程序
  2. 用mapPartition(...)和rdd.foreach替换map rdd.foreachPartition(...)
  3. 在日志中处理带有密钥的消息:分别重复69次和1438次。我无法理解这种行为。有人可以对此有所了解吗?

0 个答案:

没有答案