Kafka消费形式验证
前面的《Kafka笔记整理(一)》中有提到消费者的消费形式,说明如下:
1、每个consumer属于一个consumer group,可以指定组id。group.id2、消费形式:
组内:组内的消费者消费同一份数据;同时只能有一个consumer消费一个Topic中的1个partition;
一个consumer可以消费多个partitions中的消息。所以,对于一个topic,同一个group中推荐不能有多于
partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息。
组间:每个消费组消费相同的数据,互不影响。3、在一个consumer多个线程的情况下,一个线程相当于一个消费者。
例如:partition为3,一个consumer起了3个线程消费,另一个后来的consumer就无法消费
下面就来验证Kafka的消费形式,不过需要说明的是,在消费者的程序代码中,可以指定消费者的group.id(我们下面将会在配置文件中指定)。
而在使用kafka的shell命令时,其实也是可以指定配置文件来指定消费者的group.id的,如果不指定,那么kafka将会随机生成一个group.id(kafka-console-consumer.sh中的kafka.tools.ConsoleConsumer类,如果没有指定group.id,其策略是随机生成)。
在后面的程序代码中,会使用同一group.id开启4个消费的线程(因为我们创建的topic有3个partition),然后在终端中通过kafka shell来开启另外一个消费者,进而达到验证kafka消费形式的目的。
另外,在测试中使用的topic如下:
$ kafka-topics.sh --describe hadoop --zookeeper uplooking01:2181,uplooking02:2181,uplooking03:2181Topic:hadoop PartitionCount:3 ReplicationFactor:3Configs:
Topic: hadoop Partition:0 Leader: 103 Replicas: 103,101,102 Isr: 103,101,102Topic: hadoop Partition:1 Leader: 101 Replicas: 101,102,103 Isr: 101,102,103Topic: hadoop Partition:2 Leader: 102 Replicas: 102,103,101 Isr: 102,103,101
即partition为3,副本因为也为3.
程序代码
KafkaProducerOps.java
package com.uplooking.bigdata.kafka.producer;
import com.uplooking.bigdata.kafka.constants.Constants;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Random;/**
* 通过这个KafkaProducerOps向Kafka topic中生产相关的数据
*
* Producer*/
public classKafkaProducerOps {public static voidmain(String[] args) throws IOException {/**
* 专门加载配置文件
* 配置文件的格式:
* key=value
*
* 在代码中要尽量减少硬编码
* 不要将代码写死,要可配置化*/Properties properties= newProperties();
InputStreamin = KafkaProducerOps.class.getClassLoader().getResourceAsStream("producer.properties");
properties.load(in);/**
* 两个泛型参数
* 第一个泛型参数:指的就是kafka中一条记录key的类型
* 第二个泛型参数:指的就是kafka中一条记录value的类型*/String[] girls= new String[]{"姚慧莹", "刘向前", "周 新", "杨柳"};
Producer producer = new KafkaProducer(properties);
Random random= newRandom();int start = 1;for (int i = start; i <= start + 20; i++) {
String topic=properties.getProperty(Constants.KAFKA_PRODUCER_TOPIC);
String key= i + "";
String value= "今天的很美很美哦~";
ProducerRecord producerRecord =
new ProducerRecord(topic, key, value);
producer.send(producerRecord);
}
producer.close();
}
}
KafkaConsumerOps.java
package com.uplooking.bigdata.kafka.consumer;</