Kafka
什么是消息队列?
消息和队列的组合体,就叫消息队列,消息指的就是我们在这一段生产的数据信息,已经消费那一端产生的消费数据信息,而中间传输的管道就叫队列,全部放在一起就组成了消息队列,消息队列分为两种类型,点对点,发布订阅两种,功能可以实现数据的峰值处理,数据解耦,数据的缓存,数据的异步通信等。
Kafka简介
Kafka指的就是消息队列,也叫消息中间件,主要是做数据的传输使用,对接生产者和消费者两端数据信息,然后获取数据保存数据,将数据按照管道进行传输。
三大特点
- 高吞吐量
可以满足每秒百万级别消息的生产和消费————生产消费
- 持久性
有一套完善的消息存储机制,确保数据的高效安全的持久化————中间存储
- 分布式
基于分布式的扩展和容错机制;kafka的数据都会复制到几台服务器上。当某一台故障失效时,生产者和消费者转而使用其他的机器——整体
- 健壮性
核心概念
producer(生产者):表示数据生产的一端,产生数据到Kafka集群;
consumer(消费者):表示从Kafka集群中;拉去数据进行数据消费处理;
Broker(节点服务):一个Broker表示一个Kafka的服务节点(Broker是可以用ID表示的,但是不重复);
Topic(主题):创建在Broker下面的存储对象,类似于表的意思,可以创建N多个Topic;
Partition(分区):存在Topic下面的分区目录,主要是保存分区之间的数据;
Message(数据):每条消息信息,分别存在每个Partition中。
Kafka 的基本操作
topic的操作
topic用于存储各种类型的数据,关于topic的操作脚本:Kafka-topics.sh
创建topic
kafka-topics.sh --create \
--topic hadoop \ ##指定要创建的topic的名称
--zookeeper localhost:2181/kafka \ ##指定kafka关联的zk地址
--partitions 3 \ ##指定改topic的分区个数
--replication-factor 3 ##指定副本因子
注意:指定副本因子的时候,不能大于broker实例个数,否则报错!
查看topic的列表
kafka-topics.sh --list --zookeeper localhost:2181/kafka hadoop
查看每一个topic的信息
kafka-topics.sh --describe --topic hadoop --zookeeper localhost:2181/kafka
Topic: hadoop PartitionCount: 3 ReplicationFactor: 3 Configs:
Topic: hadoop Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: hadoop Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
Topic: hadoop Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
Partition:当前topic对应的分区编号
Replicas:副本因子,当前kafka对应的partition所在的broker实例的broker.id的列表
Leader:该partition的所有副本中的leader领导者,处理所有kafka该partition读写请求
ISR:该partition的存活的副本对应的broker实例的broker.id的列表
修改一个topic
kafka-topics.sh --alter --topic hadoop --partitions 4 --zookeeper localhost:2181/kafka
注意:partition个数只能增加,不能减少;
删除一个topic
kafka-topics.sh --delete --topic hadoop --zookeeper localhost:2181/kafka
列举所有topic
kafka-topics.sh --list --zookeeper localhost:2181/kafka
生产数据
kafka-console-producer.sh \
--topic hadoop \
--broker-list localhost1:9092,host2:9092,host3:9092
消费数据
kafka-console-consumer.sh --topic hadoop --bootstrap-server localhost1:9092,host2:9092,host3:9092
如果在生产者生产的时候没有启动消费者,是没有数据的,原因在于消费者后于生产者启动,在消费者启动之前生产者生产的数据不能直接获取。
如果想要获取消费者启动之前生产的数据,可以添加一个参数–from-beginning。
kafka-console-consumer.sh --topic hadoop --bootstrap-server localhost1:9092,host2:9092,host3:9092 --from-beginning
注意:如果发送数据接收不到,那么可能是你的集群内部传输有问题,需要修改配置文件server.properties(每台机器都需要改成自己的ip地址)
advertised.listeners=PLAINTEXT://hostname:9092
kafka的数据消费总结
消费者组和分区之间的关系:消费者组在消费数据的时候,同一时间不能由多个消费者同时消费一个分区的数据,可以允许不同消费者组同一时间有多个消费者共同消费一个分区的数据,因为消费者组是互相不影响的,并且我们在消费的过程中需要设置合理的消费者数量,最好和分区数相同。
说明:生产者生产数据的方式是随机生成的,数据随机分发每个分区内,没有任何的原则(早期的时候是使用轮询的方式来分发数据,新版中是随机但是可以改。)