缓冲/消峰:有助于控制和优化数据流的速度,解决生产消息和消费消息的速度不一致的问题。
解耦:允许独立修改和扩展两边的处理过程,只需确保他们遵守相同的接口约束。
此时消息队列类似于一个超市,数据源是商品生产厂商,目的地是消费者,消费者无需跟各大厂商来往,而是去超市购物。
异步通信:允许用户把一个消息放入队列,不立即处理,再在需要的时候去处理。(比如发送验证码)
消息队列的两种模式:
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)]