如果我是正确的,默认情况下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"
属性如何在这种情况下进入画面?
答案 0 :(得分:1)
在直接模型中:
在第二种情况下,它取决于间隔,但一般来说,如果maxRatePerPartition
低于每秒批次窗口的实际速率,那么你总是会滞后。
答案 1 :(得分:1)
案例二:
spark.streaming.blockInterval
只影响接收者,你可以看到doc:
Spark Streaming接收器接收数据的时间间隔 在将它们存储在Spark中之前,将其分块为数据块。
spark.streaming.kafka.maxRatePerPartition = 3 < 5(you say)
总延迟会增加,你可以看到这个