[英]Kafka consumer in Spark Streaming
尝试编写一个使用来自 Kafka 的消息的 Spark Streaming 作业。 这是我到目前为止所做的:
向服务器发送了几条消息。 当我运行以下命令时,我可以看到它们:
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic mytopic --from-beginning
现在尝试编写一个程序来计算 5 分钟内传入的消息数量。
代码如下所示:
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("mytopic", new Integer(1));
JavaStreamingContext ssc = new JavaStreamingContext(
sparkUrl, " Spark Streaming", new Duration(60 * 5 * 1000), sparkHome, new String[]{jarFile});
JavaPairReceiverInputDStream tweets = KafkaUtils.createStream(ssc, "localhost:2181", "1", map);
不确定第三个参数(消费者组)使用什么值。 当我运行它时,我得到Unable to connect to zookeeper server
。 但是 Zookeeper 运行在端口2181
; 否则第 3 步将不会起作用。
好像我没有正确使用KafkaUtils.createStream
。 有任何想法吗?
没有默认消费者组这样的东西。 您可以在那里使用任意的非空字符串。 如果你只有一个消费者,那么它的消费者群体并不重要。 如果有两个或多个消费者,他们可以是同一个消费者组的一部分,也可以属于不同的消费者组。
来自http://kafka.apache.org/documentation.html :
消费者
...
如果所有消费者实例都具有相同的消费者组,那么这就像传统的队列平衡消费者负载一样。
如果所有的消费者实例都有不同的消费者组,那么这就像发布订阅一样,所有消息都会广播给所有消费者。
我认为问题可能出在“主题”参数中。 来自Spark 文档:
要使用的 (topic_name -> numPartitions) 映射。 每个分区都在自己的线程中使用
您只为您的主题指定了一个分区,即“1”。 根据代理的设置 (num.partitions),可能有多个分区,并且您的消息可能会发送到您的程序未读取的其他分区。
此外,我相信 partitionIds 是基于 0 的。 所以如果你只有一个分区,它的 id 将等于 0。
我认为您应该为 zookeeper 而不是 localhost 指定 ip。 此外,第三个参数是消费者组名称。 它可以是您喜欢的任何名称。 当您有多个消费者绑定到同一组时,主题分区会相应地分配。您的推文应该是:
JavaPairReceiverInputDStream tweets = KafkaUtils.createStream(ssc, "x.x.x.x", "dummy-group", map);
我面临同样的问题。 这是对我有用的解决方案。
如果 zookeeper 与您的流媒体应用程序在同一台机器上运行,则“localhost:2181”将起作用。 否则,您必须提及运行 zookeeper 的主机地址,并确保运行流媒体应用程序的机器能够在端口 2181 上与 zookeeper 主机通信。
我认为,在您的代码中,调用 KafkaUtils.createStream 的第二个参数应该是 kafka 服务器的主机:端口,而不是 zookeeper 主机和端口。 检查一次。
根据上面的文档,它应该是 zookeeper quorum 。 所以应该使用 Zookeeper 主机名和端口。
zkQuorum Zookeeper 仲裁(主机名:端口,主机名:端口,..)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.