在kafkaconfig⽬录下⾯有3个配置⽂件参数说明(producer.properti。。。
(1).producer.properties:⽣产端的配置⽂件
#指定kafka节点列表,⽤于获取metadata,不必全部指定
#需要kafka的服务器地址,来获取每⼀个topic的分⽚数等元数据信息。
metadata.broker.list=kafka01:9092,kafka02:9092,kafka03:9092
#⽣产者⽣产的消息被发送到哪个block,需要⼀个分组策略。
#指定分区处理类。默认kafka.producer.DefaultPartitioner,表通过key哈希到对应分区
#partitioner.class=kafka.producer.DefaultPartitioner
#⽣产者⽣产的消息可以通过⼀定的压缩策略(或者说压缩算法)来压缩。消息被压缩后发送到broker集,
#⽽broker集是不会进⾏解压缩的,broker集只会把消息发送到消费者集,然后由消费者来解压缩。
#是否压缩,默认0表⽰不压缩,1表⽰⽤gzip压缩,2表⽰⽤snappy压缩。
#压缩后消息中会有头来指明消息压缩类型,故在消费者端消息解压是透明的⽆需指定。
陈道明的第二任妻子#⽂本数据会以1⽐10或者更⾼的压缩⽐进⾏压缩。
#指定序列化处理类,消息在⽹络上传输就需要序列化,它有String、数组等许多种实现。
serializer.class=kafka.serializer.DefaultEncoder
#如果要压缩消息,这⾥指定哪些topic要压缩消息,默认empty,表⽰不压缩。
#如果上⾯启⽤了压缩,那么这⾥就需要设置
#pics=
#这是消息的确认机制,默认值是0。在⾯试中常被问到。
#producer有个ack参数,有三个值,分别代表:
#(1)不在乎是否写⼊成功;
#(2)写⼊leader成功;
#(3)写⼊leader和所有副本都成功;
#要求⾮常可靠的话可以牺牲性能设置成最后⼀种。
#为了保证消息不丢失,⾄少要设置为1,也就
#是说⾄少保证leader将消息保存成功。
#设置发送数据是否需要服务端的反馈,有三个值0,1,-1,分别代表3种状态:
#0: producer不会等待broker发送ack。⽣产者只要把消息发送给broker之后,就认为发送成功了,这是第1种情况;
姜贞羽脖子怎么了#1: 当leader接收到消息之后发送ack。⽣产者把消息发送到broker之后,并且消息被写⼊到本地⽂件,才认为发送成功,这是第⼆种情况;#-1: 当所有的follower都同步消息成功后发送ack。不仅是主的分区将消息保存成功了,#⽽且其所有的分区的副本数也都同步好了,才会被认为发动成功,这是第3种情况。
#broker必须在该时间范围之内给出反馈,否则失败。
#在向producer发送ack之前,broker允许等待的最⼤时间,如果超时,
#broker将会向producer发送⼀个error ACK.意味着上⼀次消息因为某种原因
#未能成功(⽐如follower未能同步成功)
request.timeout.ms=10000
#⽣产者将消息发送到broker,有两种⽅式,⼀种是同步,表⽰⽣产者发送⼀条,broker就接收⼀条;
#还有⼀种是异步,表⽰⽣产者积累到⼀批的消息,装到⼀个池⼦⾥⾯缓存起来,再发送给broker,
#这个池⼦不会⽆限缓存消息,在下⾯,它分别有⼀个时间限制(时间阈值)和⼀个数量限制(数量阈值)的参数供我们来设置。
#⼀般我们会选择异步。
#同步还是异步发送消息,默认“sync”表同步,"async"表异步。异步可以提⾼发送吞吐量,
#也意味着消息将会在本地buffer中,并适时批量发送,但是也可能导致丢失未发送过去的消息
#在async模式下,当message被缓存的时间超过此值后,将会批量发送给broker,
#默认为5000ms
#此值和ssages协同⼯作.
queue.buffering.max.ms = 5000
#异步情况下,缓存中允许存放消息数量的⼤⼩。
#在async模式下,producer端允许buffer的最⼤消息量
#⽆论如何,producer都⽆法尽快的将消息发送给broker,从⽽导致消息在producer端⼤量沉积
#此时,如果消息的条数达到阀值,将会导致producer端阻塞或者消息被抛弃,默认为10000条消息。
queue.ssages=20000
#如果是异步,指定每次批量发送数据量,默认为200
ssages=500
#在⽣产端的缓冲池中,消息发送出去之后,在没有收到确认之前,该缓冲池中的消息是不能被删除的,
#但是⽣产者⼀直在⽣产消息,这个时候缓冲池可能会被撑爆,所以这就需要有⼀个处理的策略。
#有两种处理⽅式,⼀种是让⽣产者先别⽣产那么快,阻塞⼀下,等会再⽣产;另⼀种是将缓冲池中的消息清空。
#当消息在producer端沉积的条数达到"queue.sages"后阻塞⼀定时间后,
#队列仍然没有enqueue(producer仍然没有发送出任何消息)
#此时producer可以继续阻塞或者将消息抛弃,此timeout值⽤于控制"阻塞"的时间
#-1: 不限制阻塞超时时间,让produce⼀直阻塞,这个时候消息就不会被抛弃
#0: ⽴即清空队列,消息被抛弃
新车购置税怎么算
#当producer接收到error ACK,或者没有接收到ACK时,允许消息重发的次数
#因为broker并没有完整的机制来避免消息重复,所以当⽹络异常时(⽐如ACK丢失)
#有可能导致broker接收到重复的消息,默认值为3.
message.ies=3
#producer刷新topic metada的时间间隔,producer需要知道partition leader
#的位置,以及当前topic的情况
#因此producer需要⼀个机制来获取最新的metadata,当producer遇到特定错误时,
#将会⽴即刷新
#(⽐如topic失效,partition丢失,leader失效等),此外也可以通过此参数来配置
#额外的刷新机制,默认值600000
(2).consumer.properties:消费端的配置⽂件
#消费者集通过连接Zookeeper来到broker。
#zookeeper连接服务器地址处对象
#zookeeper的session过期时间,默认5000ms,⽤于检测消费者是否挂掉
zookeeper.session.timeout.ms=5000
#当消费者挂掉,其他消费者要等该指定时间才能检查到并且触发重新负载均衡
#这是⼀个时间阈值。
#指定多久消费者更新offset到zookeeper中。
#注意offset更新时基于time⽽不是每次获得的消息。
#⼀旦在更新zookeeper发⽣异常并重启,将可能拿到已拿到过的消息
zookeeper.sync.time.ms=2000
#指定消费
group.id=xxxxx
#这是⼀个数量阈值,经测试是500条。
#当consumer消费⼀定量的消息之后,将会⾃动向zookeeper提交offset信息#注意offset信息并不是每消费⼀次消息就向zk提交#⼀次,⽽是现在本地保存(内存),并定期提交,默认为true
# ⾃动更新时间。默认60 * 1000
automit.interval.ms=1000
# 当前consumer的标识,可以设定,也可以有系统⽣成,
#主要⽤来跟踪消息消费情况,便于观察
conusmer.id=xxx
# 消费者客户端编号,⽤于区分不同客户端,默认客户端程序⾃动产⽣
client.id=xxxx
# 最⼤取多少块缓存到消费者(默认10)
ssage.chunks=50
# 当有新的consumer加⼊到group时,将会reblance,此后将会
#有partitions的消费端迁移到新的consumer上,如果⼀个
上原kaera 下载#consumer获得了某个partition的消费权限,那么它将会向zk
#注册 "Partition Owner registry"节点信息,但是有可能
#此时旧的consumer尚没有释放此节点, 此值⽤于控制,
#注册节点的重试次数.
ies=5
#每拉取⼀批消息的最⼤字节数
#获取消息的最⼤尺⼨,broker不会像consumer输出⼤于
#此值的消息chunk 每次feth将得到多条消息,此值为总⼤⼩,
#提升此值,将会消耗更多的consumer端内存
fetch.min.bytes=6553600
#当消息的尺⼨不⾜时,server阻塞的时间,如果超时,
#消息将⽴即发送给consumer
#数据⼀批⼀批到达,如果每⼀批是10条消息,如果某⼀批还
#不到10条,但是超时了,也会⽴即发送给consumer。
fetch.wait.max.ms=5000
# 如果zookeeper没有offset值或offset值超出范围。
#那么就给个初始的offset。有smallest、largest、
#anything可选,分别表⽰给当前最⼩的offset、
#当前最⼤的offset、抛异常。默认largest
set=smallest
# 指定序列化处理类
derializer.class=kafka.serializer.DefaultDecoder
(3).server.properties:服务端的配置⽂件
#broker的全局唯⼀编号,不能重复
broker.id=0
#⽤来监听链接的端⼝,producer或consumer将在此端⼝建⽴连接
port=9092
#处理⽹络请求的线程数量,也就是接收消息的线程数。
#接收线程会将接收到的消息放到内存中,然后再从内存中写⼊磁盘。
numwork.threads=3
#消息从内存中写⼊磁盘是时候使⽤的线程数量。
#⽤来处理磁盘IO的线程数量
num.io.threads=8
#发送套接字的缓冲区⼤⼩
socket.send.buffer.bytes=102400
#接受套接字的缓冲区⼤⼩
#请求套接字的缓冲区⼤⼩
#kafka运⾏⽇志存放的路径
log.dirs=/export/servers/logs/kafka
#topic在当前broker上的分⽚个数
num.partitions=2
#我们知道segment⽂件默认会被保留7天的时间,超时的话就
#会被清理,那么清理这件事情就需要有⼀些线程来做。这⾥就是
#⽤来设置恢复和清理data下数据的线程数量
#segment⽂件保留的最长时间,默认保留7天(168⼩时),
#超时将被删除,也就是说7天之前的数据将被清理掉。
#滚动⽣成新的segment⽂件的最⼤时间
#⽇志⽂件中每个segment的⼤⼩,默认为1G
log.segment.bytes=1073741824
#上⾯的参数设置了每⼀个segment⽂件的⼤⼩是1G,那么
#就需要有⼀个东西去定期检查segment⽂件有没有达到1G,
#多长时间去检查⼀次,就需要设置⼀个周期性检查⽂件⼤⼩
#的时间(单位是毫秒)。
#⽇志清理是否打开
able=true
#broker需要使⽤zookeeper保存meta数据
#zookeeper链接超时时间
#上⾯我们说过接收线程会将接收到的消息放到内存中,然后再从内存
#写到磁盘上,那么什么时候将消息从内存中写⼊磁盘,就有⼀个
#时间限制(时间阈值)和⼀个数量限制(数量阈值),这⾥设置的是
#数量阈值,下⼀个参数设置的则是时间阈值。
#partion buffer中,消息的条数达到阈值,将触发flush到磁盘。
log.ssages=10000
#消息buffer的时间,达到阈值,将触发将消息从内存flush到磁盘,
#单位是毫秒。
log.flush.interval.ms=3000
#删除topic需要server.properties中设置able=true否则只是标记删除able=true
#此处的host.name为本机IP(重要),如果不改,则客户端会抛出:
#Producer connection to localhost:9092 unsuccessful 错误!
host.name=kafka01
advertised.host.name=192.168.239.128
⽇志⽂件的删除策略⾮常简单:启动⼀个后台线程定期扫描log file列表,把保存时间超过阀值的⽂件直接删除(根据⽂件的创建时间).清理参数在server.properties
⽂件中:
Kafka⽇志管理器允许定制删除策略。⽬前的策略是删除修改时间在N天之前的⽇志(按时间删除),也可以使⽤另外⼀个策略:保留最后的N GB数据的策略(按⼤⼩删除)。为了避免在删除时阻塞读操作,采⽤了copy-on-write形式的实现,删除操作进⾏时,读取操作的⼆分查功能实际是在⼀个静态的快照副本上进⾏的,这类似于Java的CopyOnWriteArrayList。
Kafka消费⽇志删除思想:Kafka把topic中⼀个parition⼤⽂件分成多个⼩⽂件段,通过多个⼩⽂件段,就容易定期清除或删除已经消费完⽂件,减少磁盘占⽤
1 2 3 4 5 6log.cleanup.policy=delete启⽤删除策略
直接删除,删除后的消息不可恢复。可配置以下两个策略:清理超过指定时间清理:
超过指定⼤⼩后,删除旧的消息:读取配置文件失败
Kafka⽇志管理器允许压缩策略
将数据压缩,只保留每个key最后⼀个版本的数据。⾸先在broker的配置中设置able=true启⽤cleaner,这个默认是关闭的。在Topic的配置中设置log.cleanup.policy=compact启⽤压缩策略。
在整个数据流中,每个Key都有可能出现多次,压缩时将根据Key将消息聚合,只保留最后⼀次出现时的数据。这样,⽆论什么时候消费消息,都能拿到每个Key的最新版本的数据。
压缩后的offset可能是不连续的,⽐如上图中没有5和7,因为这些offset的消息被merge了,当从这些offset消费消息时,将会拿到⽐这个offset⼤的offset对应的消息,⽐如,当试图获取offset为5的消息时,实际上会拿到offset为6的消息,并从这个位置开始消费。
这种策略只适合特俗场景,⽐如消息的key是⽤户ID,消息体是⽤户的资料,通过这种压缩策略,整个消息集⾥就保存了所有⽤户最新的资料。
压缩策略⽀持删除,当某个Key的最新版本的消息没有内容时,这个Key将被删除,这也符合以上逻辑。