关于使用kafka的个人总结

来源:互联网 发布:监控设备域名 编辑:程序博客网 时间:2024/06/05 06:59

    本篇文章算是对几个月工作的一个总结吧,接触了几个月的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