kafka学习笔记三:负载均衡

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值