目录

  • 1. Kafka Producer API
  • 1.1 创建一个Topic
  • 1.2 启动一个测试 Topic 的消费者
  • 1.3 Kafka Producer API
  • 2. 查看Kafka 数据目录里面的数据
  • 3. Kafka 参数调优
  • 3.1 Kafka Broker 参数
  • 3.2 Kafka Producer 参数
  • 3.3 Kafka Consumer 参数


1. Kafka Producer API

  • Kafka 一般在大数据中是作为流式处理中的消息中间件使用的,数据生产者一般为:1) Canal/Maxwell(Mysql Binlog 收集工具) 2) Flume 日志收集工具 。数据通常是下发到 Spark/Flink 流式计算框架,写入到 实时数仓中的。
  • 我们这里通过调用 Kafka Producer 的 API 来生产数据,并把消费者的数据打印在控制台上面输出。
1.1 创建一个Topic
[root@bigdatatest01 ~]# cd app/kafka01/bin/
[root@bigdatatest01 bin]# ./kafka-topics.sh --create \
> --zookeeper  bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
> --partitions 3 \
> --replication-factor 3 \
> --topic kafka-test
Created topic kafka-test.
[root@bigdatatest01 bin]# ./kafka-topics.sh --list \
> --zookeeper  bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka
__consumer_offsets
bigdata
kafka-test
test
1.2 启动一个测试 Topic 的消费者
[root@bigdatatest01 bin]# ./kafka-console-consumer.sh \
> --bootstrap-server bigdatatest01:9092,bigdatatest01:9093,bigdatatest01:9094 \
> --topic kafka-test \
> --from-beginning
1.3 Kafka Producer API
  • 增加 POM 文件
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>2.2.1</version>
</dependency>
package com.xk.bigdata.kafka.basic;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;

import java.util.Properties;

/**
 * kafka Producer API 
 */
public class Producer {

    public static final String TOPIC = "kafka-test";

    public static void main(String[] args) {
        Properties pro = new Properties();
        // 指定请求的kafka集群列表
        pro.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "bigdatatest01:9092,bigdatatest01:9093,bigdatatest01:94");
        pro.put(ProducerConfig.CLIENT_ID_CONFIG,"test");

        // 当所有的 Kafka borkers 都写入成功之后 返回 ack 包才标识写入成功
        pro.put(ProducerConfig.ACKS_CONFIG, "all");
        // 指定value的序列化方式
        pro.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        // 指定key的序列化方式, key是用于存放数据对应的offset
        pro.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        // 配置超时时间
        pro.put("request.timeout.ms", "60000");
        // 最大尝试次数
        pro.put("retries",1);
        KafkaProducer<String, String> producer = null;
        try {
            // 创建一个消费者 API的对象
            producer = new KafkaProducer<>(pro);
            for (int i = 0; i < 10; i++) {
                producer.send(new ProducerRecord<String, String>(TOPIC, String.valueOf(i), "test" + i)).get();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (null != producer){
                producer.close();
            }
        }


    }

}
  • 运行结果
[root@bigdatatest01 bin]# ./kafka-console-consumer.sh \
> --bootstrap-server bigdatatest01:9092,bigdatatest01:9093,bigdatatest01:9094 \
> --topic kafka-test \
> --from-beginning
test0
test1
test2
test3
test4
test5
test6
test7
test8
test9

2. 查看Kafka 数据目录里面的数据

  • 查看 Kafka 里面 log.dirs 这个参数指的是:Kafka 数据存储在哪里,一般不放在 /tmp目录下,因为Linux /tmp 目录会自动清除数据。
  • 数据存储在xxxx.log里面,文件名就是这个文件里面起始的偏移量。
  • 索引数据存储在xxxx.index 里面,文件名就是这个文件里面起始的偏移量。
  • 查看数据
[root@bigdatatest01 ~]# cd /root/tmp/kafka03
[root@bigdatatest01 kafka03]# cd kafka-test-1/
[root@bigdatatest01 kafka-test-1]# ll
total 16
-rw-r--r-- 1 root root 10485760 Jan 30 15:58 00000000000000000000.index
-rw-r--r-- 1 root root      434 Jan 30 15:59 00000000000000000000.log
-rw-r--r-- 1 root root 10485756 Jan 30 15:58 00000000000000000000.timeindex
-rw-r--r-- 1 root root       10 Jan 30 15:58 00000000000000000004.snapshot
-rw-r--r-- 1 root root       16 Jan 30 15:59 leader-epoch-checkpoint
[root@bigdatatest01 kafka-test-1]# pwd
/root/tmp/kafka03/kafka-test-1
[root@bigdatatest01 kafka-test-1]# /root/app/kafka02/bin/kafka-run-class.sh \
> kafka.tools.DumpLogSegments \
> --files /root/tmp/kafka03/kafka-test-1/00000000000000000000.log \
> --print-data-log \
> > 0.txt
[root@bigdatatest01 kafka-test-1]# cat 0.txt 
Dumping /root/tmp/kafka03/kafka-test-1/00000000000000000000.log
Starting offset: 0
baseOffset: 0 lastOffset: 0 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1611990840584 size: 69 magic: 2 compresscodec: NONE crc: 4080240511 isvalid: true
| offset: 0 CreateTime: 1611990840584 keysize: -1 valuesize: 1 sequence: -1 headerKeys: [] payload: 2
baseOffset: 1 lastOffset: 1 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 69 CreateTime: 1611991305553 size: 69 magic: 2 compresscodec: NONE crc: 1878548313 isvalid: true
| offset: 1 CreateTime: 1611991305553 keysize: -1 valuesize: 1 sequence: -1 headerKeys: [] payload: 2
baseOffset: 2 lastOffset: 2 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 4 isTransactional: false isControl: false position: 138 CreateTime: 1611993310225 size: 74 magic: 2 compresscodec: NONE crc: 949833390 isvalid: true
| offset: 2 CreateTime: 1611993310225 keysize: 1 valuesize: 5 sequence: -1 headerKeys: [] key: 4 payload: test4
baseOffset: 3 lastOffset: 3 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 4 isTransactional: false isControl: false position: 212 CreateTime: 1611993310285 size: 74 magic: 2 compresscodec: NONE crc: 4165060188 isvalid: true
| offset: 3 CreateTime: 1611993310285 keysize: 1 valuesize: 5 sequence: -1 headerKeys: [] key: 6 payload: test6
baseOffset: 4 lastOffset: 4 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 5 isTransactional: false isControl: false position: 286 CreateTime: 1611993561401 size: 74 magic: 2 compresscodec: NONE crc: 604816250 isvalid: true
| offset: 4 CreateTime: 1611993561401 keysize: 1 valuesize: 5 sequence: -1 headerKeys: [] key: 4 payload: test4
baseOffset: 5 lastOffset: 5 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 5 isTransactional: false isControl: false position: 360 CreateTime: 1611993561426 size: 74 magic: 2 compresscodec: NONE crc: 294887224 isvalid: true
| offset: 5 CreateTime: 1611993561426 keysize: 1 valuesize: 5 sequence: -1 headerKeys: [] key: 6 payload: test6
  • 数据量比较小的时候,索引里面没有数据,又跑了1W条数据
  • 查看偏移量
[root@bigdatatest01 kafka-test-1]# /root/app/kafka02/bin/kafka-run-class.sh \
> kafka.tools.DumpLogSegments \
> --files /root/tmp/kafka03/kafka-test-1/00000000000000000000.index \
> --print-data-log \
> > 0.index
[root@bigdatatest01 kafka-test-1]# cat 0.index 
Dumping /root/tmp/kafka03/kafka-test-1/00000000000000000000.index
offset: 58 position: 4420
offset: 111 position: 8554
offset: 164 position: 12688
offset: 217 position: 16822
offset: 270 position: 20956
offset: 323 position: 25090
offset: 375 position: 29226
offset: 427 position: 33386
offset: 479 position: 37546
offset: 531 position: 41706
offset: 583 position: 45866
offset: 635 position: 50026
offset: 687 position: 54186
offset: 739 position: 58346
offset: 791 position: 62506
offset: 843 position: 66666
offset: 895 position: 70826
offset: 947 position: 74986
offset: 999 position: 79146
offset: 1051 position: 83306
offset: 1103 position: 87466
offset: 1155 position: 91626
offset: 1207 position: 95786
offset: 1259 position: 99946
offset: 1311 position: 104106
offset: 1363 position: 108266
offset: 1415 position: 112426
offset: 1467 position: 116586
offset: 1519 position: 120746
offset: 1571 position: 124906
offset: 1623 position: 129066
offset: 1675 position: 133226
offset: 1727 position: 137386
offset: 1779 position: 141546
  • offset 是 Kafka 偏移量数据
  • position 是对应的 log 文件中这条数据的具体偏移量数据

3. Kafka 参数调优

3.1 Kafka Broker 参数
  • log.segment.bytes:指的是Kafka 日志文件大小,单位是字节
  • message.max.bytes=2560KB:一条消息的大小
  • zookeeper.session.timeout.ms=180000:ZK客户端 timeout 时间
  • replica.fetch.max.bytes=5M:大于message.max.bytes,为每个分区尝试获取最大的消息字节数,单位字节。
  • num.replica.fetchers=6:拉取线程数,fetcher配置多可以提高follower的I/O并发度,单位时间内leader持有更多请求,相应负载会增大,需要根据机器硬件资源做权衡,建议适当调大。
  • replica.lag.max.messages=6000:Kafka通过replica.lag.max.messages和replica.lag.time.max.ms两个参数来度量Follower同步的情况。其中replica.lag.max.messages用于配置Follower可落后的最大消息数量,replica.lag.time.max.ms用于配置Follower和Leader通信的最大时延。由于replica.lag.max.messages是全局配置,需要根据经验配置,配置的不好会导致节点不断的加入和移出ISR,后续版本已经删除此参数,是保留replica.lag.time.max.ms一个参数。
  • replica.lag.time.max.ms=15000
  • log.flush.interval.messages=10000:在将消息刷新到磁盘之前在日志分区上累积的消息数。
  • log.flush.interval.ms=5s:任何主题中的消息在刷新到磁盘之前保留在内存中的最长时间(毫秒)。
3.2 Kafka Producer 参数
  • acks=all:当所有的 Kafka borkers 都写入成功之后 返回 ack 包才标识写入成功。
  • buffer.memory=536870912:缓存区域的大小。
  • compression.type=snappy:压缩格式为snappy。
  • retries=100:如果没有写入成功尝试次数。
  • max.in.flight.requests.per.connection=1:在阻塞之前,客户端将在单个连接上发送的最大未确认请求数。
  • batch.size:1024字节:每当多个记录被发送到同一分区时,生产者将尝试将记录批处理到一起,以减少请求。
  • max.request.size=2097152:请求的最大大小(字节)。
  • request.timeout.ms=360000:大于 replica.lag.time.max.ms ,配置控制客户端等待请求响应的最长时间。
  • metadata.fetch.timeout.ms:36000:指定了生产者在获取元数据(比如目标分区的Leader是谁)时等待服务器返回响应的时间。如果等待响应超时,那么生产者要么重试发送数据,要么返回一个错误(抛出异常或执行回调)。
  • timeout.ms:36000:超时时间。
  • linger.ms=5s:该参数指定了生产者在发送批次之前等待更多消息加入批次的时间(生产不用)。
  • max.block.ms=1800000:该参数指定了在调用send()方法或使用partitionsFor()方法获取元数据时生产者的阻塞时间。
3.3 Kafka Consumer 参数
  • max.partition.fetch.bytes=5242880:默认值是1MB,该属性指定了服务器从每个分区里返回给消费者的最大字节数。
  • request.timeout.ms=90000:指定了生产者在发送数据时等待服务器返回响应的时间。
  • session.timeout.ms=60000:该属性指定了消费者在被认为死亡之前可以与服务器断开连接的时间。
  • heartbeat.interval.ms=5000:心跳时间间隔。
  • receive.buffer.bytes=10485760:指定了TCP socket 接收数据包的缓冲区大小,如果它们被设为-1,就使用操作系统的默认值。