kafka6 编写使用自定义分区的生产者
一 客户端
在上一篇博客创建的简单生产者的基础上,进行两个修改操作:
1.新建SimplePartitioner.java,修改返回分区为1。
SimplePartitioner.java代码如下
package cn.test.mykafka; import java.util.Map; import org.apache.kafka.clients.producer.Partitioner; import org.apache.kafka.common.Cluster; /** * 简单分区函数 * */ public class SimplePartitioner implements Partitioner { @Override public void configure(Map<String, ?> configs) { // TODO Auto-generated method stub } @Override public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { // TODO Auto-generated method stub return 1; //设置返回分区1 } @Override public void close() { // TODO Auto-generated method stub } }
2.复制SimpleProducer.java为PartitionerProducer.java,修改3处:
增加一个partitioner.class配置;主题改为test-topic2;消息改为hello world to partition 1 from win7 client。
1 package cn.test.mykafka; 2 3 import java.util.Properties; 4 5 import org.apache.kafka.clients.producer.KafkaProducer; 6 import org.apache.kafka.clients.producer.Producer; 7 import org.apache.kafka.clients.producer.ProducerRecord; 8 9 /** 10 * 使用自定义分区的生产者 11 * 12 */ 13 14 public class PartitionerProducer { 15 16 public static void main(String[] args) { 17 18 //创建配置信息 19 Properties props = new Properties(); 20 props.put("bootstrap.servers", "192.168.42.133:9092"); //指定broker的节点和端口 21 props.put("acks", "all"); 22 props.put("retries", 0); 23 props.put("batch.size", 16384); 24 props.put("linger.ms", 1); 25 props.put("buffer.memory", 33554432); 26 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 27 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 28 props.put("partitioner.class","cn.test.mykafka.SimplePartitioner"); //自定义分区 29 30 //创建一个生产者 31 Producer<String, String> producer = new KafkaProducer<>(props); 32 33 //发送消息 34 ProducerRecord<String, String> msg = new ProducerRecord<String, String>("test-topic2","hello world to partition 1 from win7 client"); 35 producer.send(msg); 36 //for (int i = 0; i < 10; i++) 37 // producer.send(new ProducerRecord<String, String>("test-topic", Integer.toString(i), Integer.toString(i))); //topic,key,value 38 39 System.out.println("over"); 40 producer.close(); 41 } 42 }
二 服务器端
1.搭建单节点单broker的kafka。具体步骤看这里。
2.启动服务器
启动zookeeper
[root@hadoop kafka]# zookeeper-server-start.sh config/zookeeper.properties [root@hadoop kafka]# jps #打开另一个终端查看是否启动成功 3892 Jps 3566 QuorumPeerMain
启动kafka
[root@hadoop kafka]# kafka-server-start.sh config/server.properties
3.创建topic
#创建2个分区,1个副本的主题 [root@hadoop kafka]# kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic test-topic2 Created topic "test-topic2".
4.启动消费者
[root@hadoop kafka]# kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic2 --from-beginning
三 测试发送消息
1.在eclipse运行代码,发送消息。
2.查看消费者是否接收到消息。
如上消费者接收到消息,说明消息发送成功。
3.查看消息是否发送到分区1。
[root@hadoop ~]# cd /tmp/kafka-logs/ [root@hadoop kafka-logs]# ls #显示主题test-topic2的2个分区 ... test-topic2-0 test-topic2-1 ... [root@hadoop kafka-logs]# cat test-topic2-0/00000000000000000000.log #查看分区0,显示为空 [root@hadoop kafka-logs]# cat test-topic2-1/00000000000000000000.log #查看分区1,显示消息 c)g??????????????bVhello world to partition 1 from win7 client[root@hadoop kafka-logs]#
如上显示消息成功写入分区1,说明自定义分区函数生效。