本篇文章算是对几个月工作的一个总结吧,接触了几个月的kafka和flume,感觉自己也只能算是了解kafka的阶段,接下来也打算深入研究下kafka的原理,下面写的算是对工作中使用到的kafka方面的东西做个总结吧!
kafka概述
(有空可以浏览一下http://orchome.com)
当前kafka版本为0.10.0.0。
关于Kafka需要了解的几个关键词:
①Producer
发布消息的对象(flume)
②Consumer
订阅发布的消息并处理消息的对象(spark)
③Broker
Producer把生产的消息“推”到Broker中,Consumer可以从Broker中订阅一个 或多个topic,并从Broker中“拉”消息进行消费
④Topic
Kafka中把消息分门别类,每一类消息是一个topic
⑤Partition
Kafka把每个Topic分成多个partition,每个partition中的消息是有序的,partition中的每条消息都会被分配一个有序的id(offset)
Topic & Partition
1.kafka把一个topic分为1个或以上的partition,每个partition在物理上对应一个文件夹,
文件夹中存储的是该partition的所有消息以及一个索引文件。(以第一个消息的offset命名)
2.每一个分区都是一个顺序的消息队列,并且可以持续的添加。分区中的每条消息都被分配了一个序列号,即偏移量(64字节的offset),在每个分区中的偏移量都是唯一的
3.在发送一条消息时,可以指定这条消息的key,producer根据这个key和partition机制来判断将这条消息发送到哪个parition(通过实现kafka.producer.Partitioner接口)。key相同的消息会被发送并存储到同一个partition里
4.每一条消息被发送到broker时,会根据分区的规则选择被存储到哪一个partition在创建topic时可以在config/server.properties中指定这个partition的数量
offset
1.消费者所持有的仅有的元数据就是这个偏移量,也就是消费者在这个log中的位置。 这个偏移量由消费者控制。
2.当消费者消费消息的时候,偏移量会线性的增加。实际偏移量由消费者控制,消费者可以将偏移量重置为之前的一个偏移量,重新读取消息。
具体使用:
开启kafka前先要开启zookeeper
1.bin/zkServer.sh start
2.开启kafka server
bin/kafka-server-start config/server.properties
3.测试时可以先开kafka的producer
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test(--broker-list是kafka所在主机)
再开启kafka的consumer
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
接着就可以在producer中发送消息
Kafka配置文件:
几个关键配置:
broker.id=0
listeners=PLAINTEXT://172.16.49.173:9092
port=9092
log.dirs=kafka-logs
zookeeper.connect=localhost:2181
listeners一定要配置成为IP地址;如果配置为localhost或服务器的hostname,在使用java发送数据时可能会抛出异常:org.apache.kafka.common.errors.TimeoutException: Batch Expired 。因为在没有配置advertised.host.name 的情况下,Kafka并没有广播我们配置的host.name,而是广播了主机配置的hostname。远端的客户端并没有配置 hosts,所以自然是连接不上这个hostname的,也可以在远端客户端配置hosts
Zookeeper.connect中zk集群地址以“,”分隔
与单机的配置差不多,只是listeners的配置需要改为集群服务的IP地址和采用的端口。
关于kafka的监控:
可以使用kafkaOffSetMonitor
(https://github.com/quantifind/KafkaOffsetMonitor/releases/download/v0.2.1/KafkaOffsetMonitor-assembly-0.2.1.jar)
将KafkaOffsetMonitor-assembly-0.2.0.jar上传到服务器后,可以新建一个脚本用于启动该应用。脚本内容如下:
java -cp KafkaOffsetMonitor-assembly-0.2.0.jar
com.quantifind.kafka.offsetapp.OffsetGetterWeb
--zk zk1:2181,zk2:2181,zk3:2181
--port 8088
--refresh 10.seconds
--retain 2.days
zk集群
Consumer消费情况
(左上角显示的是topic生产速率,右上角是consumer消费速率,蓝色的表示当前Topic中的Message数目,灰色的表示当前Consumer消费的offset位置,红色的表示蓝色灰色的差值,即当前Consumer滞后于Producer的message数目)
这里有一个坑,默认情况下Producer往一个不存在的Topic发送message时会自动创建这个Topic。由于在这个封装中,有同时传递message和topic的情况,如果调用方法时传入的参数反了,将会在Kafka集群中自动创建Topic。在正常情况下,应该是先把Topic根据需要创建好,然后Producer往该Topic发送Message,最好把Kafka这个默认自动创建Topic的功能关掉。
如果真的不小心创建了多余的Topic,在删除时,会出现“marked for deletion”提示,只是将该topic标记为删除,使用list命令仍然能看到。如果需要调整这两个功能的话,在server.properties中配置如下两个参数:
auto.create.topics.enable 默认值true
delete.topic.enable 默认值false