Kafka的producer案例,Kafka的consumer案例

来源:互联网 发布:ubuntu atom 编辑:程序博客网 时间:2024/05/16 12:09

1、编写所需的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>cn.com.kafka</groupId>    <artifactId>learnKafka</artifactId>    <version>1.0-SNAPSHOT</version>    <!--导入maven依赖有两种:一种maven.org 一种从已有的项目中导入-->    <dependencies>        <dependency>            <groupId>org.apache.kafka</groupId>            <artifactId>kafka_2.8.2</artifactId>            <version>0.8.1</version>            <exclusions>                <exclusion>                    <artifactId>jmxtools</artifactId>                    <groupId>com.sun.jdmk</groupId>                </exclusion>                <exclusion>                    <artifactId>jmxri</artifactId>                    <groupId>com.sun.jmx</groupId>                </exclusion>                <exclusion>                    <artifactId>jms</artifactId>                    <groupId>javax.jms</groupId>                </exclusion>            </exclusions>        </dependency>    </dependencies></project>

2、编写一个Producer

代码:

package kafka;import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessage;import kafka.producer.ProducerConfig;import java.util.Properties;/** * 代码说明 * * @author tuzq * @create 2017-06-18 16:50 */public class MyKafkaProducer {    public static void main(String[] args) {        Properties properties = new Properties();        properties.put("metadata.broker.list","hadoop1:9092");        properties.put("serializer.class","kafka.serializer.StringEncoder");        Producer producer = new Producer(new ProducerConfig(properties));        //先到Linux下创建topic:test        //[root@hadoop1 kafka]# bin/kafka-topics.sh --create --zookeeper hadoop11:2181 --replication-factor 1 -partitions 1 --topic test        producer.send(new KeyedMessage("test","I am tuzq"));    }}

运行程序
准备条件:
1、创建test的topic
[root@hadoop1 kafka]# bin/kafka-topics.sh –create –zookeeper hadoop11:2181 –replication-factor 1 -partitions 1 –topic test

2、执行kafka-console-consumer.sh这个脚本,监听发过来的消息
[root@hadoop3 kafka]# sh bin/kafka-console-consumer.sh –zookeeper hadoop11:2181 –from-beginning –topic test

3、右键Run这个类

3.编写含有自定义的一些条件的Producer

代码

package kafka;import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessage;import kafka.producer.ProducerConfig;import java.util.Properties;/** * 这是一个简单的Kafka producer代码 * 包含两个功能: * 1、数据发送 * 2、数据按照自定义的partition策略进行发送 * * @author tuzq * @create 2017-06-18 17:13 */public class KafkaProducerSimple {    public static void main(String[] args) {        /**         * 1、指定当前Kafka producer生产的数据的目的地         * 创建topic可以输入以下命令,在kafka集群的任一节点进行创建         * bin/kafka-topics.sh --create --zookeeper hadoop11:2181 --replication-factor 1 --partitions 1 --topic test         */        String TOPIC = "test";        /**         * 2、读取配置文件         */        Properties props = new Properties();        /**         * key.serializer.class默认为serializer.class         */        props.put("serializer.class", "kafka.serializer.StringEncoder");        /**         * kafka broker对应的主机,格式为host1:port1,host2:port2         */        props.put("metadata.broker.list","hadoop1:9092");        /*         * request.required.acks,设置发送数据是否需要服务端的反馈,有三个值0,1,-1         * 0,意味着producer永远不会等待一个来自broker的ack,这就是0.7版本的行为。         * 这个选项提供了最低的延迟,但是持久化的保证是最弱的,当server挂掉的时候会丢失一些数据。         *         * 1,意味着在leader replica已经接收到数据后,producer会得到一个ack。         * 这个选项提供了更好的持久性,因为在server确认请求成功处理后,client才会返回。         * 如果刚写到leader上,还没来得及复制leader就挂了,那么消息才可能会丢失。         *         * -1,意味着在所有的ISR都接收到数据后,producer才得到一个ack。         * 这个选项提供了最好的持久性,只要还有一个replica存活,那么数据就不会丢失         */        props.put("request.required.acks", "1");        /*         * 可选配置,如果不配置,则使用默认的partitioner partitioner.class         * 默认值:kafka.producer.DefaultPartitioner         * 用来把消息分到各个partition中,默认行为是对key进行hash。         */        //props.put("partitioner.class","kafka.MyPartitioner");        //默认情况下是:        props.put("partitioner.class","kafka.producer.DefaultPartitioner");        /**         * 3.通过配置文件,创建生产者         */        Producer<String,String> producer = new Producer<String, String>(new ProducerConfig(props));        /**         * 4.通过for循环生产数据         */        int messageNo = 0;        while (true){            String messageStr = new String(" aaaa");            /**             * 5、调用producer的send方法发送数据             * 注意:这里需要指定 partitionKey,用来配合自定义的MyPartitioner进行数据分发             */            producer.send(new KeyedMessage<String, String>(TOPIC,messageNo+"",messageStr));            messageNo += 1;        }    }}

运行程序
进入/home/tuzq/software/kafka/servers/logs/kafka,执行以下命令:

[root@hadoop2 kafka]# cd /home/tuzq/software/kafka/servers/logs/kafka[root@hadoop2 kafka]# lscleaner-offset-checkpoint  itheima-1  learnKafka-0  meta.properties  recovery-point-offset-checkpoint  replication-offset-checkpoint  test-1[root@hadoop2 kafka]# cd test-1/[root@hadoop2 test-1]# ls00000000000000000000.index  00000000000000000000.log注意上面的.index是索引文件,.log是数据文件[root@hadoop2 test-1]# du -h380K    .[root@hadoop2 test-1]#

只要这个程序一直开着,那么发现du -h这个值就在不停的变大。

4.Kafka Consumer案例

代码:

package kafka;import kafka.consumer.Consumer;import kafka.consumer.ConsumerConfig;import kafka.consumer.ConsumerIterator;import kafka.consumer.KafkaStream;import kafka.javaapi.consumer.ConsumerConnector;import kafka.message.MessageAndMetadata;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class KafkaConsumerSimple implements Runnable {    public String title;    public KafkaStream<byte[], byte[]> stream;    public KafkaConsumerSimple(String title, KafkaStream<byte[], byte[]> stream) {        //获取自己的消费编号,以及要消费的kafkaStream        this.title = title;        this.stream = stream;    }    public void run() {        System.out.println("开始运行 " + title);        //6、从KafkaStream获取一个迭代器        ConsumerIterator<byte[], byte[]> it = stream.iterator();        /**         * 7、不停地从stream读取新到来的消息,在等待新的消息时,hasNext()会阻塞         * */        while (it.hasNext()) {            MessageAndMetadata<byte[], byte[]> data = it.next();            String topic = data.topic();            int partition = data.partition();            long offset = data.offset();            String msg = new String(data.message());            System.out.println(String.format(                    "Consumer: [%s],  Topic: [%s],  PartitionId: [%d], Offset: [%d], msg: [%s]",                    title, topic, partition, offset, msg));        }        System.err.println(String.format("Consumer: [%s] exiting ...", title));    }    public static void main(String[] args) throws Exception{        // 1、准备一些配置参数        Properties props = new Properties();        props.put("group.id", "testGroup");        props.put("zookeeper.connect", "hadoop11:2181,hadoop12:2181,hadoop13:2181");        props.put("auto.offset.reset", "largest");        props.put("auto.commit.interval.ms", "1000");        props.put("partition.assignment.strategy", "roundrobin");        ConsumerConfig config = new ConsumerConfig(props);        //2、准备要消费的topic        String topic = "test";        //3、创建一个consumer的连接器        // 只要ConsumerConnector还在的话,consumer会一直等待新消息,不会自己退出        ConsumerConnector consumerConn = Consumer.createJavaConsumerConnector(config);        //创建topicCountMap        Map<String, Integer> topicCountMap = new HashMap<String, Integer>();        topicCountMap.put(topic,1);        //4、获取每个topic对应的kafkaStream        Map<String, List<KafkaStream<byte[], byte[]>>> topicStreamsMap = consumerConn.createMessageStreams(topicCountMap);        //5、消费KafkaStream中的数据        List<KafkaStream<byte[], byte[]>> streams = topicStreamsMap.get(topic);        ExecutorService executor = Executors.newFixedThreadPool(4);        for (int i = 0; i < streams.size(); i++)            executor.execute(new KafkaConsumerSimple("consumer" + (i + 1), streams.get(i)));    }}

右键运行

注意:上满的三个小案例在运行之前,都要先检查以下kafka是否已经启动了,检查方式是执行jps命令,看看是否有kafka的进程

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新鞋鞋底吱吱响怎么办 新鞋鞋底滑了怎么办 工作中同事不配合怎么办 做体力活一身疼怎么办 大脑左则中动脉血管狭窄?怎么办 儿童体质差免疫力差怎么办 nba篮球大师体力不够怎么办 一千米差10秒怎么办 四十岁以后体力和耐力差怎么办 打篮球一打比赛就紧张怎么办 耐克空军鞋鞋底边胶掉了怎么办 鞋底踩到老鼠胶怎么办 头蒙怎么办最快最有效 备孕老公压力大怎么办 宝宝太兴奋不睡怎么办 我很烦只睡三小时觉怎么办才好 柯基精力太旺盛怎么办 孩子学习熬夜精力不足怎么办 肺癌晚期吃不下饭怎么办 这俩天吃药太多肝肾功能不好怎么办 跑步跑得头疼晕怎么办 吃完辣的想吐怎么办 体育生暑假训练太累怎么办 高强度运动后性功能不好怎么办 运动后第二天全身酸痛怎么办 运动后心慌想吐怎么办 激素停后全身疼怎么办 运动完头晕想吐怎么办 跑了步全身酸痛怎么办 运动后全身没力气怎么办 学完游泳不会换气怎么办 猫不吃饭精神不好怎么办 运动完头晕目眩想吐怎么办 酒后第二天恶心想吐怎么办 剧烈运动后肌肉酸痛怎么办 剧烈运动后吐了怎么办 长跑后头晕想吐怎么办 运动后一直想吐怎么办 跑多了恶心想吐怎么办 剧烈运动恶心想吐怎么办 长跑之后 恶心想吐怎么办