消息在Kafka + Spark Streaming中丢失

时间:2017-05-30 13:04:49

标签: apache-spark apache-kafka

我正面临与kafka火花流相关的问题,我的用例如下:

  • Spark streaming(DirectStream)应用程序从中读取消息 卡夫卡主题和处理它。
  • 根据已处理的消息,应用程序将写入 处理过的消息到不同的Kafka主题,例如如果是消息 协调,然后写入协调的主题,其他不协调 主题。

现在,问题是在流式传输过程中我们正在丢失一些消息,即所有传入的消息都不会写入协调或非协调的主题。 例如,如果应用程序在一个批处理中收到30条消息,那么有时它会将所有消息写入输出主题(这是预期的行为),但有时它只写入27条消息(3条消息丢失,此数字可能会改变)。

版本如下:

  • Spark 1.6.0
  • Kafka 0.9

Kafka主题配置如下:

  • 经纪人数:3
  • num replication factor:3
  • 数量分区:3

以下是我们用于kafka的属性:

      val props = new Properties() 
      props.put("metadata.broker.list", properties.getProperty("metadataBrokerList")) 
      props.put("auto.offset.reset", properties.getProperty("autoOffsetReset")) 
      props.put("group.id", properties.getProperty("group.id")) 
      props.put("serializer.class", "kafka.serializer.StringEncoder") 
      props.put("outTopicHarmonized", properties.getProperty("outletKafkaTopicHarmonized")) 
      props.put("outTopicUnharmonized", properties.getProperty("outletKafkaTopicUnharmonized")) 
      props.put("acks", "all"); 
      props.put("retries", "5"); 
      props.put("request.required.acks", "-1") 

以下是我们将处理过的消息写入kafka的代码:           val schemaRdd2 = finalHarmonizedDF.toJSON

      schemaRdd2.foreachPartition { partition => 
        val producerConfig = new ProducerConfig(props) 
        val producer = new Producer[String, String](producerConfig) 

        partition.foreach { row => 
          if (debug) println(row.mkString) 
          val keyedMessage = new KeyedMessage[String, String](props.getProperty("outTopicHarmonized"), 
            null, row.toString()) 
          producer.send(keyedMessage) 

        } 
        //hack, should be done with the flush 
        Thread.sleep(1000) 
        producer.close() 
      } 

我们明确添加了sleep(1000)用于测试目的。 但这也没有解决问题:(

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试将.xlsm参数(初始化vbaProject.bin时)调整为大于每个rdd处理时间的数值。这解决了我的问题。

答案 1 :(得分:0)

由于您不想丢失任何消息,因此您可能希望选择“恰好一次”传递语义,该语义不会造成数据丢失。为了配置准确的一次传送语义,您必须使用acks ='all'。

根据此资源[1],必须将acks ='all'属性与min.insync.replicas属性结合使用。

[1] https://www.linkedin.com/pulse/kafka-producer-delivery-semantics-sylvester-daniel/