Kafka快速上手教程 2

来源:互联网 发布:mysql front 注释乱码 编辑:程序博客网 时间:2024/06/06 04:48

使用 Java 操作 Kafka

1.1 实验内容

前面一个课程讲解了 Kafka 的一些入门知识,本节课将介绍如何使用 Java 语言进行 Kafka 生产者和消费者代码的编写,毕竟大家使用 Kafka 集群是想发送消息到 Kafka ,然后从 Kafka 取出消息。学习完本课程,你将对 kafka 有深入的了解,很快上手。

1.2 课程来源

参考资料:http://blog.sina.com.cn/s/blog_67196ddc0102w80o.html

1.3. 实验知识点

  • 生产者
  • 消费者
  • java代码编写

1.4 实验环境

  • hadoop 2.6.1
  • kafka_2.10-0.8.1.1
  • Xfce 终端

1.5 适合人群

本课程属于中等难度级别,适合对大数据开发有兴趣,需要进行大量日志传输,并且有 Kafka 基础的人群。

二、实验步骤

2.1 准备工作

我们已经在实验楼环境里下载并配置启动 hadoop-2.6.1 所需的文件,免除您配置文件的麻烦,您可以在 /opt 找到,只需格式化并启动 hadoop 进程即可。

双击打开桌面上的 Xfce 终端,用 sudo 命令切换到 hadoop 用户,hadoop 用户密码为 hadoop,用 cd 命令进入 /opt目录。

$ su hadoop$ cd /opt/

此处输入图片的描述

在 /opt 目录下格式化 hadoop。

$ hadoop-2.6.1/bin/hdfs namenode -format

此处输入图片的描述

在 /opt 目录下启动 hadoop 进程。

$ hadoop-2.6.1/sbin/start-all.sh

此处输入图片的描述

用 jps 查看 hadoop 进程是否启动。

此处输入图片的描述

在 /opt/ 目录下,用 wget 命令下载 slf4j-1.7.22.zip 并解压。

$ sudo wget http://labfile.oss.aliyuncs.com/courses/785/slf4j-1.7.22.zip$ sudo  unzip slf4j-1.7.22.zip

此处输入图片的描述

此处输入图片的描述

复制 slf4j-nop-1.7.22.jar 到Kafka 解压包的 lib 目录下。

$ sudo cp slf4j-1.7.22/slf4j-nop-1.7.22.jar kafka_2.10-0.8.1.1/libs

此处输入图片的描述

双击打开 eclipse -> file -> New -> Java Project

此处输入图片的描述

输入 Project name -> 选择 javaSe-1.7-> Finish

此处输入图片的描述

右键 src -> New -> Package

此处输入图片的描述

输入包名 -> Finish

此处输入图片的描述

添加 kafka jar

此处输入图片的描述

点击 Libraries->Add External JARs...->选中已经下载的 kafka libs目录下的jar->确定

此处输入图片的描述

点击 OK

此处输入图片的描述

2.2 编写 Produce

右键 sys.kafka -> New -> Class

此处输入图片的描述

输入类名 -> 确认

此处输入图片的描述

ProducerDemo.java如下。

package syl.kafka;import java.util.Properties;import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessage;import kafka.producer.ProducerConfig;public class ProducerDemo {    public static void main(String[] args) throws Exception {        Properties props = new Properties();        //zk        props.put("zk.connect", "localhost:2181");        //kafka broker        props.put("metadata.broker.list","localhost:9092");        //serialize        props.put("serializer.class", "kafka.serializer.StringEncoder");        ProducerConfig config = new ProducerConfig(props);        Producer<String, String> producer = new Producer<String, String>(config);        // read socket        for (int i = 1; i <= 100000; i++) {            //Thread.sleep(50);            producer.send(new KeyedMessage<String, String>("test",                    "message: " + i ));        }    }}

2.3 编写 Consumer

右键点击 syl.kafka -> New -> Class

此处输入图片的描述

输入类名 -> 确认

此处输入图片的描述

ConsumerDemo.java如下。

package syl.kafka;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties;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;public class ConsumerDemo {    private static final String topic = "test";    private static final Integer threads = 1;    public static void main(String[] args) {        Properties props = new Properties();        //zk        props.put("zookeeper.connect", "localhost:2181");        //group        props.put("group.id", "group1");        //offset        props.put("auto.offset.reset", "smallest");        ConsumerConfig config = new ConsumerConfig(props);        ConsumerConnector consumer = Consumer.createJavaConsumerConnector(config);        Map<String, Integer> topicCountMap = new HashMap<String, Integer>();        topicCountMap.put(topic, 1);        Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);        List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);        for(final KafkaStream<byte[], byte[]> kafkaStream : streams){            new Thread(new Runnable() {                @Override                public void run() {                    for(MessageAndMetadata<byte[], byte[]> mm : kafkaStream){                        String msg = new String(mm.message());                        System.out.println(msg);                    }                }            }).start();        }    }}

启动 ZooKeeper 服务器。

$ /bin/zookeeper-server-start.sh config/zookeeper.properties &

此处输入图片的描述

接下来,启动 kafka 服务器。

$bin/kafka-server-start.sh config/server.properties &

此处输入图片的描述

上节课我们创建了 test 主题,并且 ProducerDemo.java 里指定了主题 test,所以可以直接使用。

此处输入图片的描述

若没有 test 主题,可以使用以下方式创建(若存在主题,跳过此步)。

$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

2.4 测试

用一个 comsumer 从 test 主题中读取信息

$ bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic test

此处输入图片的描述

运行写好的 ProducerDemo.java,同时观察消费者端的变化。

此处输入图片的描述

消费者 Xfce 终端不断消费消息。

此处输入图片的描述

停掉ProducerDemo.java,先运行ConsumerDemo.java

此处输入图片的描述

等待接收信息。

此处输入图片的描述

查看 Eclipse 的 ConsumerDemo 的 Console 及消费者 Xfce 终端

再次运行 ProducerDemo.java

此处输入图片的描述

观察结果。

此处输入图片的描述

三、实验总结

本节课程介绍了如何使用 java 编写生产者消费者并实践操作,对深入学习 kafka 有很大帮助。

四、参考文献

  • http://kafka.apache.org/documentation.html。