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 }
PartitionerProducer.java

 

二 服务器端

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,说明自定义分区函数生效。

 

posted @ 2018-11-12 19:51  zhengna  阅读(262)  评论(0编辑  收藏  举报