KafkaプロデューサープロデューサーAPI操作

1.準備

  • IDEでmavenプロジェクトを作成し、pomファイルに依存関係を追加します
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>1.1.1</version>
</dependency>
  • zookeeperクラスターを開始します
bin/zkServer.sh start
  • kafkaクラスターを開始します
bin/kafka-server-start.sh -daemon config/server.properties
  • Kafkaクラスターは消費者を開きます
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic bigdata 
--from-beginning

2.通常のプロデューサーを作成します

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

public class MyProducer {
    
    
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    
    
        /* 相当于map操作 */
        Properties properties = new Properties();

        /* kafka 集群,broker-list */
        properties.put("bootstrap.servers", "centos7-1:9092");

        /* 等待所有副本节点的应答 */
        properties.put("acks", "all");

        /* 重试次数 */
        properties.put("retries", Integer.valueOf(3));

        /* 批次大小 */
        properties.put("batch.size", Integer.valueOf(16384));

        /* 等待时间 */
        properties.put("linger.ms", Integer.valueOf(1));

        /* RecordAccumulator 缓冲区大小 */
        properties.put("buffer.memory", Integer.valueOf(33554432));

        /* key序列化 */
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        /* value序列化 */
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        /* 创建生产者对象 */
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer(properties);

        /* 发送数据 */
        for (int i = 0; i < 10; i++) {
    
    
            /* 发送的主题、key、value */
            kafkaProducer.send(new ProducerRecord("bigdata", "jh","jh==" + i));
        }

        /* 关闭资源 */
        kafkaProducer.close();
    }
}

エフェクト表示、クラスタリングを開始した消費者:
ここに写真の説明を挿入

3つ目は、コールバック関数を使用してプロデューサーを作成する

コールバック関数は、プロデューサーがackを受信したときに呼び出されます。これは非同期呼び出しです。このメソッドには、RecordMetadataとExceptionの2つのパラメーターがあります。Exceptionがnullの場合、メッセージは正常に送信され、Exceptionがnullでない場合、メッセージは送信されません。

注:メッセージの送信に失敗した場合、メッセージは自動的に再試行され、コールバック関数で手動で再試行する必要はありません。

import java.util.Properties;
import org.apache.kafka.clients.producer.*;

public class CallBackProducer {
    
    
    public static void main(String[] args) {
    
    
        Properties properties = new Properties();

        /* kafka 集群 broker-list */
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "centos7-1:9092");

        /* 等待所有副本节点的应答 */
        properties.put("acks", "-1");

        /* 重试次数 */
        properties.put("retries", Integer.valueOf(3));

        /* 批次大小 */
        properties.put("batch.size", Integer.valueOf(16384));

        /* 等待时间 */
        properties.put("linger.ms", Integer.valueOf(1));

        /* RecordAccumulator 缓冲区大小 */
        properties.put("buffer.memory", Integer.valueOf(33554432));

        /* key序列化 */
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

        /* value序列化 */
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

        /* 创建生产者对象 */
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer(properties);

        /* 发送数据 */
        for (int i = 0; i < 100000; i++) {
    
    
            /* 发送的主题、key、value 回调函数*/
            kafkaProducer.send(new ProducerRecord("backtest", "jh","jh===>" + i), new Callback() {
    
    
                @Override
                public void onCompletion(RecordMetadata metadata, Exception exception) {
    
    
                    /* 如果发送成功,输出分区、offset */
                    if (exception == null) {
    
    
                        System.out.println(metadata.partition() + "--" + metadata.offset());
                    } else {
    
    
                        /* 如果发送失败,打印报错信息 */
                        exception.printStackTrace();
                    }
                }
            });
        }
        /* 关闭资源 */
        kafkaProducer.close();
    }
}

sendメソッドのソースコード:パーティションストレージを指定できます

  @Override
    public Future<RecordMetadata> send(ProducerRecord<K, V> record, Callback callback) {
    
    
        // intercept the record, which can be potentially modified; this method does not throw exceptions
        ProducerRecord<K, V> interceptedRecord = this.interceptors.onSend(record);
        return doSend(interceptedRecord, callback);
    }

public class ProducerRecord<K, V> {
    
    

    private final String topic;
    /* 这里可以指定分区 */
    private final Integer partition;
    private final Headers headers;
    private final K key;
    private final V value;
    private final Long timestamp;

実行後、デフォルトはハッシュパーティションであり、領域が順序付けられていることがわかります

0--188
0--189
0--190
0--191
0--192
0--193
2--2467
2--2468
2--2469
2--2470
2--2471
2--2472

第四に、カスタムパーティションのプロデューサーを作成します

Partitionerを実装するクラスを作成します

import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;
import java.util.Map;

public class Mypartition implements Partitioner {
    
    
    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
    
    
        /* 这里写自己对应的业务逻辑 */
//        List<PartitionInfo> mydata = cluster.availablePartitionsForTopic("mydata");
//        Integer mydata1 = cluster.partitionCountForTopic("mydata");

        return 0;
    }
    @Override
    public void close() {
    
    
    }
    @Override
    public void onNewBatch(String topic, Cluster cluster, int prevPartition) {
    
    

    }
    @Override
    public void configure(Map<String, ?> configs) {
    
    
    }
}
import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import java.util.Properties;
import java.util.concurrent.ExecutionException;

public class MyProducerPartition {
    
    
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    
    
        /* 相当于map操作 */
        Properties properties = new Properties();

        /* kafka 集群,broker-list */
        properties.put("bootstrap.servers", "centos7-1:9092");

        /* 等待所有副本节点的应答 */
        properties.put("acks", "all");

        /* 重试次数 */
        properties.put("retries", Integer.valueOf(3));

        /* 批次大小 */
        properties.put("batch.size", Integer.valueOf(16384));

        /* 等待时间 */
        properties.put("linger.ms", Integer.valueOf(1));

        /* RecordAccumulator 缓冲区大小 */
        properties.put("buffer.memory", Integer.valueOf(33554432));

        /* key序列化 */
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        /* value序列化 */
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        /* 添加自定义分区 */
        properties.put("partitioner.class", "com.gu.Mypartition");

        /* 创建生产者对象 */
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer(properties);

        /* 发送数据 */
        for (int i = 0; i < 10; i++) {
    
    
            /* 发送的主题、key、value */
            kafkaProducer.send(new ProducerRecord("bigdata", "jh==" + i), new Callback() {
    
    
                @Override
                public void onCompletion(RecordMetadata metadata, Exception exception) {
    
    
                    /* 如果发送成功,输出分区、offset */
                    if (exception == null) {
    
    
                        System.out.println(metadata.partition() + "--" + metadata.offset());
                    } else {
    
    
                        /* 如果发送失败,打印报错信息 */
                        exception.printStackTrace();
                    }
                }
            });
        }

        /* 关闭资源 */
        kafkaProducer.close();
    }
}

おすすめ

転載: blog.csdn.net/weixin_46122692/article/details/109275559