1. 是一个分布式消息系统,具有高水平扩展和高吞吐量, Apache Flume,Apache Strom, Spark elasticsearch 都支持kafka集成
2. AMQP协议
producer ——push——> broker <——pull—— consumer
kafka支持客户端语言: java c c++ erlang .net perl php python ruby go javascript
3.kafka概念
主题(Topic):一个主题类似新闻的体育,娱乐,教育分类概念,在实际业务中通常一个业务一个主题;
分区(Partition):一个Topic的消息数据是按照多个分区组织的,分区是kafka消息队列的最小单位,一个分区可以看成一个FIFO队列
4.zookeeper集群搭建
软件环境
Linux服务器 2*n+1台
JDK1.7+
zookeeper3.4.6+
布置配置zk: 配置dataDIr,以及日志输出路径和集群设置感知, 创建dataDIr指向路劲创建myid文件
清理日志脚本设置成定时任务执行
星期天的0点0分执行 0 0 * * 0 sh home/program/zookeeper/cleanup.sh
crontab -l
5.Kafka集群搭建
./kafka-server-start.sh -daemon ../config/server.properties
6.kafka消费者编程模型
分区消费模型
main()
获取分区的size
for index =0 to size
create thread(or process) consumer(index)
第inde个线程(进程)
consumer(index)
创建到kafka broker的连接 KafkaClient(host,port)
指定消费参数构建consumer: SimpleConsumer(topic,partition)
设置消费offset: consumer.seek(offset,0)
while True
消费指定topic第index个分区的数据
处理
记录当前的消息的offset
提交当前的offset(可选)
组消费模型
main()
设置需要创建的流数N
for index=0 to N
create thread consumer(index)
第index个线程
consumer(index)
创建到kafka broker的连接: KafkaClient(host,port)
指定消费参数构建consumer: SimpleConsumer(topic,partions)
设置从头消费还是从最新消费(smallest 或largest)
while True
从指定topic的第index个流获取数据
处理
(offset会自动提交zookeeper,无需我们操作)
两种消费模型对比
分区消费模型更加灵活但是:
1)需要自己处理各种异常情况
2)需要自己管理offset(以实现消息传递的其他语义)
组消费模型更加简单,但是不灵活:
1) 不需要自己处理异常情况,不需要自己管理offset
2) 只能实现kafka默认的最少一次消息传递语义
7.kafka消费者的python和java客户端实现
Python客户端实例讲解
Python客户端参数调优
fetch_size_byte:从服务器获取单包大小
buffer_size: kafka客户端缓冲区大小
Group:分组消费时的组名
auto_commit:offset是否自动提交
Java客户端实例讲解
Java客户端参数调优
kafka生产者编程模型
同步生产模型
一直重新发送,一直等到kafka回应消息,才发送下一条消息
异步生产模型:
message.send.max.retries:发送失败重试次数;
retry.backoff.ms:未接到确认,认为发送失败的时间
producer.type: 同步发送或者异步发送
batch.num.message:异步发送时,累计最大的消息数;
queue.buffering.max.ms:异步发送时,累计最大时间.
main()
创建到kafka broker 的链接 : kafkaClient(host,port)
选择或定义生产者负载均衡算法 partitioner
设置生产者参数
根据负载均衡算法和设置生产者参数构造Producer对象
While True
getMessage:从上游获取一条消息
按照kafka要求的消息格式构造kafka消息
根据分区算法得到分区
发送消息
处理异常