Kafka入门及生产者详解(1)

缓冲/消峰:有助于控制和优化数据流的速度,解决生产消息和消费消息的速度不一致的问题。

解耦:允许独立修改和扩展两边的处理过程,只需确保他们遵守相同的接口约束。

此时消息队列类似于一个超市,数据源是商品生产厂商,目的地是消费者,消费者无需跟各大厂商来往,而是去超市购物。

异步通信:允许用户把一个消息放入队列,不立即处理,再在需要的时候去处理。(比如发送验证码)

消息队列的两种模式:

1)点对点:消费者主动拉取数据,消息收到后清除消息

2)发布/订阅模式:有多个Topic主题;消费者消费完数据后,不删除数据,数据仍可以被其他消费者消费;每个消费者相互独立

3. Kafka基础架构

1)一个topic可以有多个分区,broker为服务器,即一份数据分为多个分区放在多个服务器

2)数据分为多块,消费者也有多个,组成一个消费者组,组内每个成员并行消费不同的分区

3)分区也有副本,不过和HDFS的副本有区别,HDFS的副本是相等的,而Kafka里的副本只有Leader的才能起作用,Follower的副本不能消费(除非Leader挂了,Follower成为Leader)

4)ZK里保存了Kafka的服务器id信息,以及每个topic的各个分区的Leader是哪个服务器,以及isr队列

4. Kafka命令行操作快速入门

针对Kafka基础架构的三大部分,分别有不同的脚本命令来操作。

生产者:kafka-console-producer.sh;

集群:kafka-topics.sh;

消费者:kafka-console-consumer.sh

1)kafka-topics.sh的命令参数如下

创建topic,1个分区,3个副本,并查看:

bin/kafka-topics.sh --bootstrap-server hadoop1:9092,hadoop2:9092 --topic first --create --partitions 1 --replication-factor 3

bin/kafka-topics.sh --bootstrap-server hadoop1:9092,hadoop2:9092 --list

bin/kafka-topics.sh --bootstrap-server hadoop1:9092,hadoop2:9092 --topic first --describe

结果如下:

修改分区数(分区数只能改大,不能改小)为3

bin/kafka-topics.sh --bootstrap-server hadoop1:9092,hadoop2:9092 --topic first --partitions 3

bin/kafka-topics.sh --bootstrap-server hadoop1:9092,hadoop2:9092 --topic first --describe

结果如下:

另外副本数也不能通过命令行修改

2) kafka-console-producer.sh

向指定分区发送数据

bin/kafka-console-producer.sh --bootstrap-server hadoop1:9092,hadoop2:9092 --topic first

3) kafka-console-consumer.sh

消费者消费指定分区的数据

bin/kafka-console-consumer.sh --bootstrap-server hadoop1:9092,hadoop2:9092 --topic first

再在生产端发送数据,消费者端可以收到数据,但不能收到历史数据(即生产者在消费者起来之前发送的数据),要想消费历史数据,加上参数:–from-beginning

bin/kafka-console-consumer.sh --bootstrap-server hadoop1:9092,hadoop2:9092 --topic first --from-beginning

5. 生产者异步发送与同步发送

添加依赖:

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>3.0.0</version>
</dependency>

创建Kafka生产者对象:

Properties properties = new Properties();

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

// 指定key和value的序列化类型
// StringSerializer.class.getName()相当于StringSerializer的全路径名称
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);

发送数据:

// new ProducerRecord第一个参数是topic,第二个参数是值(key为null)
kafkaProducer.send(new ProducerRecord<>("first", "value"));

ProducerRecord的多个构造函数:

关闭资源:

kafkaProducer.close();

发送数据也可以带回调函数,返回主题、分区等信息:

kafkaProducer.send(new ProducerRecord<>("first", "value"), new CallBack() {
    @Override
    public void onCompletion(RecordMetadata metadata, Exception exception) {
        if (exception == null) {
            System.out.println("topic: " + metadata.topic() + ", partition: " + metadata.partition());
        }
    }
});

同步发送只需在send方法之后加上get方法:

// new ProducerRecord第一个参数是topic,第二个参数是值(key为null)
kafkaProducer.send(new ProducerRecord<>("first", "value")).get();

6. 生产者分区策略

生产者的默认分区器:DefaultPatitioner,即如果指定分区,就发送到指定分区;如果没指定分区,指定了key,则将key的哈希值对分区数取模得到分区;如果也没指定key,选择粘性分区(sticky partition),即随机选取一个分区,本批次数据满了或者linger.ms时间到了,再次选择另一个分区。

自定义分区,主要是实现Partitioner接口,重写其中的partition方法:

@Overrride
public int partition(String topic, Object key, byte[] keybytes, Object value, byte[] valuebytes, Cluster cluster) {
    String valueStr = value.toString();
    if (valueStr.contains("xxx")) {
        return 0;
    } else if (valueStr.contains("zzz")) {
        return 1;
    } else {
        return 2;
    }
}

配置关联自定义分区器:

properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, MyPartitioner.class.getName());

7. 如何提高吞吐量

batch.size:每批次数据大小,数据量达到这个值,就开始发送,默认为16K

linger.ms:等待时间,如果到了这个时间,无论数据量多大,立即发送,默认为0

如果linger.ms设置为0,意味着一旦有数据来就立马发送,这样效率并不高,所以适当提高linger.ms有利于提高吞吐量,但是不能太大,这样会造成较大的数据延迟。

也可以发送数据的过程中采用数据压缩(snappy)的方式,来提高实际发送的数据量。

还可以修改缓冲区大小RecordAccumulator

设置缓冲区大小:

properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432); // 32M

设置批次大小:

properties.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384); // 16K


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/95dee5c29b3c859945de5e36721ad218.png)
![img](https://img-blog.csdnimg.cn/img_convert/0ab78cce2ca04cc1567d6563956bb59d.png)
![img](https://img-blog.csdnimg.cn/img_convert/1cd45273348c11210c4652f5d07ec014.png)
![img](https://img-blog.csdnimg.cn/img_convert/9cfcfbac5be90170ebe77ae1bbb2e2cc.png)
![img](https://img-blog.csdnimg.cn/img_convert/9e384fbe4f6cb1614880442221a68e39.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)**
![img](https://img-blog.csdnimg.cn/img_convert/a47513f711cbe2bdc75490c8990162a3.png)

g-LzzaMa82-1712849517156)]
[外链图片转存中...(img-PuqZvsi6-1712849517157)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)**
[外链图片转存中...(img-RIvWrf7R-1712849517157)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值