博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KafKa生产者分区策略运行实例
阅读量:804 次
发布时间:2019-03-24

本文共 2507 字,大约阅读时间需要 8 分钟。

package com.kafka.partitions;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.ProducerRecord;import java.util.Properties;public class KafkaProducerMypartition {    public static void main(String[] args) {        Properties properties = new Properties();        properties.put("bootstrap.servers", "192.168.154.100:9092");        properties.put("acks", "all");        properties.put("retries", 0);        properties.put("batch.size", 16384);        properties.put("linger.ms", 1);        properties.put("buffer.memory", 33554432);        properties.put("key.serializer",                "org.apache.kafka.common.serialization.StringSerializer");        properties.put("value.serializer",                "org.apache.kafka.common.serialization.StringSerializer");        properties.put("partitioner.class", "com.kafka.partitions.MyPartitioner");  // 配置 自定义分区类        KafkaProducer
producer = new KafkaProducer<>(properties); for (int i = 0; i < 100; i++) { // 分区策略第一种: 如果即没有指定分区号,也没有指定数据key,那么就会使用轮询的方式将数据均匀的发送到不同// ProducerRecord producerRecord1 = new ProducerRecord<>("mypartition","mymessage"+i);// producer.send(producerRecord1); // 分区策略第二种 如果没有指定分区号, 指定了数据key 通过key,hashcode % numPartitions 来计算数据究竟会保存在哪个分区 // 注意 如果数据key,没有变化 key.hashcode % numPartitions = 固定值 所有的数据都会写到某一个分区里面去// ProducerRecord producerRecord2 = new ProducerRecord<>("mypartition","mykey","mymessage"+i);// producer.send(producerRecord2); // 第三种 分区策略: 如果指定了分区号,那么就会将数据直接写入到对应的分区里面去// ProducerRecord producerRecord3 = new ProducerRecord<>("mypartition",2,"mykey","mymessage"+i);// producer.send(producerRecord3); // 第四中 分区策略 自定义分区策略 ProducerRecord producerRecord4 = new ProducerRecord<>("mypartition","mymessage"+i); producer.send(producerRecord4); } producer.close(); }}

第四种自定义分区策略接口实现类代码:

package com.kafka.partitions;import org.apache.kafka.clients.producer.Partitioner;import org.apache.kafka.common.Cluster;import java.util.Map;public class MyPartitioner implements Partitioner {    /**     *     * 这个方法就是确定数据到哪个一个分区里面去     * 直接return 1 表示将数据写入到1 号分区里面去     **/    @Override    public int partition(String s, Object o, byte[] bytes, Object o1, byte[] bytes1, Cluster cluster) {        return 1;    }    @Override    public void close() {    }    @Override    public void configure(Map
map) { }}

 

 

转载地址:http://tfyuk.baihongyu.com/

你可能感兴趣的文章