kafka学习入门


https://www.cnblogs.com/coloz/p/10487679.html window下安装

E:
cd E:\tools\zookeeper3.4.12\bin
zkServer.cmd


set  JAVA_HOME=E:\tools\jdk1.8.0_171

E:
cd E:\tools\kafka_2.11-2.3.0\

.\bin\windows\kafka-server-start.bat .\config\server.properties


E:
cd E:\tools\kafka_2.11-2.3.0\bin\windows

kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic haha

创建生产者
kafka-console-producer.bat --broker-list localhost:9092 --topic haha

创建消费者
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic haha --from-beginning

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic haha --topic  topic_demo 

api https://kafka.apache.org/23/documentation.html#introduction
https://blog.csdn.net/wangzhanzheng/article/details/80801059

http://kafka.apachecn.org/quickstart.html 中文文档

修改topic kafka-topics.bat --zookeeper localhost:2181 --alter --topic topic_demo --partitions 2

1、消费者分组测试 消费时指定同一个group.id,那么同组内,只会有一个人消费。组与组之间没影响

同一个消费组的多个消费者相当于一个消费者去消费数据,提高了消费的效率。topic的分区,给消费顺序带来了一些麻烦,通过了解到kafka的底层原理后,在遇到问题时,就可能解释并解决。

增加分区可能提高并发

命令行下,一个consumer只能消耗一个topic,但是代码下可能可以消耗多个topic(估计代码封装)

kafka 每个 topic 对应一个 log file,单独的 log file 是磁盘顺序读写的,所以很快;
但是 topic 过多,由于每个 topic 是分开读写的,所以就变成随机读写了;
官方推荐是用大的 topic 来代替过多的小的 topic

kafka优化

E:
cd E:\tools\kafka_2.11-2.3.0\bin\windows

删除时,必须删zookeeper,再删topic
kafka-topics.bat --zookeeper localhost:2181 --delete --topic topic_demo


kafka-topics.bat -create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topic_demo


修改topic 
kafka-topics.bat --zookeeper localhost:2181 --alter --topic topic_demo --partitions 3

查看topic列表
kafka-topics.bat --list --zookeeper localhost:2181

kafka-topics.bat --describe --zookeeper localhost:2181 --topic topic_demo

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic topic_demo --consumer-property group.id=group1


彻底删除Kafka中的topic
1、删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录

2、Kafka 删除topic的命令是:

   ./bin/kafka-topics  --delete --zookeeper 【zookeeper server】  --topic 【topic name】

   如果kafaka启动时加载的配置文件中server.properties没有配置delete.topic.enable=true,那么此时的删除并不是真正的删除,而是把topic标记为:marked for deletion

   你可以通过命令:./bin/kafka-topics --zookeeper 【zookeeper server】 --list 来查看所有topic

  此时你若想真正删除它,可以登录zookeeper客户端:

  命令:./bin/zookeeper-client

  找到topic所在的目录:ls /brokers/topics

  找到要删除的topic,执行命令:rmr /brokers/topics/【topic name】即可,此时topic被彻底删除。

 另外被标记为marked for deletion的topic你可以在zookeeper客户端中通过命令获得:ls /admin/delete_topics/【topic name】,如果你删除了此处的topic,那么marked for deletion 标记消失

zookeeper 的config中也有有关topic的信息: ls /config/topics/【topic name】暂时不知道有什么用

 

总结:

彻底删除topic:

 1、删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录

  2、如果配置了delete.topic.enable=true直接通过命令删除,如果命令删除不掉,直接通过zookeeper-client 删除掉broker下的topic即可。
  
  尝试的是,必须删zookeeper,再删topic

3\
增加或减少patition时:

必定影响消费者的rebalance,生产者如果指定了patition,就不影响,没指定也需要rebalance;

一个patition只能被一个消费者线程消费, 如果只有一个patition,消费者有再多的节点都无用;如果有多个patition可以被一个消费者节点上的多个线程消费,或者被多个消费者消费,主要看patition和消费者数量,消费者数量N,patition数量为M

N

N=M:每个节点上有1个消费线程

N>M:M个节点上有1个消费线程,剩余消费节点没有消费线程

4、可以设置消息大小
5、出重复消费

block.on.buffer.full = true
acks = all
retries = MAX_VALUE
max.in.flight.requests.per.connection = 1  限制客户端在单个连接上能够发送的未响应请求的个数。设置此值是1表示kafka broker在响应请求之前client不能再向同一个broker发送请求。注意:设置此参数是为了避免消息乱序.默认为5。

retry.backoff.ms 默认为100L,发送重试的间隔
使用KafkaProducer.send(record, callback)
callback逻辑中显式关闭producer:close(0) 

unclean.leader.election.enable=false 消息丢失太多的follower不能成为leader

replication.factor = 3 
min.insync.replicas = 2
replication.factor > min.insync.replicas

enable.auto.commit=false

然后就是producer发送消息一定要使用带回调函数的方法,并对发送失败的情况进行处理。

同时写consumer程序的时候先消费再提交;

buffer.memory producer 可以使用的最大内存(默认32 * 1024 * 1024L),如果超过这个值,取决于block.on.buffer.full的配置,看是阻塞还是抛出异常

max.request.size 一个请求的最大长度,默认为1 * 1024 * 1024(1MB),长度计算

timeout.ms 默认是30 * 1000,新版的话是叫做request.timeout.ms参数

6、性能测试 本人未测

https://www.cnblogs.com/smartloli/p/10093838.html

向一个拥有6个分区、1个副本的Topic中,发送500万条消息记录时,随着线程数的增加,每秒发送的消息记录会逐渐增加。在线程数为25时,每秒发送的消息记录达到最佳值,随后再增加线程数,每秒发送的消息记录数反而会减少。

从测试结果来看,分区数越多,单线程生产者的吞吐量越小

副本数越多,吞吐量越小

增加Kafka Broker数量,吞吐量会增加。
,使用异步模式发送消息数据,比使用同步模式发送消息数据,吞吐量是同步模式的3倍左右。
发送的消息随着批处理大小增加而增加。当批处理大小增加到3000~5000时,吞吐量达到最佳值。而后再增加批处理大小,吞吐量的性能会下降。

随着消息长度的增加,每秒所能发送的消息数量逐渐减少(nMsg/sec)。但是,每秒发送的消息的总大小(MB/sec),会随着消息长度的增加而增加。

随着线程数的增加,每秒读取的消息记录会逐渐增加。在线程数与消费主题的分区相等时,吞吐量达到最佳值。随后,再增加线程数,新增的线程数将会处于空闲状态,对提升消费者程序的吞吐量没有帮助。

随着线程数的增加,每秒读取的消息记录会逐渐增加。在线程数与消费主题的分区相等时,吞吐量达到最佳值。随后,再增加线程数,新增的线程数将会处于空闲状态,对提升消费者程序的吞吐量没有帮助。

当分区数增加时,如果线程数保持不变,则消费者程序的吞吐量性能会下降

副本数对消费者程序的吞吐量影响较小,消费者程序是从Topic的每个分区的Leader上读取数据的,而与副本数无关。 

7、
Kafka的Message存储采用了分区(Parition)、分段(segment)和稀疏索引这几个手段来达到高效发布和随机读取

每个Topic包含一个或多个Parition;Parition是物理存储上的概念,创建Topic时可指定Parition数量。每个Parition对应一个存储文件夹,文件夹下存储该Parition所持有的消息数据和索引文件。Topic进行分区划分的主要目的是出于性能方面的考虑,Kafka尽量的使所有分区均匀的分布到集群所有的节点上而不是集中在某些节点上,另外主从关系也尽量均衡,这样每个节点都会担任一定比例的分区的Leader。每个Parition是一个有序的队列,每条消息在Parition中拥有一个offset

https://blog.csdn.net/ranjio_z/article/details/80013472

你可能感兴趣的:(kafka)