本文已参与「新人创作礼」活动,一起开启掘金创作之路
1.下载地址kafka.apache.org/downloads,这里下载kafka_2.11-2.4.1.tgz
2.将文件上传到服务器上,并解压"tar -zxvf kafka_2.11-2.4.1.tgz "
3.修改server.properties配置文件,zookeeper的配置文件可以使用默认配置不修改
#对外暴露的服务端口,如果外网需要向broker发送消息必须配置
advertised.listeners=PLAINTEXT://192.168.42.112:9092
#在单机时无需修改,但在集群下部署时往往需要修改。它是个每一个 broker 在集群中的唯一表示,要求是正数。当该服务器的 IP 地址发生改变时, broker.id 没有变化,则不会影响 consumers 的消息情况
broker.id=0
# The address the socket server listens on. It will get the value returned from
# java.net.InetAddress.getCanonicalHostName() if not configured.
#listeners=PLAINTEXT://:9092
#对外暴露的服务端口,如果外网需要向broker发送消息必须配置;如果只在内网使用,不需要配置此项,配置listeners即可
#advertised.listeners=PLAINTEXT://your.host.name:9092
#broker处理消息的最大线程数,一般情况下不需要去修改
num.network.threads=3
#broker处理磁盘IO的线程数,数值应该大于你的硬盘数
num.io.threads=8
#socket的发送缓冲区,socket的调优参数SO_SNDBUFF
socket.send.buffer.bytes=102400
#socket的接受缓冲区,socket的调优参数SO_RCVBUFF
socket.receive.buffer.bytes=102400
#socket请求的最大数值,防止serverOOM,message.max.bytes必然要小于socket.request.max.bytes,会被topic创建时的指定参数覆盖Kafka中log日志的参数配置
socket.request.max.bytes=104857600
#Kafka 把所有的消息都保存在磁盘上,存放这些数据的目录通过 log.dirs 指定。可以使用多路径,使用逗号分隔。如果是多路径,Kafka 会根据“最少 使用”原则,把同一个分区的日志片段保存到同一路径下。会往拥有最少数据分区的路径新增分区。
log.dirs=/tmp/kafka-logs
#每个新建主题的分区个数(分区个数只能增加,不能减少 )。这个参数一般要评估,比如,每秒钟要写入和读取 1000M 数据,如果现在每个消费者 每秒钟可以处理 50MB 的数据,那么需要 20 个分区,这样就可以让 20 个消费者同时读取这些分区,从而达到设计目标。(一般经验,把分区大小限制在 25G 之内比较理想)
num.partitions=1
#每数据目录用于日志恢复启动和关闭时的线程数量。因为这些线程只是服务器启动(正常启动和崩溃后重启)和关闭时会用到。所以完全可以设置 大量的线程来达到并行操作的目的。注意,这个参数指的是每个日志目录的线程数,比如本参数设置为 8,而 log.dirs 设置为了三个路径,则总共会启动 24 个线程。
num.recovery.threads.per.data.dir=1
# The minimum age of a log file to be eligible for deletion due to age
#日志保存时间,默认为 7 天(168 小时)。超过这个时间会清理数据。bytes 和 minutes 无论哪个先达到都会触发。与此类似还有 log.retention.minutes 和 log.retention.ms,都设置的话,优先使用具有最小值的那个。(提示:时间保留数据是通过检查磁盘上日志片段文件的最后修改时间来实现的。也就 是最后修改时间是指日志片段的关闭时间,也就是文件里最后一个消息的时间戳)
log.retention.hours=168
#topic 每个分区的最大文件大小,一个 topic 的大小限制 = 分区数*log.retention.bytes。-1 没有大小限制。log.retention.bytes 和 log.retention.minutes 任意一个达到要求,都会执行删除。(注意如果是 log.retention.bytes 先达到了,则是删除多出来的部分数据),一般不推荐使用最大文件删除策略,而是推 荐使用文件过期删除策略
#log.retention.bytes=1073741824
#分区的日志存放在某个目录下诸多文件中,这些文件将分区的日志切分成一段一段的,我们称为日志片段。这个属性就是每个文件的最大尺寸;当 尺寸达到这个数值时,就会关闭当前文件,并创建新文件。被关闭的文件就开始等待过期。默认为 1G。 如果一个主题每天只接受 100MB 的消息,那么根据默认设置,需要 10 天才能填满一个文件。而且因为日志片段在关闭之前,消息是不会过期的,所 以如果 log.retention.hours 保持默认值的话,那么这个日志片段需要 17 天才过期。因为关闭日志片段需要 10 天,等待过期又需要 7 天
log.segment.bytes=1073741824
#文件大小检查的周期时间,是否处罚 log.cleanup.policy中设置的策略
log.retention.check.interval.ms=300000
#zookeeper 集群的地址,可以是多个,多个之间用逗号分割。(一组 hostname:port/path 列表,hostname 是 zk 的机器名或 IP、port 是 zk 的端口、/path 是可选 zk 的路径,如果不指定,默认使用根路径)
zookeeper.connect=localhost:2181
# Timeout in ms for connecting to zookeeper
#ZooKeeper的连接超时时间
zookeeper.connection.timeout.ms=6000
# 是否允许自动创建主题 缺省为true。
# auto.create.topics.enable=true
# 是否允许删除主题 缺省为false。
delete.topic.enable=true
4.先启动zookeeper
nohup /home/kafka_2.11-2.4.1//bin/zookeeper-server-start.sh /home/kafka_2.11-2.4.1//config/zookeeper.properties &
5.再启动kafka
nohup /home/kafka_2.11-2.4.1/bin/kafka-server-start.sh /home/kafka_2.11-2.4.1/config/server.properties &
6.创建主题my-topic,1个副本,8个分区
./kafka-topics.sh --zookeeper localhost:2181 --create --topic my-topic --replication-factor 1 --partitions 8
7.列出所有主题
./kafka-topics.sh --zookeeper localhost:2181 --list
8.列出所有主题的详细信息
./kafka-topics.sh --zookeeper localhost:2181 --describe
9.创建生产者
./kafka-console-producer.sh --broker-list localhost:9092 -topic my-topic
10.创建消费者
./kafka-console-consumer.sh -bootstrap-server localhost:9092 --topic my-topic --from-beginning
11.增加分区(分区不能被删除)
./kafka-topics.sh --zookeeper localhost:2181 --alter --topic my-topic --partitions 16