我正在使用 Spark Streaming 1.5.0 构建原型(prototype)。 DirectKafkaInputDStream
被使用。
DirectKafkaInputDStream
从 kafka 读取的简单阶段无法处理大量消息。一旦消息速率达到或超过某个值,该阶段将花费比批处理间隔更长的时间。而且这个比率比我预期的要低得多。 (我用不同服务器中的多个消费者实例对我的 kafka 集群做了另一个基准测试)
JavaPairInputDStream<String, String> recipeDStream =
KafkaUtils.createDirectStream(jssc,
String.class,
String.class,
StringKeyDecoder.class,
StringDecoder.class,
kafkaParams, kafkaTopicsSet);
看完这篇article ,我意识到 DirectKafkaInputDStream
与驱动程序在同一节点上运行。是真的吗?如果是这样,那么 DirectKafkaInputDStream
很容易受到压力,因为它读取一个节点中的所有消息,然后分派(dispatch)给所有执行程序。
这意味着 JavaPairReceiverInputDStream
在处理大量数据方面具有更好的性能,因为接收器在多个执行程序实例上运行。
我说的对吗?有人可以解释一下吗?谢谢。
最佳答案
不,直接流只是从驱动程序到 kafka 的通信,以便找到最新的可用偏移量。实际消息仅在执行程序上读取。
将 .createStream 切换为 .createDirectStream 通常应该表现得更好,而不是更差。如果您有一个相反的可重现的小例子,请在 spark 邮件列表或 jira 上分享它。
关于apache-spark - Spark 流 DirectKafkaInputDStream : kafka data source can easily stress the driver node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32530547/