一、任务描述
本实验任务主要完成基于ubuntu环境掌握Kafka基本操作命令的工作。通过完成本实验任务,要求学生熟练掌握Kafka基本操作命令,为后续实验的开展奠定Kafka平台基础,也为从事大数据平台运维工程师、大数据技术支持工程师等岗位工作奠定夯实的技能基础。
二、任务目标
1、掌握基于Kafka基本操作命令
三、任务环境
Ubuntu(三台节点:mater,slave1,slave2)、Zookeeper3.4.5、Kafka2.9.2
四、任务分析
Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。
一个Topic可以认为是一类消息,每个topic将被分成多个partition(区),每个partition在存储层面是append log文件。任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型数字,它是唯一标记一条消息。它唯一的标记一条消息。kafka并没有提供其他额外的索引机制来存储offset,因为在kafka中几乎不允许对消息进行“随机读写“。
kafka和JMS(Java Message Service)实现(activeMQ)不同的是:即使消息被消费,消息仍然不会被立即删除.日志文件将会根据broker中的配置要求,保留一定的时间之后删除;比如log文件保留2天,那么两天后,文件会被清除,无论其中的消息是否被消费.kafka通过这种简单的手段,来释放磁盘空间,以及减少消息消费之后对文件内容改动的磁盘IO开支。
对于consumer而言,它需要保存消费消息的offset,对于offset的保存和使用,有consumer来控制;当consumer正常消费消息时,offset将会”线性”的向前驱动,即消息将依次顺序被消费.事实上consumer可以使用任意顺序消费消息,它只需要将offset重置为任意值。
kafka集群几乎不需要维护任何consumer和producer状态信息,这些信息有zookeeper保存;因此producer和consumer的客户端实现非常轻量级,它们可以随意离开,而不会对集群造成额外的影响。
partitions的设计目的有多个.最根本原因是kafka基于文件存储.通过分区,可以将日志内容分散到多个server上,来避免文件尺寸达到单机磁盘的上限,每个partiton都会被当前server(kafka实例)保存;可以将一个topic切分多任意多个partitions,来消息保存/消费的效率.此外越多的partitions意味着可以容纳更多的consumer,有效提升并发消费的能力。
Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于”round-robin”方式或者通过其他的一些算法等。
本质上kafka只支持Topic.每个consumer属于一个consumer group;反过来说,每个group中可以有多个consumer.发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费。
如果所有的consumer都具有相同的group,这种情况和queue模式很像;消息将会在consumers之间负载均衡。
如果所有的consumer都具有不同的group,那这就是发布-订阅;消息将会广播给所有的消费者。
在kafka中,一个partition中的消息只会被group中的一个consumer消费;每个group中consumer消息消费互相独立;我们可以认为一个group是一个”订阅”者,一个Topic中的每个partions,只会被一个”订阅者”中的一个consumer消费,不过一个consumer可以消费多个partitions中的消息.kafka只能保证一个partition中的消息被某个consumer消费时,消息是顺序的.事实上,从Topic角度来说,消息仍不是有序的。
kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息。
我们的任务是:
学会使用Kafka基本操作命令。
五、 任务实施
步骤1、Kafka基本操作命令
进入到zookeeper bin文件下,通过命令【./zkServer.sh start】来启动服务。如图1所示。
图1 启动Zookeeper集群
利用【./zkServer.sh status】查看Zookeeper节点状态。如图2所示。
图2 master查看Zookeeper节点状态
进入到kafka bin文件下,通过命令【./kafka-server-start.sh ../config/server.properties】来启动服务。如图3所示。
图3 启动Kafka
查看是否启动。在各个节点重启终端,执行【jps】命令,可以看到新启动进程。如图4所示。
图4 master查看进程
在主节点master创建topic。执行【./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test】命令。如图5所示。
图5 创建topic
♥ 温馨提示
name | Value |
–create: | 指定创建topic动作。 |
–topic: | 指定新建topic的名称。 |
–zookeeper: | 指定kafka连接zk的连接url,该值和server.properties文件中的配置项{zookeeper.connect}一样。 |
–config: | 指定当前topic上有效的参数值。 |
–partitions: | 指定当前创建的kafka分区数量,默认为1个。 |
–replication-factor: | 指定每个分区的复制因子个数,默认1个。 |
在主节点master查看所有topic。执行【./kafka-topics.sh --list --zookeeper localhost:2181】 命令。如图6所示。
图6 查看所有topic
在主节点master查看指定topic的详细信息。执行【./kafka-topics.sh --list --zookeeper localhost:2181 】命令。如图7所示。
图7 查看指定topic
♥ 温馨提示
name | Value |
–describe | 指定是展示详细信息命令。 |
–zookeeper | 指定kafka连接zk的连接url,该值和server.properties文件中的配置项{zookeeper.connect}一样。 |
–topic | 指定需要展示数据的topic名称。 |
创建生产者并向test主题发送消息。执行【/simple/kafka/bin# ./kafka-console-producer.sh --broker-list localhost:9092 --topic test】命令。如图8所示。
图8 创建生产者
新开启一个终端创建消费者者并消费消息。执行【./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning】命令。如图9所示。
图9 创建消费者
新开启一个终端查看topic某分区偏移量最大(小)值,time为-1时表示最大值,time为-2时表示最小值。执行【./kafka-run-class.sh kafka.tools.GetOffsetShell --topic test --time -1 --broker-list localhost:9092 --partitions 0】命令。如图10所示。
图10 查看偏移量
在主节点master增加topic分区数。执行【./kafka-topics.sh --zookeeper localhost:2181 --alter --topic test --partitions 10】命令。如图11所示。
图11 增加topic分区数
♥ 温馨提示
Kafka分区数量只允许增加,不允许减少。
在主节点master删除topic,慎用,只会删除zookeeper中的元数据,消息文件须手动删除。执行【./kafka-topics.sh --delete --zookeeper localhost:2181 --topic test】命令。如图12所示。
图12 删除topic
♥ 温馨提示
默认情况下,删除是标记删除,没有实际删除这个Topic;如果运行删除Topic,两种方式:
方式一:通过delete命令删除后,手动将本地磁盘以及zk上的相关topic的信息删除即可
方式二:配置vim server.properties文件,给定参数delete.topic.enable=true,重启kafka服务,此时执行delete命令表示允许进行Topic的删除
♥ 知识链接
每一个分区(partition)都是一个顺序的、不可变的消息队列,并且可以持续的添加。分区中的消息都被分了一个序列号,称之为偏移量(offset),在每个分区中此偏移量都是唯一的。Kafka集群保持所有的消息,直到它们过期,无论消息是否被消费了。实际上消费者所持有的仅有的元数据就是这个偏移量,也就是消费者在这个log中的位置。 这个偏移量由消费者控制。 一个消费者的操作不会影响其它消费者对此log的处理。 Kafka中采用分区的设计有几个目的。可以处理更多的消息,不受单台服务器的限制。Topic拥有多个分区意味着它可以不受限的处理更多的数据。