Kafka详解(1)

2018-12-07 18:16 
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/helloemk/article/details/84870901

1、Kafka概述

1.1、kafka是什么
在流式计算中,kafaka一般用来缓存数据,实时计算框架通过消费kafka的数据进行计算。
(1)kafka由scala写成,是一个分布式消息队列,kafka集群有多个kafka实例(broker)组成。
(2)kafka保存消息按Topic进行归类,有发送者producer,消费者consumer。
(3)kafka集群,producer和consumer都依赖zk集群保存一些meta信息。
1.2、kafka架构
(1)producer:消息生产者,就是向broker发送消息的客户端;
(2)consumer:消费者,向broker拉取消息的客户端;
(3)topic:可以理解成一个队列
(4)Consumer Grooup(CG):消费者组,一个topic可以有多个CG,用来实现一个topic消息的广播(发送个所有的consumer,只要每个consumer有一个独立的CG就可以了),和单播(发送给任意一个consumer,只要所有的consumer在同一个CG);
(5)broker:一台kafka服务器就是一个broker,一个broker可以有多个topic
(6)partition:一个大的topic可以分不到多个broker上,一个topic可以分成多个partition,每个partition是一个有序的队列,partition中的每条消息都会被分配一个有序的id(offset,又叫偏移量)。kafka只保证一个partition的消息顺序发送给consumer,不能保证一个topic(多个partition)的顺序;
(7)offset:就是partition中消息的id,kafka的存储文件都是按照offset.kafka来命名,这样方便查找,例如你想找位于2049的位置,只要找到2048.kafka文件的位置,第一个offset就是00000000000.kafka

2、Kafka安装部署

3、Kafka命令行操作

(1)查看当前服务器所有topic
bin/kafka-topics.sh --zookeeper hadoop03:2181 --list
(2)创建topic
bin/kafka-topics.sh --zookeeper hadoop03:2181 --create --replication-factor 3 --partitions 1 --topic testTopic
(3)查看某个topic详情
bin/kafka-topics.sh --zookeeper hadoop03:2181 --describle --topic testTopic
(4)删除topic
bin/kafka-topics.sh --zookeeper hadoop03:2181 --delete --topic testKafke
(5)发送消息
bin/kafka-console-producer.sh --broker-list hadoop03:9092 --topic testKafka
>hello world
(6)消费消息
bin/kafka-console=consumer.sh --zookeeper hadoop03:2181 --from-beginning --topic testKafka
提示:--from-beginning会把topic中以往所有数据都拉取出来

4、Kafka工作流程分析

4.1、kafka生产过程分析
1、写入方式
producer采用推(push)模式将消息发布到brooker,每条消息都被追加(append)到分区(partition),属于顺序写入磁盘。
2、分区(partition)
(1)topic的多个分区的偏移量都是从0开始,不同分区的偏移量相互独立
(2)发布到topic的每条消息包括键值和时间戳,消息到达分区后,都会分配一个自增的偏移量,而原始的消息内容和分配的偏移量以及其他一些元数据信息最后都会存储到分区日志文件中。
(3)分区的原因
i)方便在集群中扩展
ii)可以提高并发,可以以partition为单位读写了
(4)分区的原则
指定了partition,则直接使用;
未指定partition但指定key,通过对key的value进行 hash出一个partition;
partition和key都未指定,使用轮询选出一个partition
3、副本(replication)
同一个partition可能会有多个replication,多个副本之间选出一个leader,只有leader可以同producer和consumer交互,其他replication从leader replication中复制数据
4、写入流程
(1)producer从zk节点找到该partition的leader发送消息
(2)leader将消息写入本地log
(3)从副本从leader pull消息,写入本地log后向leader发送ACK
(4)leader收到所有从副本的ACK后增加HW(high watemark,最后conmmit的offset)并向producer发送ACK
4.2、Broker保存消息
1、存储方式
物理上把topic分成一个或多个partition,每个parition物理上对应一个文件夹(文件夹存储该partition的所有消息和索引文件)
2、存储策略
无论消息是否被消费,kafka都会保留所有消息,两种策略可以删除旧数据
1)基于时间:log.retention.hours = 168
2)基于大小:log.retention.bytes = 1073741824
注意:kafka读取消息的时间复杂度为O(1),即与文件大小无关,所以这里删除过期文件与提高kafka性能无关。
3、kafka在ZK上的存储结构
注意:producer不再ZK中注册,消费者在ZK中注册
zk存储kafka结构
4.3、Kafka消费过程分析
消费者有高级API和低级API
1、Kafka消费模型
kafka采用拉去模型,由消费者自己记录消费状态,每个消费者相互独立地顺序读取每个分区的消息,消费者拉取的最大上线通过最高水位(watermark)控制,生产者最新写入的消息如果还没有达到备份数量,对消费者不可见。消费者可以按照任意的顺序消费消息。
2、高级API
(1)优点
写起来简单,不需要自行去管理offset,系统通过zk自行管理;
不需要管理分区,副本等情况,系统自动管理;
消费者断线会自动根据上一次记录在zk中的offset去接着获取数据(默认设置1分钟更新一下zk中存的offset);
可以使用group来区分对同一个topic的不同程序访问分离开来(不同的group记录不同的offset,这样不同程序读取同一个topic不会因为offset互相影响)。
(2)缺点
不能自行控制offset;
不能细化控制如分区,副本,zk等
3、低级API
(1)优点
能让开发者自己控制offset,可以从任意位置读取;
自行控制连接分区,对分区自定义进行负载均衡;
对zk的以来性格降低(如:offset不一定非要靠zk存储,可以自行存储offset到文件或者内存中)
(2)缺点
太过复杂,需要自行控制offset,连接哪个分区,找到分区leader等
4、消费者组
消费者组
消费者是以CG的方式工作,有一个或多个消费者组成一个组,共同消费一个topic;
每个分区在同一时间只能由group中的一个消费者读取,但是多个group可以同时消费这个partition;
如图,有一个包含三个消费者组成的group,其中一个consumer读取topic中的两个分区,另外两个consumer分别读取一个分区,这样,consumer可以通过水平扩展的方式同时读取大量的消息;
如果一个consumer失败了,那么其它的group成员会自动负载均衡读取之前失败的的消费者读取的分区。
5、消费方式
consumer采用pull拉模式从broker中读取数据,优点是由consumer自主控制消费消息的速率,防止拒绝服务以及网络堵塞和来不及处理的消息;缺点是如果kafka没有数据,消费者可能会陷入循环中,一直等待数据到达,为了避免这种情况,我们在拉请求中添加参数,允许消费者请求在等待数据集到达的“长轮询”中进行阻塞。
6、消费者组案例
(1)需求:测试同一个消费者组中的消费者,同一时刻只能有一个消费者消费
(2)案例操作

1、在hadoop04,hadoop05上修改 kakfa/config/consumer.properties配置文件中group.id属性为任意组名
group.id=kafkaG1
2、在hadoop04,hadoop05分别启动消费者
bin/kafka-console-consumer.sh --zookeeper hadoop03:2181 --topic testKafka --consumer.config config/consumer.properties
3、在hadoop05上启动生产者
bin/kafka-console-producer.sh --broker-list hadoop05:9092 --topic testKafka
>hello word
4、查看hadoop03,hadoop04的接收者,同一时刻只有一个消费者接收到消息

发表评论

您必须 登录 才能发表留言!