在spark流文档中,他们建议并行化数据接收(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, ...)
1条答案
按热度按时间gmxoilav1#
在我们创建5个消费者的情况下,我们在集群上分发、并行化工作。对该数据进行的任何计算都可能在不同的节点上并行进行。
当一个接收器使用n个线程使用消息时,所有消息都在一台机器上接收。任何并行化工作负载的尝试都将导致通过网络将数据传送到另一个执行器,这将耗费时间和资源。
在高负载下,在多个物理主机上分布i/o是处理吞吐量的唯一方法。在这种情况下,您需要确保使用者被安排在不同的物理节点上。sparkv1.5有一个改进的调度机制来帮助实现这一点。