Kafka笔记

Kafka笔记

简介

Kafka是一个分布式流处理平台,最初由LinkedIn公司开发,现已成为Apache软件基金会的顶级项目。它具有高吞吐量、低延迟和可靠性等特点,适合用于处理大量数据的场景。Kafka主要由三个组件构成:Producer、Broker和Consumer。

依赖Zookeeper的安装配置

安装Zookeeper

Kafka依赖Zookeeper进行集群管理和协调。可以通过以下步骤安装Zookeeper:

  1. 下载Zookeeper:可以在Zookeeper的官方网站下载最新版本的Zookeeper。
  2. 解压缩文件:将下载的文件解压缩到合适的目录下。
  3. 配置文件:进入解压缩后的目录,复制conf/zoo_sample.cfgconf/zoo.cfg,并编辑conf/zoo.cfg文件。
  4. 启动Zookeeper:执行bin/zkServer.sh start命令启动Zookeeper。

安装Kafka

可以通过以下步骤安装Kafka:

  1. 下载Kafka:可以在Kafka的官方网站下载最新版本的Kafka。
  2. 解压缩文件:将下载的文件解压缩到合适的目录下。
  3. 配置文件:进入解压缩后的目录,编辑config/server.properties文件,设置以下参数:
broker.id=0
listeners=PLAINTEXT://:9092
log.dirs=/tmp/kafka-logs
zookeeper.connect=localhost:2181

其中,broker.id是Kafka集群中的唯一标识,listeners指定Kafka监听的协议和端口,log.dirs指定Kafka存储数据的目录,zookeeper.connect指定Zookeeper的地址。

  1. 启动Kafka:执行bin/kafka-server-start.sh config/server.properties命令启动Kafka。

Shell命令

Kafka提供了一系列的Shell命令,用于管理Kafka集群,例如:

  1. 创建Topic:执行bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test命令创建名为test的Topic。
  2. 发送消息:执行bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test命令发送消息到名为test的Topic。
  3. 接收消息:执行bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning命令接收名为test的Topic中的消息。

Java操作Kafka

Kafka提供了Java客户端API,可以在Java程序中操作Kafka集群。以下是一个简单的Java程序,用于发送消息到名为test的Topic:

import java.util.Properties;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;

public class KafkaProducerExample {
  public static void main(String[] args) {
  Properties props = new Properties();
  props.put("bootstrap.servers", "localhost:9092");
  props.put("acks", "all");
  props.put("retries", 0);
  props.put("batch.size", 16384);
  props.put("linger.ms", 1);
  props.put("buffer.memory", 33554432);
  props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  KafkaProducer<String, String> producer = new KafkaProducer<>(props);
  for (int i = 0; i < 10; i++) {
    producer.send(new ProducerRecord<>("test", Integer.toString(i), Integer.toString(i)));
  }
  producer.close();
  }
}

以下是一个简单的Java程序,用于接收名为test的Topic中的消息:


以下是一个简单的Java程序,用于接收名为`test`的Topic中的消息:

```java
import java.util.Properties;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;

public class KafkaConsumerExample {
  public static void main(String[] args) {
    Properties props = new Properties();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group");
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

    KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
    consumer.subscribe(Collections.singletonList("test"));

    while (true) {
      ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
      for (ConsumerRecord<String, String> record : records) {
        System.out.println("Received message: " + record.value());
      }
    }
  }
}

不依赖Zookeeper的安装配置

Kafka也可以在不依赖Zookeeper的情况下运行,通过使用Kafka内置的分布式协议来实现集群管理和协调。以下是不依赖Zookeeper的安装配置步骤:

安装Kafka

  1. 下载Kafka:可以在Kafka的官方网站下载最新版本的Kafka。
  2. 解压缩文件:将下载的文件解压缩到合适的目录下。
  3. 配置文件:进入解压缩后的目录,编辑config/server.properties文件,设置以下参数:
broker.id=0
listeners=PLAINTEXT://:9092
log.dirs=/tmp/kafka-logs

其中,broker.id是Kafka集群中的唯一标识,listeners指定Kafka监听的协议和端口,log.dirs指定Kafka存储数据的目录。

  1. 启动Kafka:执行bin/kafka-server-start.sh config/server.properties命令启动Kafka。

Shell命令

Kafka提供了一系列的Shell命令,用于管理Kafka集群,例如:

  1. 创建Topic:执行bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --replication-factor 1 --partitions 1 --topic test命令创建名为test的Topic。
  2. 发送消息:执行bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test命令发送消息到名为test的Topic。
  3. 接收消息:执行bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning命令接收名为test的Topic中的消息。

Java操作Kafka

Kafka提供了Java客户端API,可以在Java程序中操作Kafka集群。以下是一个简单的Java程序,用于发送消息到名为test的Topic:

import java.util.Properties;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;

public class KafkaProducerExample {
  public static void main(String[] args) {
    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9092");
    props.put("acks", "all");
    props.put("retries", 0);
    props.put("batch.size", 16384);
    props.put("linger.ms", 1);
    props.put("buffer.memory", 33554432);
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

    KafkaProducer<String, String> producer = new KafkaProducer<>(props);

    String topic = "test";
    String message = "hello, kafka!";
    ProducerRecord<String, String> record = new ProducerRecord<>(topic, message);

    producer.send(record);

    producer.close();
  }
}

Kafka与其他中间件的对比

Kafka与其他消息队列和流处理平台相比,具有以下优点:

  1. 高吞吐量:Kafka可以在高并发场景下处理大量的数据。

  2. 高可靠性:Kafka使用多副本机制,确保消息的可靠性和持久性。

  3. 高可扩展性:Kafka支持分布式集群架构,并且可以很容易地扩展节点数量,以应对更高的负载。

  4. 灵活的数据保留策略:Kafka可以根据配置保留消息的时间或者保留消息的数量,同时也支持按照消息的键进行保留。

  5. 多语言支持:Kafka提供了多种语言的客户端API,方便开发者在不同的编程语言中使用Kafka。

    与其他中间件相比,Kafka的缺点主要是在实时性方面相对较差。因为Kafka是基于磁盘的存储系统,所以在数据写入磁盘之前会有一定的延迟,不适合实时性要求比较高的应用场景。

使用场景

Kafka可以广泛应用于以下场景:

  1. 数据采集:Kafka可以作为数据采集的消息队列,接收多种类型的数据,包括日志、指标、事件等,同时也支持各种数据格式。
  2. 数据传输:Kafka可以作为数据传输的中间件,将数据从一个系统传输到另一个系统,支持多种协议和编码方式。
  3. 流处理:Kafka可以与流处理平台集成,如Apache Flink、Apache Spark等,支持实时数据处理和流计算。
  4. 事件驱动架构:Kafka可以作为事件驱动架构的消息中间件,将不同的事件封装成消息,传递给不同的服务进行处理。

常见问题

以下是一些使用Kafka过程中的常见问题和解决方法:

  1. Topic不存在:在使用Kafka命令行工具或者Java客户端API时,如果指定的Topic不存在,会抛出异常或者错误。解决方法是在Kafka集群中创建该Topic。
  2. Producer发送消息失败:在使用Java客户端API时,如果发送消息失败,可以检查Kafka集群是否正常运行,并检查Producer的配置参数是否正确。
  3. Consumer接收消息失败:在使用Java客户端API时,如果接收消息失败,可以检查Kafka集群是否正常运行,并检查Consumer的配置参数是否正确。
  4. 集群扩展:如果Kafka集群的负载增加,需要扩展集群规模,可以通过添加新的节点来实现,同时也需要重新配置一些参数。

优化方案

以下是一些Kafka性能优化的方案:

  1. 调整参数:Kafka有很多可以调整的参数,如消息大小、批处理大小、缓存大小等,可以根据实际场景进行调整。

  2. 分区策略:Kafka的性能和可扩展性与分区数量直接相关,可以根据实际情况适当增加分区数量,以提高性能。

  3. 使用压缩算法:Kafka支持多种压缩算法,如Gzip、Snappy等,可以使用压缩算法来减小消息的大小,提高传输效率。

  4. 合理使用缓存:Kafka可以将消息缓存在内存中,以提高读写性能,但是也需要注意缓存的大小和使用方法,避免内存占用过大或者读写性能下降。

  5. 优化磁盘性能:Kafka是基于磁盘的存储系统,优化磁盘性能可以提高Kafka的写入和读取速度,如使用SSD磁盘、RAID等。

Docker部署单机版Kafka

  以下是使用Docker部署单机版Kafka的步骤:

  1. 安装Docker和Docker Compose。
  2. 创建一个docker-compose.yml文件,并添加以下内容:

  ```shell
  version: '3'
  services:
    zookeeper:
      image: zookeeper
      ports:
        - "2181:2181"
    kafka:
      image: wurstmeister/kafka
      ports:
        - "9092:9092"
      environment:
        KAFKA_ADVERTISED_HOST_NAME: localhost
        KAFKA_ADVERTISED_PORT: 9092
        KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
  ```

  1. 在终端中执行以下命令启动Kafka和Zookeeper容器:

  ```shell
  docker-compose up -d
  ```

  1. 使用以下命令测试Kafka是否正常运行:

  ```shell
  docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
  ```

  1. 使用以下命令发送一条测试消息:

  ```shell
  docker exec -it kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
  ```

  1. 使用以下命令接收测试消息:

  ```shell
  docker exec -it kafka /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
  ```

  以上就是使用Docker部署单机版Kafka的简单步骤,可以快速搭建一个本地的Kafka环境。

结语

  Kafka作为一种高性能、可靠的分布式消息中间件,广泛应用于数据采集、数据传输、流处理和事件驱动架构等场景。
posted @   runrab  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示