Kafka API

1.环境准备

(1) 在eclipse中创建一个java工程

(2) 在工程的根目录创建一个lib文件夹

(3) 解压kafka安装包

    将安装包libs目录下的jar包拷贝到工程的lib目录下,并build path。

(4) 启动zk和kafka集群,在kafka集群中打开一个消费者

    [luomk@hadoop102 kafka]$ bin/kafka-console-consumer.sh -zookeeper hadoop102:2181 --topic first --consumer.config config/consumer.properties

 

2. 创建生产者带回调函数(新API)

/**

* 案例1:创建生产者

*

*/

public class NewProduct {



    public static void main(String[] args) {



        Properties props = new Properties();

        // Kafka服务端的主机名和端口号

        props.put("bootstrap.servers", "hadoop102:9092");

        // 等待所有副本节点的应答

        props.put("acks", "all");

        // 消息发送最大尝试次数

        props.put("retries", 0);

        // 一批消息处理大小

        props.put("batch.size", 16384);

        // 请求延时

        props.put("linger.ms", 1);

        // 发送缓存区内存大小

        props.put("buffer.memory", 33554432);

        // key序列化

        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        // value序列化

        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");





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

        for (int i = 0; i < 10; i++) {

            producer.send(new ProducerRecord<String, String>("first", Integer.toString(i), "luomk hello world-" + i));



            System.out.println(new ProducerRecord<String, String>("first", Integer.toString(i), "luomk hello world-" + i));

        }



        producer.close();

    }

}

在服务器端的效果:

 

3.自定义分区生产者

(1) 需求:将所有数据存储到topic的第0号分区上

(2) 定义一个类实现Partitioner接口,重写里面的方法

/**

* 案例二:自定义分区

*/

public class CustomPartitioner implements Partitioner{

    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {

        //控制分区

        return 0;

    }

    public void close() {

    }



    public void configure(Map<String, ?> configs) {

    }

}

(3)  在代码中调用

/**

* 案例二:自定义分区(生产者)

*/

public class PartitionerProducer {

    public static void main(String[] args) {

        Properties props = new Properties();

        // Kafka服务端的主机名和端口号

        props.put("bootstrap.servers", "hadoop102:9092");

        // 等待所有副本节点的应答

        props.put("acks", "all");

        // 消息发送最大尝试次数

        props.put("retries", 0);

        // 一批消息处理大小

        props.put("batch.size", 16384);

        // 请求延时

        props.put("linger.ms", 1);

        // 发送缓存区内存大小

        props.put("buffer.memory", 33554432);

        // key序列化

        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        // value序列化

        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        // 自定义分区

        props.put("partitioner.class", "com.atguigu.kafka.CustomPartitioner");

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

        producer.send(new ProducerRecord<String, String>("first", "我就是key1", "我就是values1"));

        producer.close();

    }

}

(4) 测试

    ① 在hadoop102上监控/opt/module/kafka/logs/目录下first主题3个分区的log日志动态变化情况

[luomk@hadoop102 first-0]$ tail -f 00000000000000000000.log

[luomk@hadoop102 first-1]$ tail -f 00000000000000000000.log

[luomk@hadoop102 first-2]$ tail -f 00000000000000000000.log

    ② 发现数据都存储到指定的分区了。

 

4.Kafka消费者Java API

(1) 在控制台创建发送者

[luomk@hadoop102 kafka]$ bin/kafka-console-producer.sh --broker-list hadoop102:9092 --topic first

>luomk

>kafka

(2) 创建消费者(官方提供案例(自动维护消费情况-新API))

/**

* 案例三:自动维护消费情况的API

*/

public class CustomNewConsumer {



    public static void main(String[] args) {



        Properties props = new Properties();



        // 定义kakfa 服务的地址,不需要将所有broker指定上

        props.put("bootstrap.servers", "hadoop102:9092");

        //制定consumer group

        props.put("group.id", "test");

        // 是否自动提交offset

        props.put("enable.auto.commit", "true");

        //自动确认offset时间间隔

        props.put("auto.commit.interval.ms", "1000");

        //key的序列化类

        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        //values的序列化类

        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");



        KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);

        consumer.subscribe(Arrays.asList("first", "second", "three"));



        while (true) {

            ConsumerRecords<String, String> records = consumer.poll(100);

            for (ConsumerRecord<String, String> record : records)

                System.out.printf("record.offset():" + record.offset() + ",record.key():" + record.key() + "record.value():" + record.value()+"\t");

        }

    }

}

 

5.源码地址:https://github.com/luomingkui/kafka

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员学习圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值