Apache spark 为什么两个spark流媒体作业使用相同的组id从同一个Kafka主题中提取消息,而不是平衡负载,而是获取相同的消息?
卡夫卡0.8官方文件对卡夫卡消费者的描述如下:Apache spark 为什么两个spark流媒体作业使用相同的组id从同一个Kafka主题中提取消息,而不是平衡负载,而是获取相同的消息?,apache-spark,apache-kafka,spark-streaming,Apache Spark,Apache Kafka,Spark Streaming,卡夫卡0.8官方文件对卡夫卡消费者的描述如下: ... ... HashMap<String, String> kafkaParams = new HashMap<String, String>(); kafkaParams.put("metadata.broker.list", brokerList); kafkaParams.put("group.id", groupId); JavaPairInputDStream<
... ...
HashMap<String, String> kafkaParams = new HashMap<String, String>();
kafkaParams.put("metadata.broker.list", brokerList);
kafkaParams.put("group.id", groupId);
JavaPairInputDStream<String, String> messages = KafkaUtils.createDirectStream(
jssc,
String.class,
String.class,
StringDecoder.class,
StringDecoder.class,
kafkaParams,
topicsSet
);
messages.foreachRDD(new Function<JavaPairRDD<String, String>, Void>() {
@Override
public Void call(JavaPairRDD<String, String> rdd) throws Exception {
long msgNum = strJavaRDD.count();
System.out.println("There are " + msgNum + " messages read from Kafka.");
... ...
return null;}});
“使用者使用使用者组名称标记自己,发布到主题的每条消息都会传递到每个订阅使用者组中的一个使用者实例。使用者实例可以位于单独的进程中,也可以位于单独的计算机上。
如果所有使用者实例都有相同的使用者组,那么这就像传统的队列平衡使用者的负载一样。”
我使用Kafka 0.8.1.1设置了一个Kafka集群,并使用Spark Streaming job(Spark 1.3)从其主题中提取数据。火花流代码如下所示:
... ...
HashMap<String, String> kafkaParams = new HashMap<String, String>();
kafkaParams.put("metadata.broker.list", brokerList);
kafkaParams.put("group.id", groupId);
JavaPairInputDStream<String, String> messages = KafkaUtils.createDirectStream(
jssc,
String.class,
String.class,
StringDecoder.class,
StringDecoder.class,
kafkaParams,
topicsSet
);
messages.foreachRDD(new Function<JavaPairRDD<String, String>, Void>() {
@Override
public Void call(JavaPairRDD<String, String> rdd) throws Exception {
long msgNum = strJavaRDD.count();
System.out.println("There are " + msgNum + " messages read from Kafka.");
... ...
return null;}});
。。。
HashMap kafkaParams=新HashMap();
kafkaParams.put(“metadata.broker.list”,brokerList);
kafkaParams.put(“group.id”,groupId);
JavaPairInputStream消息=KafkaUtils.createDirectStream(
jssc,
String.class,
String.class,
StringDecoder.class,
StringDecoder.class,
卡夫卡帕拉姆斯,
主题集
);
messages.foreachRDD(新函数(){
@凌驾
公共Void调用(JavaPairdd rdd)引发异常{
long msgNum=strjavard.count();
System.out.println(“有从卡夫卡读取的“+msgNum+”消息”);
... ...
返回null;}});
然后我提交了两个Spark流媒体作业,以访问具有相同组id的同一主题。我假设,当我向该主题发送100条消息时,这两个作业总共收到100条消息(例如,job1获得50条,job2获得50条;或者job1获得100条,job2获得0条)。然而,他们分别得到100分。这样的结果似乎与卡夫卡博士所说的有所不同
我的密码有什么问题吗?我是否正确设置了组id配置?这是createDirectStream()的错误还是设计
测试环境:Kafka 0.8.1.1+Spark 1.3.1组是0.9版之前Kafka高级消费API的一个功能,在简单消费API中不可用
createDirectStream
使用简单的消费者API
一些提示:
Kafka 0.9.0版本添加了一个新的Java使用者,以取代现有的基于ZooKeeper的高级使用者和低级使用者API。然后,您可以同时使用组和提交偏移量手册。创建两个不同的spark应用程序来对相同的消息执行相同的操作是没有意义的。将一个应用程序与多个执行者一起使用。明白了。我需要使用“createStream”而不是“createDirectStream”在共享单个组id的线程之间共享主题中的消息。