kafka_4自定义分区器代码

自定义分区器代码:

1) 默认的分区器 DefaultPartitioner

2) 自定义分区器

java代码

自定义分区器 需要实现Kafka提供的partitioner接口

/**

* 计算分区号以first主题为例, 有两个分区. 包含itwise的消息发送0号分区

* 其他消息发送1号分区

* @param topic 当前消息发往的主题* @param key 当前消息的key

* @param keyBytes 当前消息的key序列化后字节数组

* @param value 当前消息的值

* @param valueBytes 当前消息的值序列化后的字节数组

* @param cluster

* @return

使用自定义的分区器:MyPartitioner

package com.itwise.kafka.partitioner;


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

import java.util.Map;

public class MyPartitioner implements Partitioner {
    /**
     * 计算分区号
     * 以first主题为例, 有两个分区.
     * 包含itwise的消息发送0号分区
     * 其他消息发送1号分区
     * @param topic 当前消息发往的主题
     * @param key 当前消息的key
     * @param keyBytes 当前消息的key序列化后字节数组
     * @param value 当前消息的值
     * @param valueBytes 当前消息的值序列化后的字节数组
     * @param cluster
     * @return
     */

    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object
            value, byte[] valueBytes, Cluster cluster) {
        if(value.toString().contains("itwise")){
            return 0 ;
        }else{
            return 1 ;
        }
    }

    @Override
    public void close() {

    }

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

    }


}

MyPartitionerProducerDemo
package com.itwise.kafka.partitioner;

import org.apache.kafka.clients.producer.*;

import java.util.Properties;
import java.util.UUID;

public class MyPartitionerProducerDemo {
    public static void main(String[] args) {
//      0. 创建配置对象
        Properties props= new Properties();
//      kafka集群,broker-list
        props.put("bootstrap.servers", "node2:9092");
//      ack的级别
        props.put("acks", "all");
        //重试次数
        props.put("retries", 3);
//      批次大小
        props.put("batch.size", 16384);
//      等待时间
        props.put("linger.ms", 1);
//      RecordAccumulator缓冲区大小
        props.put("buffer.memory", 33554432); //32M
//      kv的序列化器
        props.put("key.serializer",
                "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer",
                "org.apache.kafka.common.serialization.StringSerializer");
//      设置分区类
        props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.itwise.kafka.partitioner.MyPartitioner");
//      1. 创建生产者对象
                KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
//      2. 生产数据,leader选举
        for (int i = 0; i < 10; i++) {
            String value = "" ;
            if(i % 2 == 0){
                value = "itwise==>" + i ;
            }else{
                value = UUID.randomUUID().toString() + "==>" + i ;
            }
            kafkaProducer.send(
                    new ProducerRecord<String, String>("itwise", value)
                    , new Callback() {
                        /**
                         * 当消息发送完成后, 会调用该方法
                         * @param metadata 消息的元数据信息.
                         *
                         * @param exception 当消息发送过程中,如果抛出异常,会传入到该方
                        法.
                         */
                        @Override
                        public void onCompletion(RecordMetadata metadata,
                                                 Exception exception) {
                            if(exception != null){
                                System.out.println("消息发送失败: " +
                                        exception.getMessage());
                            }else{
                                System.out.println("消息发送成功: " +
                                        metadata.topic() +
                                        " : " + metadata.partition() +
                                        " : " + metadata.offset()
                                );
                            }
                        }
                    });
        }
//      3. 关闭对象
        kafkaProducer.close();
    }
}

启动消费者

[itwise@node4 kafka_2.11-2.4.1]$ kafka-console-consumer.sh --consumer.config /opt/module/kafka_2.11-2.4.1/config/consumer.properties --bootstrap-server node2:9092 --topic itwise

[itwise@node2 ~]$ kafka-console-consumer.sh --consumer.config /opt/module/kafka_2.11-2.4.1/config/consumer.properties --bootstrap-server node2:9092 --topic itwise
 

测试运行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
r.config /opt/module/kafka_2.11-2.4.1/config/consumer.properties --bootstrap-server node2:9092 --topic itwise


测试运行

[外链图片转存中...(img-crpte1c3-1712839810286)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值