初识kafka 之 自定义分区器

需求

  通过一个分区器实现,发送过来的数据中如果包含kafka,就发往0号分区,不包含kafka,就发往1号分区。

代码实现

分区器

package com.lzh.kafka;

import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;

import java.util.Map;

// 自定义分区器
/*
需求
   通过一个分区器实现,发送过来的数据中如果包含kafka,就发往0号分区,不包含kafka,就发往1号分区。

代码写好之后,复制类全面: com.lzh.kafka.MyPartitioner
在序列化时,指定分区器。
*/
public class MyPartitioner implements Partitioner {

    public int partition(String s, Object o, byte[] bytes, Object o1, byte[] bytes1, Cluster cluster) {
        // 获取数据
        // 把获取到的数据转为String类型
        String msgValues = o1.toString();

        // 创建partition
        int partition;

        if (msgValues.contains("kafka")) {
            partition=0;
        }else {
            partition=1;
        }
        return partition;
    }

    public void close() {

    }

    public void configure(Map<String, ?> map) {

    }
}

主体使用

package com.lzh.kafka;

import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;
import java.util.concurrent.ExecutionException;

// 自定义分区器
/*
需求
   通过一个分区器实现,发送过来的数据中如果包含kafka,就发往0号分区,不包含kafka,就发往1号分区。

代码写好之后,复制类全面: com.lzh.kafka.MyPartitioner
在序列化时,指定分区器。
*/
public class CustomProducer自定义分区器 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 1.配置
        Properties properties = new Properties();

        // 连接集群
        // 给kafka对象添加配置信息 bootstrap.servers
        // 生产者连接集群所需的 broker 地址清单
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"bigdata01:9092,bigdata02:9092");


        // 指定发送消息的key和value的序列化类型。一定要写全类名。
        // key,value序列化 key.serializer,value.serializer

        // key序列化
        // 全类名与下等价: properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

        // value序列化
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

        // 指定自定义分区器
        properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.lzh.kafka.MyPartitioner");

        // 2.创建 kafka 生产者对象
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(properties);

        // 3.发送数据
        // 调用 send 方法,发送消息
        for (int i = 1; i < 5; i++) {
            final String msg;
            if (i % 2 == 0) {
                msg="hello kafka";
            }else {
                msg="hello java";
            }
            kafkaProducer.send(new ProducerRecord<String, String>("Mytopic", msg), new Callback() {
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                    if (e == null) {
                        System.out.println(msg + "已发送到主题"+recordMetadata.topic() +"的"+ recordMetadata.partition() +"分区");
                    }
                }
            });
        }


        // 4.关闭资源
        kafkaProducer.close();

    }
}

附,类全名复制方法。

 

 结果

 

 

 

posted on 2022-04-14 15:32  Simple-Sir  阅读(235)  评论(0编辑  收藏  举报

导航