如何从Spark Streaming DirectAPI中的每个Kafka分区并发读取

时间:2016-12-12 16:12:39

标签: apache-spark apache-kafka spark-streaming kafka-consumer-api kafka-producer-api

如果我是正确的,默认情况下spark spark 1.6.1使用单个线程从每个Kafka分区读取数据,假设我的Kafka主题分区为50,这意味着每个50个分区中的消息将按顺序读取或者可以在循环时尚。

案例1:

- 如果是,那么如何在分区级别并行化读取操作?创建多个KafkaUtils.createDirectStream是唯一的解决方案吗?

e.g.
      val stream1 = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
        ssc, kafkaParams, topicsSet).map(_._2)

      val stream2 = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
        ssc, kafkaParams, topicsSet).map(_._2)

案例2:

- 如果我的kafka分区每秒接收5条消息,那么"--conf spark.streaming.kafka.maxRatePerPartition=3""--conf spark.streaming.blockInterval"属性如何在这种情况下进入画面?

2 个答案:

答案 0 :(得分:1)

在直接模型中:

  • 按顺序访问每个分区
  • 并行访问不同的分区

在第二种情况下,它取决于间隔,但一般来说,如果maxRatePerPartition低于每秒批次窗口的实际速率,那么你总是会滞后。

答案 1 :(得分:1)

案例二:

spark.streaming.blockInterval

只影响接收者,你可以看到doc:

  

Spark Streaming接收器接收数据的时间间隔   在将它们存储在Spark中之前,将其分块为数据块。

spark.streaming.kafka.maxRatePerPartition = 3 < 5(you say)

总延迟会增加,你可以看到这个

  

http://spark.apache.org/docs/latest/streaming-programming-guide.html#setting-the-right-batch-interval