Spark Streaming Kafka 接收器 API - numPartitions

Posted

技术标签:

【中文标题】Spark Streaming Kafka 接收器 API - numPartitions【英文标题】:Spark Streaming Kafka Receivers API - numPartitions 【发布时间】:2017-12-26 08:53:01 【问题描述】:

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

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 的问题吗? 增加 numPartitions 是否应该提高消耗事件的数量? 为什么增加接收器可以提高性能,而增加 numPartition 却不能?

【问题讨论】:

【参考方案1】:

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

不,这是 基于接收器的方法的“问题”,这就是您在 createStream 中使用的方法。上述方法将在给定的执行程序节点上创建单个线程以供使用。如果你想同时读取,你必须创建多个这样的接收器。

根据documentation:

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

如果你想增加并发,请使用基于直接(无接收器)的方法(使用KafkaUtils.createDirectStream),它将每个TopicPartition 分派到给定的执行程序节点进行消费,从而允许所有执行程序参与来自Kafka的消费

【讨论】:

以上是关于Spark Streaming Kafka 接收器 API - numPartitions的主要内容,如果未能解决你的问题,请参考以下文章

spark streaming 接收kafka消息之一 -- 两种接收方式

java spark-streaming接收TCP/Kafka数据

如何使用spark streaming接收kafka中发送的自定义对象

使用 Spark Structured Streaming 从多个 Kafka 主题读取并写入不同接收器的最佳方式是啥?

大数据Spark Streaming Queries

spark streaming 接收kafka消息之二 -- 运行在driver端的receiver