kafka producer 示例
public void sendMsg() throws IOException {
Properties props = new Properties();
props.put("bootstrap.servers", "ip:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<String, String>(props);
/*for (int i = 0; i < 100; i++) {
producer.send(new ProducerRecord<String, String>("test", Integer.toString(i), Integer.toString(i)));
}*/
JSONObject jsonObject = new JSONObject();
jsonObject = getJsonData();
producer.send(new ProducerRecord<String, String>("test", jsonObject.toJSONString()));
List<PartitionInfo> partitions = new ArrayList<PartitionInfo>() ;
partitions = producer.partitionsFor("test");
for(PartitionInfo p:partitions)
{
System.out.println(p);
}
producer.close();
}
public JSONObject getJsonData() throws IOException {
File file=new File("C:\\Users\\user\\Desktop\\Json文件.json");
// apache的commons的FileUtils类就是这样一个工具类,使用它能大大的简化我们对文件的操作。
String content= FileUtils.readFileToString(file,"UTF-8");
JSONObject jsonObject = JSONObject.parseObject(content);
System.out.println(jsonObject);
return jsonObject;
}
注:
-
参数:
- acks: 生产者认为一个请求完成,所需要kafka集群主服务的应答次数。这个配置控制已发送消息的持久性。下面是这个配置可能的值。acks=0:如果设置为0,生产者不会等待kafka的响应。消息会被立刻加到发送缓冲通道中,并且认为已经发送成功。这种情况下,不能保证kafka接收到了这条消息,retries配置不会生效,每条消息的偏移量都是1;acks=1:这个配置意味着kafka会把这条消息写到本地日志文件中,但是不会等待集群中其他机器的成功响应。这种情况下,在写入日志成功后,集群主机器挂掉,同时从机器还没来得及写的话,消息就会丢失掉。acks=all:这个配置意味着leader会等待所有的follower同步完成。这个确保消息不会丢失,除非kafka集群中所有机器挂掉。这是最强的可用性保证。
- retries: 设置大于0的值将使客户端重新发送任何数据,一旦这些数据发送失败。注意,这些重试与客户端接收到发送错误时的重试没有什么不同。允许重试将潜在的改变数据的顺序,如果这两个消息记录都是发送到同一个partition,则第一个消息失败第二个发送成功,则第二条消息会比第一条消息出现要早。
- batch.size: producer将试图批处理消息记录,以减少请求次数。这将改善client与server之间的性能。这项配置控制默认的批量处理消息字节数。不会试图处理大于这个字节数的消息字节数。发送到brokers的请求将包含多个批量处理,其中会包含对每个partition的一个请求。较小的批量处理数值比较少用,并且可能降低吞吐量(0则会仅用批量处理)。较大的批量处理数值将会浪费更多内存空间,这样就需要分配特定批量处理数值的内存大小。默认值:16384
- linger.ms: producer组将会汇总任何在请求与发送之间到达的消息记录一个单独批量的请求。通常来说,这只有在记录产生速度大于发送速度的时候才能发生。然而,在某些条件下,客户端将希望降低请求的数量,甚至降低到中等负载一下。这项设置将通过增加小的延迟来完成–即,不是立即发送一条记录,producer将会等待给定的延迟时间以允许其他消息记录发送,这些消息记录可以批量处理。这可以认为是TCP种Nagle的算法类似。这项设置设定了批量处理的更高的延迟边界:一旦我们获得某个partition的batch.size,他将会立即发送而不顾这项设置,然而如果我们获得消息字节数比这项设置要小的多,我们需要“linger”特定的时间以获取更多的消息。 这个设置默认为0,即没有延迟。设定linger.ms=5,例如,将会减少请求数目,但是同时会增加5ms的延迟。默认值: 0
- buffer.memory: producer可以用来缓存数据的内存大小。如果数据产生速度大于向broker发送的速度,producer会阻塞或者抛出异常,以“block.on.buffer.full”来表明。这项设置将和producer能够使用的总内存相关,但并不是一个硬性的限制,因为不是producer使用的所有内存都是用于缓存。一些额外的内存会用于压缩(如果引入压缩机制),同样还有一些用于维护请求。默认值:33554432
kafka consumer 示例
public void getMsg() {
Properties props = new Properties();
props.put("bootstrap.servers", "ip:9092");
props.put("group.id", "test_B");
props.put("enable.auto.commit: ", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("test"));
String result = null;
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
}
}
注:
-
参数:
- group.id:标识此消费者所属的消费者群组的唯一字符串。如果消费者通过使用subscribe(topic)基于kafka的偏移量管理策略来使用组管理功能,则此属性是必需的。 自己定义
- enable.auto.commit: Consumer 在commit offset时有两种模式:自动提交,手动提交。自动提交:是Kafka Consumer会在后台周期性的去commit。默认值是true。
consumer 没有消费消息
解决步骤:
-
判断是否能连接到kafka。 通过topic列表命令(在下面)在命令行查看是否producer新建topic成功。
-
若 topic 新建成功,通过命令行,执行消费者命令,查看是否能接受到消息。注意:先启动客户端的消费者,再发送消息。 (只有第一次需要,因为在此之前,还没有注册到消费列表中,之前在topic里的消息就不会被刚启动的消费者消费到。)
-
若第二步在consumer命令下能接收到消息,查看 server.properties, 找到
#listeners=PLAINTEXT://:9092取消注释,修改为 机器的ip + 9092
listeners=PLAINTEXT://ip:9092
kafka 命令
-
启动,在kafka的bin目录下
./kafka-server-start.sh -daemon ../config/server.properties输入 jps, 查看是否启动成功。
-
查看topic列表:
bin/kafka-topics.sh --zookeeper localhost:2181 --list -
新建topic
./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test_kafka -
查看某一topic的详细信息
bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic test -
删除topic
bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test -
启动producer
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test -
启动consumer
bin/kafka-console-consumer.sh --bootstrap-server ip:9092 --topic test --from-beginning 集群就写多个ip+端口,用逗号分开。 ip1:9092,ip2:9092,ip3:9092 -
查看offset
bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper :2181,ip2:2181,ip3:2181 --group test_A --topic test -
设置offset
bin/kafka-consumer-groups.sh --bootstrap-server ip1:9092,ip2:9092,ip3:9092 --group test_A --topic test --execute --reset-offsets --to-offset 0