Kafka生产者API的应用

在Kafka集群中创建主题名称为englishscore,主题的分区数为3,副本因子为3。分别使用生产者异步不带回调函数的API(前100名学生)、异步带回调函数的API(100~200名学生)、同步AP(200~300名学生)完成学生英语成绩的生产。键为姓名,值为成绩。

  1. 启动zookeeper集群

zkServer.sh start
  1. 启动kafka集群

cd /opt/kafka
bin/kafka-server-start.sh -daemon config/server.properties
  1. 创建主题名称为englishscore,主题的分区数为3,副本因子为3

 bin/kafka-topics.sh --zookeeper node01:2181,node02:2181 --partitions 3 --replication-factor 3 --create --topic englishscore
  1. 查看主题englishscore的详细信息

bin/kafka-topics.sh --zookeeper node01:2181,node02:2181 --describe --topic englishscore
  1. 打开IDEA开发工具,创建项目名称为kafkaApiApp,添加Pom文件

  1. pom文件中添加kafka依赖

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>0.11.0.0</version>
    </dependency>
</dependencies>
  1. 创建生产者异步不带回调函数的API(前100名学生)的类CustomProducer

键为zhangsan+序号,值为100以内的随机数

package cn.lesson;
import org.apache.kafka.clients.producer.*;
import java.util.Properties;
import java.util.Random;
public class CustomProducer {
    public static void main(String[] args) {
        Random random = new Random();
        Properties props = new Properties();
        //kafka 集群,broker-list
        props.put("bootstrap.servers", "node01:9092,node02:9092");
        props.put("acks", "all");
        //重试次数
        props.put("retries", 1);
        //批次大小
        props.put("batch.size", 16384);
        //等待时间
        props.put("linger.ms", 1);
        //RecordAccumulator 缓冲区大小
        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");
        Producer<String, String> producer = new
                KafkaProducer<String, String>(props);
        for (int i = 0; i < 100; i++) {
            producer.send(new ProducerRecord<String, String>("englishscore",
                    "zhangsan"+Integer.toString(i), Integer.toString(random.nextInt(100))));
        }
        producer.close();
    }
}
  1. Kafka集群启动控制台消费者进程,消费主题englishscore

bin/kafka-console-consumer.sh --bootstrap-server node01:9092,node02:9092 --topic englishscore
  1. IDEA中,执行CustomProducer代码,查看消费者控制台执行效果

  1. 编写异步带回调函数的API(100~200名学生)的代码CustomProducer1

键为lisi+序号,值为100以内的随机数,并打印消息所在的主题、分区、消费位移

package cn.lesson;
import org.apache.kafka.clients.producer.*;
import java.util.Properties;
import java.util.Random;
public class CustomProducer1 {
    public static void main(String[] args) {
        Random random = new Random();
        Properties props = new Properties();
        props.put("bootstrap.servers", "node01:9092,node02:9092");//kafka 集群,broker-list
        props.put("acks", "all");
        props.put("retries", 1);//重试次数
        props.put("batch.size", 16384);//批次大小
        props.put("linger.ms", 1);//等待时间
        props.put("buffer.memory", 33554432);//RecordAccumulator 缓冲区大小
        props.put("key.serializer",
                "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer",
                "org.apache.kafka.common.serialization.StringSerializer");
        Producer<String, String> producer = new
                KafkaProducer<String, String>(props);
        for (int i = 200; i < 300; i++) {
            producer.send(new ProducerRecord<String, String>("englishscore",
                    "lisi"+Integer.toString(i), Integer.toString(random.nextInt(100))), new Callback() {
                //回调函数,该方法会在 Producer 收到 ack 时调用,为异步调用
                public void onCompletion(RecordMetadata metadata,
                                         Exception exception) {
                    if (exception == null) {
                        System.out.println("success->" +
                               metadata.topic()+"=>"+metadata.partition()+"=>"+metadata.offset());
                    } else {
                        exception.printStackTrace();
                    }
                }
            });
        }
        producer.close();
    }
}
  1. 运行CustomProducer1代码,消费者控制台查看执行结果

12.编写同步API(200~300名学生)CustomProducer2,键为lisi+序号,值为100以内的随机数。

package cn.lesson;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.ExecutionException;
public class CustomProducer2 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Random random = new Random();
        Properties props = new Properties();
        props.put("bootstrap.servers", "node01:9092,node02:9092");//kafka 集群,broker-list
        props.put("acks", "all");
        props.put("retries", 1);//重试次数
        props.put("batch.size", 16384);//批次大小
        props.put("linger.ms", 1);//等待时间
        props.put("buffer.memory", 33554432);//RecordAccumulator 缓冲区大小
        props.put("key.serializer",
                "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer",
                "org.apache.kafka.common.serialization.StringSerializer");
        Producer<String, String> producer = new
                KafkaProducer<String, String>(props);
        for (int i = 200; i < 300; i++) {
            producer.send(new ProducerRecord<String, String>("englishscore",
                    "wangwu"+Integer.toString(i), Integer.toString(random.nextInt(100)))).get();
        }
        producer.close();
    }
}

13.运行CustomProducer1代码,消费者控制台查看执行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink是一个开源的流处理框架,而Kafka是一个分布式消息队列系统。在Flink中使用KafkaJava API可以实现将Kafka中的数据作为输入源或将处理结果输出到Kafka中。 在Flink中使用Kafka Java API的步骤通常如下: 1. 引入Kafka的依赖:首先需要将KafkaJava API的依赖添加到Flink的工程中。 2. 创建Kafka消费者:使用KafkaJava API创建一个消费者实例,可以指定消费者的一些配置如Kafka的地址、消费者组ID等。通过调用消费者的`assign()`方法或`subscribe()`方法来指定要消费的Kafka主题。 3. 创建Flink的DataStream:使用Flink的DataStream API实例化一个用于接收Kafka数据的DataStream对象。可以使用`addSource()`方法来将Kafka消费者作为数据源。可以在创建DataStream时指定Kafka消息的反序列化方式、数据类型等。 4. 执行数据处理逻辑:可以在DataStream上应用各种Flink的算子,如map、filter、reduce等,对Kafka中的数据进行处理。 5. 创建Kafka生产者:使用KafkaJava API创建一个生产者实例,可以指定生产者的一些配置。通过调用生产者的`send()`方法将处理后的结果数据发送到Kafka中。 6. 提交任务并启动Flink作业:将处理逻辑应用到Flink的任务上,并将任务提交给Flink集群进行执行。 通过以上步骤,就可以在Flink中使用KafkaJava API进行数据的输入和输出。这种方式将Kafka作为Flink的一个数据源或数据目的,使得数据可以在流处理中被实时地处理和分析。同时,由于Kafka分布式特性,也可以保证数据的可靠性和高吞吐量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值