Kafka学习记录

新版本Kafka似乎集成了raft,不再需要zookeeper来保证一致性(听说还不是很靠谱)
使用Kafka一定先打开zookeeper

topic命令行操作

在这里插入图片描述
一个典型的produceer代码模板

package com.atguigu.kafka.producer;
import org.apache.kafka.clients.producer.*;
import java.util.Properties;
public class CustomProducerCallback {
	public static void main(String[] args) throws InterruptedException {
		// 1. 创建 kafka 生产者的配置对象
		Properties properties = new Properties();
		// 2. 给 kafka 配置对象添加配置信息
		properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092");
		// key,value 序列化(必须):key.serializer,value.serializer
		properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); 
		properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, 
		StringSerializer.class.getName());
		// 3. 创建 kafka 生产者对象
		KafkaProducer<String, String> kafkaProducer = new 
		KafkaProducer<String, String>(properties);
		 // 4. 调用 send 方法,发送消息
		 for (int i = 0; i < 5; i++) {
			 // 添加回调
			 kafkaProducer.send(new ProducerRecord<>("first", "atguigu " + i), new Callback() {
			 // 该方法在 Producer 收到 ack 时调用,为异步调用
			 @Override
			public void onCompletion(RecordMetadata metadata, Exception exception) {
				 if (exception == null) {
				 // 没有异常,输出信息到控制台
				 System.out.println(" 主题: " + metadata.topic() + "->" + "分区:" + metadata.partition());
				 } else {
				 // 出现异常打印
				 exception.printStackTrace();
				 }
			}
		});
		 // 延迟一会会看到数据发往不同分区
		 Thread.sleep(2);
		}
		// 5. 关闭资源
		kafkaProducer.close();
	}
}
ACK应答级别

在这里插入图片描述
ACK应答级别(ProducerConfig.ACKS_CONFIG,”all | -1 | 0 | 1“)
0:不需要应答
1:仅leader收到即可应答
-1(all):需要isr全部收到才能应答

幂等性

Kafka同样使用水位线来保证幂等性
follow节点挂掉,则直到追上水位线,才重新加入ISR
leader节点挂掉,则以新leader水位线为准。

文件存储

主要存储log日志。同样分片,追加写,页缓存,零拷贝进行优化

消费方式

消费者pull消费,解决不同消费者消费速度不同的问题。但是会出现没有数据,消费者不停pull空值。
消费者组以其groupid%50=res,以consumer_offset_partition=res的broker中的coordinator作为group的leader。
此时custom提交offset就在该borker提交
在这里插入图片描述
可以看到custom group同样会协商出一个leader。custom group与Kafka cluster通信多在两个leader之间,加入group与消费方案以广播形式发送
custom group中的custom与topic的partition是如何分配的?
Range
平均分配,有多的partition都分配在前几个custom。若topic多容易造成数据倾斜([0.1.2],[3.4][5.6])。当有custom加入或退出,全体重新执行算法
RoundRobin
轮询分配([0.3.6]),[1.4],[2.5])。当有custom加入或退出,全体重新执行算法
Sticky
黏性策略。保证了尽量均衡。当有custom退出,仅重新分配退出custom的partition,而不会全体重新执行算法
CooperativeSticky

__consumer_offsets

__consumer_offsets以一个系统内置topic的形式存在
__consumer_offsets topic采用 key 和 value 的方式存储数据。key 是 group.id+topic+分区号,value 就是当前(partition)offset 的值。每隔一段时间,kafka 内部会对这个 topic 进行compact,也就是每个 group.id+topic+分区号只保留最新数据。
提交方式
在这里插入图片描述

//自动提交开启
ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true)
// 提交 offset 的时间周期 1000ms,默认 5s
ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, 1000)
手动提交分为同步提交和异步提交
同步时阻塞当前进程,并失败重试。异步仅请求一次,不会重试
(是custom线程进行请求,不是由topic的partition)
当 Kafka 中没有初始偏移量(消费者组第一次消费)或服务器上不再存在当前偏移量时(例如该数据已被删除)
可以通过手动指定offset。
(eariliest | latest | none)分别从__consumer_offsets的最开始,最末尾,抛出异常的方式解决该问题。
也可以
1.获取分区信息
2.根据分区,对每个分区获取时间的信息
3.按照时间重新消费,以完成指定时间消费的功能。

消费者事务

为了防止重复消费与漏消费,将消费与offset的设置绑定为原子操作。此功能Kafka不支持,需要与支持事务组件结合才能完成(MySQL)

kraft

不再依赖zookeeper来进行一致性管理。Kafka内部用三台collector保存元数据,来保证一致性。
好处:
1.管理集群不再需要从zookeeper读取数据(进程间改进程内?)
2.不受限zookeeper读写能力
3.可手动配置collector节点,让高性能服务器作collector。(zookeeper随机(伪)确定leader)

尚硅谷大数据技术之Kafka

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值