如何在Apache Beam中创建Kafka Producer

129 阅读2分钟

在这篇博客中,我们将了解什么是Kafka和Kafka Producer,包括使用Apache Beam的Kafka Producer的代码。

什么是Kafka?

Kafka是一个分布式数据流平台,所以它通常被用于高性能数据管道、流分析、数据集成和关键任务应用。

  • 发布(写)和订阅(读)事件流,称为记录。
  • 在主题内持久而可靠地存储记录流。
  • 在事件发生时或回顾性地处理记录流。

此外,这些功能是以分布式的、高度可扩展的、容错的和安全的方式提供的。

什么是Kafka生产者?

Kafka生产者是负责向一个或多个主题发送数据流的发布者。简而言之,生产者向Kafka主题写入消息。

以下是Kafka的基本命令

  • 创建主题。
    • bash kafka-topics.sh -create -zookeeper localhost:2181 -replication-factor 1 -partitions 1 -topic test
  • 列出所有主题。
    • bash kafka-topics -list -zookeeper localhost:2181
  • 启动一个消费者的命令。
    • bash kafka-console-consumer -topic test -from-beginning -bootstrap-server localhost:9092

一个典型的Beam驱动程序的工作原理如下。

  • 首先,创建一个管道对象并设置管道执行选项,包括管道运行器。
  • 然后,为管道数据创建一个初始PCollection,可以使用IO的从外部存储和其他来源读取数据。
  • 将PTransforms应用于每个PCollection。
    • PTransforms可以改变、过滤、分组、分析或处理PCollection中的元素。
    • 一个转换会创建一个新的输出PC集合,但不会修改输入集合。
  • 使用IO将最终的、经过转换的PC集合写到一个外部源。
  • 最后,使用指定的Pipeline Runner运行该管道。

让我们进入代码,在此假设Kafka设置已经完成,Kafka服务器也在机器上运行。

使用Apache Beam的Kafka Producer代码

import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.coders.StringUtf8Coder;
import org.apache.beam.sdk.io.kafka.KafkaIO;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.transforms.Create;
import org.apache.beam.sdk.values.PCollection;
import org.apache.kafka.common.serialization.StringSerializer;

public class KafkaProducer {

    public static void main(String[] args) {

        // Creating pipeline but without using options
        Pipeline pipeline = Pipeline.create();

        // Creating PCollection from the String which we want to pass as event in Kafka
        PCollection pCollection = pipeline.apply(Create.of("Hello World"));

        // Creating Kafka Producer using the KafkaIO and set the required configurations.
        pCollection
                .apply(KafkaIO.<Void, String>write()
                                .withBootstrapServers("localhost:9092")
                                .withTopic("test")
                                .withValueSerializer( StringSerializer.class).values());

        //Here we are starting the pipeline
        pipeline.run();

    }
}

代码解释

  • 在这段代码中,首先我们使用create()方法创建管道,没有任何选项。
  • 其次,我们从一个字符串中创建PCollection,我们希望将其发布到Kafka主题中,输入可以由文件和其他来源获得。
  • 之后,我们使用KafkaIO里面的apply()方法创建Kafka Producer,并设置所需的配置。
  • 最后,我们使用run()方法启动管道。

以下是需要添加到pom.xml中的maven依赖项

<dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-core</artifactId>
    <version>2.10.0</version>
</dependency>
<dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-io-kafka</artifactId>
    <version>2.10.0</version>
</dependency>
<dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-runners-direct-java</artifactId>
    <version>2.10.0</version>
</dependency>