哪个更好 - 每个消费者有更多数据接收器或更多线程?
What is better - more data receivers or more threads per consumer?
在 Spark Streaming 文档中,他们建议并行化数据接收 (link)。他们提出了一个创建多个数据接收器的示例:
val numStreams = 5
val kafkaStreams = (1 to numStreams).map { i => KafkaUtils.createStream(...) }
这样做你将在 5 台不同的机器上幸运地获得 5 个核心来接收数据。但就性能而言,为什么这个选项比具有 5 个线程的数据接收器更好? (例如超过 5 个内核的机器)
val numThreads = 5
val topicList = Map("topic1" -> numThreads)
val kafkaStream = KafkaUtils.createStream(ssc, kafkaParams, topics, ...)
在我们创建 5 个消费者的情况下,我们在集群上进行分布式、并行化工作。对该数据所做的任何计算都可能在不同的节点上并行完成。
当消息被一个接收者使用n个线程消费时,所有消息都在一台机器上接收。任何并行化该工作负载的尝试都将导致通过网络将数据传输到另一个执行器,这将花费时间和资源。
在高负载下,将 I/O 分布在多个物理主机上是处理吞吐量的唯一方法。在这种情况下,您需要确保消费者被安排在不同的物理节点上。 Spark v1.5 有一个 improved scheduling mechanism 来帮助解决这个问题。
在 Spark Streaming 文档中,他们建议并行化数据接收 (link)。他们提出了一个创建多个数据接收器的示例:
val numStreams = 5
val kafkaStreams = (1 to numStreams).map { i => KafkaUtils.createStream(...) }
这样做你将在 5 台不同的机器上幸运地获得 5 个核心来接收数据。但就性能而言,为什么这个选项比具有 5 个线程的数据接收器更好? (例如超过 5 个内核的机器)
val numThreads = 5
val topicList = Map("topic1" -> numThreads)
val kafkaStream = KafkaUtils.createStream(ssc, kafkaParams, topics, ...)
在我们创建 5 个消费者的情况下,我们在集群上进行分布式、并行化工作。对该数据所做的任何计算都可能在不同的节点上并行完成。
当消息被一个接收者使用n个线程消费时,所有消息都在一台机器上接收。任何并行化该工作负载的尝试都将导致通过网络将数据传输到另一个执行器,这将花费时间和资源。
在高负载下,将 I/O 分布在多个物理主机上是处理吞吐量的唯一方法。在这种情况下,您需要确保消费者被安排在不同的物理节点上。 Spark v1.5 有一个 improved scheduling mechanism 来帮助解决这个问题。