栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Kafka自定义分区器/提高生产吞吐量/数据可靠性

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Kafka自定义分区器/提高生产吞吐量/数据可靠性

目录

自定义分区器

生产经验--- 生产者如何提高吞吐量

 生产经验--数据可靠性


自定义分区器

1、创建一个新的包:Partitioner

创建一个分区器

topic                   主题

key                     消息的 key

keyBytes            消息的 key 序列化后的字节数组

value                  消息的 value

valueBytes         消息的 value 序列化后的字节数组

cluster                集群元数据可以查看分区信息

package com.atguigu.kafka.producer;

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

import java.util.Map;

public class MyPartitioner implements Partitioner {
    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {

     //获取数据atguigu  hello
        String msgValues = value.toString();

        int partition=0;

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


        return partition;
    }

    @Override
    public void close() {

    }

    @Override
    public void configure(Map map) {

    }
}

关联自定义分区器

//关联自定义分区器
properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.atguigu.kafka.producer.MyPartitioner");

 测试自定义分区器

测试1

将发送消息设置为atguigu;查看它的分区

测试结果如图所示:

测试2

将发送消息设置为hello;查看它的分区

测试结果如图所示: 

 

生产经验--- 生产者如何提高吞吐量

batch.size批次大小

linger.ms等待时间

compression.type压缩

RecordAccumulator缓冲区大小

以上参数都可以影响到生产者的吞吐量;

batch.size:批次大小,默认16k

linger.ms:等待时间,修改为5-100ms

compression.type:压缩snappy

RecordAccumulator:缓冲区大小,修改为64m

 创建一个包:CustomProducerParameters

package com.atguigu.kafka.producer;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;


public class CustomProducerParameters {

    public static void main(String[] args)  {

        //配置信息
        Properties properties = new Properties();

        //连接Kafka集群

        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop102:9092,hadoop103:9092");

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

        //缓冲区大小
        properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG,33554432);

        //批次大小
        properties.put(ProducerConfig.BATCH_SIZE_CONFIG,16384);

        //linger.ms
        properties.put(ProducerConfig.LINGER_MS_CONFIG,1);

        //压缩
        properties.put(ProducerConfig.COMPRESSION_TYPE_CONFIG,"snappy");

        //1、创建生产者
        KafkaProducer kafkaProducer = new KafkaProducer<>(properties);

        //2、发送数据
        for (int i=0; i<5; i++){
            kafkaProducer.send(new ProducerRecord<>("first","hello"+i));
        }

        //3、关闭资源
        kafkaProducer.close();

    }

或者可以Ctrl+c ;Ctrl+v;复制CustomProducer包;修改名称为CustomProducerParameters

然后在包下添加如下代码即可

        //缓冲区大小
        properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG,33554432);

        //批次大小
        properties.put(ProducerConfig.BATCH_SIZE_CONFIG,16384);

        //linger.ms
        properties.put(ProducerConfig.LINGER_MS_CONFIG,1);

        //压缩
        properties.put(ProducerConfig.COMPRESSION_TYPE_CONFIG,"snappy");

测试

结果运行如下:

 生产经验--数据可靠性

发送流程图:

ACK应答级别 

 

以上三张图片来源于尚硅谷 

 可靠性总结:

acks=0,生产者发送过来数据就不管了,可靠性差,效率搞;

acks=1,生产者发送过来数据Leader应答,可靠性中等,效率中等;

acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer应答,可靠性高,效率低;

生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。

数据重复分析

下图来源于尚硅谷

 代码配置

package com.atguigu.kafka.producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class CustomProducerAcks {

    public static void main(String[] args) {

        // 0配置
        Properties properties = new Properties();

        // 连接集群 bootstrap.servers
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop102:9092,hadoop103:9092");

        // 指定对应的key和value的序列化类型
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

        //acks
        properties.put(ProducerConfig.ACKS_CONFIG,"1");

        //重试次数
        properties.put(ProducerConfig.RETRIES_CONFIG,"3");

        // 1创建kafka生产者对象

        // “”hello
        KafkaProducer kafkaProducer = new KafkaProducer<>(properties);


        // 2发送数据
        for (int i=0; i<5; i++) {

            kafkaProducer.send(new ProducerRecord<>("first","HYF"+i));

        }
        // 3关闭资源
        kafkaProducer.close();
    }



}
只需要在之前的包中插入以下两行代码即可
//acks
properties.put(ProducerConfig.ACKS_CONFIG,"1");

//重试次数
properties.put(ProducerConfig.RETRIES_CONFIG,"3");

测试

测试结果如图

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991973.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号