Kafka具有消费分组的概念,一个Topic的一个partition只能由一个Consumer group中的一个Consmer消费,概念似乎很容易理解,那么我们来做个测试看
1、创建一个Topic
使用一个已经创建好的Topic,
[root@node1 bin]# ./kafka-topics.sh --describe --zookeeper localhost:2181 --topic scripts
Topic:scripts PartitionCount:4 ReplicationFactor:1 Configs:
Topic: scripts Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: scripts Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: scripts Partition: 2 Leader: 0 Replicas: 0 Isr: 0
Topic: scripts Partition: 3 Leader: 0 Replicas: 0 Isr: 0
[root@node1 bin]#
这个Topic有4个分区
2、开发Consumer
这里我们使用python来开发,将使用kafka-python包,这个包的安装方法可以参考我的另一篇博客:kfka学习笔记二:使用Python操作Kafka
consumer.py
from kafka import KafkaConsumer
import time
import datetime
#定义topic name
topic_="scripts"
#定义consumer group
consumer_group_="consumer-20171017"
#定义一个函数用来输出格式化的信息,增加了时间提示
def log(str):
dd = datetime.datetime.now()
#t = time.strftime(r"%Y-%m-%d_%H-%M-%S",time.localtime())
print("[%s]%s"%(dd,str))
print('start listen %s:%s' %(topic_,consumer_group_))
#创建consumer,链接到192.168.120.11:9092
consumer=KafkaConsumer(topic_,group_id=consumer_group_,bootstrap_servers=['192.168.120.11:9092'])
#接收消息并输出,这里会阻塞
for msg in consumer:
recv = "%s:%s:%d:%d: key=%s value=%s" %(consumer_group_,msg.topic,msg.partition,msg.offset,msg.key,msg.value)
log(recv)
3、开发Producer
producer.py代码,这个producer会根据命令参数里面指定的路径,把这个路径下的文件名发送到指定的topic
#-*- coding: utf-8 -*-
from kafka import KafkaProducer
import json
import os
import datetime
from sys import argv
#定义topic
topic_="scripts"
#创建链接到192.168.120.11:9092这个端口的producer
producer = KafkaProducer(bootstrap_servers='192.168.120.11:9092')
#定义带时间格式的日志函数
def log(str):
t = datetime.datetime.now()
#t = time.strftime(r"%Y-%m-%d_%H-%M-%S",time.localtime())
print("[%s]%s"%(t,str))
#根据路径遍历这个路径下的所有文件包括目录,发送到指定的topic,并且在屏幕上输出发送的文件名,以及文件数量
def list_file(path):
dir_list = os.listdir(path);
i=0
for f in dir_list:
producer.send(topic_,f)
producer.flush()
log('send[%s]: %s' % (topic_,f))
i = i +1
log("%s send ok" % (str(i)))
list_file(argv[1])
producer.close()
log('done')
4、测试
在上面第一步里面可以看到script这个topic有4个partition,为何要启动5个Consumer呢?后面会讲到
1、启动5个Consumer
consumer.py 在192.168.120.11 /opt/app/python_app 这个目录下面
[root@node1 python_app]# pwd
/opt/app/python_app
[root@node1 python_app]# ll
总用量 32
-rw-r--r--. 1 root root 1116 9月 23 15:48 bs4_demo.py
drwxr-xr-x. 4 root root 4096 9月 23 03:45 consumer
-rw-r--r--. 1 root root 557 9月 24 05:18 consumer.py
-rw-r--r--. 1 root root 705 9月 23 15:08 pachong.py
drwxr-xr-x. 4 root root 4096 9月 23 04:21 producer
-rw-r--r--. 1 root root 441 9月 23 23:13 script.py
-rw-r--r--. 1 root root 345 9月 23 21:33 test1.py
-rw-r--r--. 1 root root 602 9月 23 05:56 thread.py
[root@node1 python_app]#
因此只要使用xShell打开5个窗口连接到192.168.120.11,分别启动5个consumer就可以,因为是同一个代码,因此启动后就会有5个Consumer链接到script这个Topic,并且这5个Consumer都属于consumer-20171017这一个 Consumer-group ,这个关系很重要。
2、启动Producer
producer.py 在192.168.120.12 /opt/app/python_app 这个目录下面,
假如我们用/opt/package/kafka