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

  • 相关阅读:
    PHP识别二维码功能,php-zbarcode 安装
    《架构即未来》读后感(三)
    MVC设计模式案例分析
    SOA
    《架构即未来》读后感(二)
    基于网络拓扑及告警的故障根因定位系统实现及算法研究赛题需求分析
    《架构即未来》读后感(一)
    《大型网站技术架构》读后感(二)
    《一线架构师实践指南》读后感(三)
    《大型网站技术架构》读后感(三)
  • 原文地址:https://www.cnblogs.com/zhengna/p/9948612.html
Copyright © 2020-2023  润新知