安装Kafka
1.更新系统
sudo yum install epel-release -y
sudo yum update -y
2.安装jdk
sudo yum install -y java-1.8.0-openjdk
java -version
3.配置java环境变量
查看java环境变量
echo $JAVA_HOME
配置环境变量
echo "JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")" | sudo tee -a /etc/profile
配置生效
source /etc/profile
4.安装Kafka
wget https://mirrors.bfsu.edu.cn/apache/kafka/2.7.1/kafka_2.12-2.7.1.tgz
tar -xzf kafka_2.12-2.7.1.tgz
创建一个文件的软连接,这样可以方便进行kafka的升级,这步暂时忽略
sudo ln -s /opt/kafka_2.12-2.4.0 /opt/kafka
进入到kafka目录下,启动kafka,启动kafka之前得先启动zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
后台启动zookeeper
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
打开另一个终端会话启动kafka
bin/kafka-server-start.sh config/server.properties
后台启动kafka
sh bin/kafka-server-start.sh config/server.properties 1>/dev/null 2>&1 &
nohup bin/kafka-server-start.sh config/server.properties 1>/dev/null 2>&1 &
nohup bin/kafka-server-start.sh config/server.properties >/dev/null 2>&1 &
bin/kafka-server-start.sh -daemon config/server.properties
Topic命令
创建一个名为“test”的Topic,只有一个分区和一个备份
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
创建好之后,可以通过运行以下命令,查看已创建的topic信息
> bin/kafka-topics.sh --describe --topic test --bootstrap-server localhost:9092
Topic: test PartitionCount: 1 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0
增加topic的 partition 数
bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic test --partitions 5
查看 topic 指定分区 offset 的最大值或最小值
time 为 -1 时表示最大值,为 -2 时表示最小值:
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic test --time -1 --broker-list 127.0.0.1:9092 --partitions 0
查看所有topic
bin/kafka-topics.sh --zookeeper localhost:2181 --list
删除topic
bin/kafka-topics.sh --zookeeper localhost:2181 --topic test --delete
消息命令
发送消息
> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
This is a message
This is another message
消费消息
从头开始
> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
This is a message
This is another message
从尾部开始取数据,必需要指定分区:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --offset latest --partition 0
指定分区
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --offset latest --partition 0
取指定个数
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --offset latest --partition 0 --max-messages 1
删除zookeeper中的topic信息
rmr /brokers/topics/kfk_test
rmr /config/topics/kfk_test
rmr /admin/delete_topics/kfk_test
rmr /consumers/kfk_test-group
删除topic数据相关的目录
rm -rf /var/local/kafka/data/kfk_test*
停止kafka服务,先后
bin/kafka-server-stop.sh
bin/zookeeper-server-stop.sh
消费组命令
查看消费组列表
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
指定 Group消费
bin/kafka-console-consumer.sh --bootstr-server localhost:9092 --topic test -group my-group --from-beginning
查看 Group 详情
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group my-group --describe
删除 Group 中 Topic
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group my-group --topic test --delete
删除 Group
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group my-group --delete
平衡 leader
bin/kafka-preferred-replica-election.sh --bootstrap-server localhost:9092
自带压测工具
bin/kafka-producer-perf-test.sh --topic test --num-records 100 --record-size 1 --throughput 100 --producer-props bootstrap.servers=localhost:9092
python生产消息
def sendmsg():
from kafka import KafkaProducer
from kafka.errors import KafkaError
# data必须是str
producer = KafkaProducer(bootstrap_servers=['192.168.16.128:9092'],value_serializer=lambda m: json.dumps(m).encode('utf-8'))
future = producer.send('test', value=data,partition=0)
try:
record_metadata = future.get(timeout=10)
except KafkaError as e:
print(e)
return {'code' : 406,'msg':'KafkaServer请求发送失败'}
else:
return 'success'
python消费消息
def consumermsg():
from kafka import KafkaConsumer
'''auto_offset_reset的作用,是在你的 group_id 第一次运行,还没有 offset(偏移量,相当于索引吧) 的时候,
给你设定初始的 offset,意思是会返回所有的数据,而一旦你这个 group 已经有 offset 了,
那么auto_offset_reset这个参数就不会再起作用了,消费者会从最新的offset开始读数据,也就是最新的数据。
Topic 里面有100个数据,你设置了一个全新的 group_id 为test2。auto_offset_reset设置为 earliest。
那么当你的消费者运行的时候,Kafka 会先把你的 offset 设置为0,然后让你从头开始消费的,就是会把所有数据读一遍。
Topic 里面有100个数据,你设置了一个全新的 group_id 为test3。auto_offset_reset设置为 latest。
那么当你的消费者运行的时候,Kafka 会先把你的 offset 设置为100,Kafka 不会给你返回任何数据,
前100条数据的状态设置为已经被你消费的状态,消费者看起来就像卡住了一样。'''
consumer = KafkaConsumer('test',
bootstrap_servers=['192.168.16.128:9092'],
group_id='my-group',
auto_offset_reset='latest',
value_deserializer=lambda m: json.loads(m.decode('utf-8'))
)
for message in consumer:
print(message.value)