Spark Streaming Kafka Receivers API - numPartitions

时间:2017-12-26 08:53:02

标签: scala apache-kafka spark-streaming

我们正在使用spark-streaming-kafka-0-8接收器。我们无法通过增加numPartitions来增加消耗事件的数量。似乎增加的numPartition不会影响性能。

KafkaUtils.createStream方法有一个topic_name到numPartitions映射,而每个分区都应该在自己的线程中使用。

目前我们正在使用:

KafkaUtils.createStream[Integer, Event, IntegerDecoder, EventDecoder](ssc,
  Configuration.kafkaConfig, scala.collection.immutable.Map(topic -> 1),
  StorageLevel.MEMORY_AND_DISK)

我希望使用scala.collection.immutable.Map(topic - > 10)会比使用1个线程时吸引更多的事件,但它不会提高性能(我确保10个线程实际上是每个接收器使用)

但是,如果我创建更多Kafka接收器(根据我的理解,它完全等同于增加线程),性能确实提高了

这是版本0-8的问题吗? 增加numPartition会增加消费事件的数量吗? 为什么添加接收器会提高性能,而增加numPartition却不会?

1 个答案:

答案 0 :(得分:1)

  

这是版本0-8的问题吗?

不,这是一个"问题"使用基于接收者的方法,这是您与createStream一起使用的内容。所述方法将在给定的执行器节点上创建用于消费的单个线程。如果你想同时阅读,你必须创建多个这样的接收器。

根据documentation

  

Kafka中的主题分区与RDD的分区无关   在Spark Streaming中生成。所以增加了数量   仅限KafkaUtils.createStream()中的特定于主题的分区   增加使用哪些主题的线程数   在一个接收器内。它不会增加并行性   Spark处理数据

如果要增加并发性,请使用直接(无接收器)方法(使用KafkaUtils.createDirectStream)将每个TopicPartition调度到给定的执行程序节点以供使用,从而允许所有执行程序参与从卡夫卡消费