kafka

最近想测试一下kafka的性能,折腾了大半天才把kafka安装到window上。下文提供安装的整个过程,绝对是可用的完整的,同时提供完整的kafka java客户端代码,用于与kafka沟通。在这里必须吐槽一下,网上大部分关于如何把kafka安装到window上的文章,要么不完整,要么kafka客户端代码是错误的或者不是基于0.8版本的。但是必须提醒一下,这篇文章只是介绍了其中的一种安装方法,可能不是最简洁的。


1、软件准备

  • kafka_2.9.1-0.8.2.1.tgz,需要到kafka官网下载。
  • sbt-0.13.9.msi,需要到sbt官网下载下载。
  • git bash 网上大把,我用的是Git-1.9.4-preview20140611.exe
  • Eclipse
  • Maven
  • Java 7

2、kafka环境设置

2.1  切换到kafka目录

先解压kafka_2.9.1-0.8.2.1.tgz,例如解压到D:\sam.lin\software\kafka\kafka_2.9.1-0.8.2.1。使用git bash,切换到kafka目录下。例如:


kafka需要的一些组件可以使用sbt update命令得到,如下:


2.2 sbt update

敲打回车键后,会出现一个错误信息,"sbt: No such file or directory",这个时候你需要安装sbt,下载网址我在上面的【软件准备】中已经提供了。本文下载的是sbt-0.13.9.msi这个版本。

sbt update命令会开始下载组件,如果是第一次安装,这个过程比较漫长,耐心等待吧。
当出现[success]字样时,说明安装组件成功了。

2.3 sbt package

如下图:


当出现[success]字样时,说明命令执行成功了。

2.4 sbt sbt-dependency

如下图:


当出现[info] org.scala-sbt:sbt:0.13.8,说明命令执行成功了。
到此,kafka环境搭建完毕。接下来需要搭建zookeeper.

3、zookeeper环境设置

注意,安装zookeeper的时候,在window上使用shell来安装是没法成功的,至少我尝试很多次都没成功。其实kafka已经为我们提供了在window安装zookeeper的bat脚本了,这些脚本存放在kafka安装目录中的bin/window上,如下:




注意在这里不能使用git bash了,原因是git bash执行bat文件时,会报语法错误。我们换成window的cmd命令行。

3.1 修改zookeeper和kafka的配置文件

  1) 修改config目录下的server.properties文件,修改
log.dirs=/D/sam.lin/software/kafka/kafka_2.9.1-0.8.2.1/kafka-logs

  2) 修改config目录下的log4j.properties文件,修改
log4j.appender.kafkaAppender.File=/D/sam.lin/software/kafka/kafka_2.9.1-0.8.2.1/logs/server.log

  3) 修改config目录下的zookeeper.properties文件,加入或者修改
dataDir=/D/sam.lin/software/kafka/kafka_2.9.1-0.8.2.1/data/zookeeper

3.2 使用window cmd命令行界面,切换到/bin/window目录

3.3 启动zookeeper



命令:zookeeper-server-start.bat ../../config/zookeeper.properties
启动成功后,不要关闭这个cmd命令行界面,因为关闭它,zookeeper进程就停了。


4、启动kafka broker


命令:kafka-server-start.bat ../../config/server.properties

启动成功后,不要关闭这个cmd命令行界面,因为关闭它,kafka进程就停了。

5、创建topic


命令:kafka-run-class.bat kafka.admin.TopicCommand --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic hellotest

这个命令创建了名字为"hellotest"的topic。

6、发送消息

    
命令:kafka-console-producer.bat --broker-list localhost:9092 --topic hellotest
注意这里的hellotest就是刚才创建的topic。这个命令执行后,可以直接在命令行后面输入你要发的消息。

后面的samsamsam就我输入的,往hellotest这个topic发送的消息。下面我们创建消费者来消费消息。

7、接收消息


命令:kafka-console-consumer.bat --zookeeper localhost:2181 --topic hellotest --from-beginning

同样的,必须指定到hellotest这个topic消费消息,我在生产者的cmd命令行界面中输入samsamsam后,消息者cmd命令行界面立刻接收到了。


8、使用kafka提供的java 客户端来发送和接收消息

上面提到可以使用kafka自带的命令行工具来发送消息和接收消息,下面介绍一下使用java发送和接收消息。

8.1 发送者

     
package com.kafka;

import java.util.Properties;

import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;

public class Sender {

  public static void main(String[] args) {
    Properties prop = new Properties();
    prop.put("metadata.broker.list", "127.0.0.1:9092");
    prop.put("serializer.class", "kafka.serializer.StringEncoder");
    ProducerConfig producerConfig = new ProducerConfig(prop);
    Producer<String, String> producer = new<String, String> Producer(producerConfig);
    String topic = "hellotest";
    KeyedMessage<String, String> message = new<String, String> KeyedMessage(topic, "Sam Hello Test message2");
    producer.send(message);
    producer.close();
  }
}

8.2 消费者

package com.kafka;

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;
import java.util.concurrent.TimeUnit;

import kafka.consumer.ConsumerConfig;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;

public class ConsumerDemo {

  private final ConsumerConnector consumer;
  private final String topic;
  private ExecutorService executor;

  public ConsumerDemo(String zookeeper, String groupid, String aTopic) {
    consumer = kafka.consumer.Consumer.createJavaConsumerConnector(ConsumerProps(zookeeper, groupid));
    this.topic = aTopic;
  }

  public void run(int threads) {
    Map<String, Integer> topicMap = new HashMap<String, Integer>();
    topicMap.put(topic, new Integer(threads));
    Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicMap);
    List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);

    executor = Executors.newFixedThreadPool(threads);

    int numThread = 0;

    for (final KafkaStream stream : streams) {
      executor.submit(new ConsumerDemoRun(stream, numThread));
      numThread++;
    }
  }

  private static ConsumerConfig ConsumerProps(String zookeeper, String groupid) {

    Properties properties = new Properties(); // config properties file

    properties.put("zookeeper.connect", zookeeper);
    properties.put("group.id", groupid);
    properties.put("zookeeper.session.timeout.ms", "400");
    properties.put("zookeeper.sync.time.ms", "200");
    properties.put("auto.commit.interval.ms", "1000");
    properties.put("auto.offset.reset", "smallest");

    return new ConsumerConfig(properties);
  }

  public void shutdown() {
    if (consumer != null)
      consumer.shutdown();
    if (executor != null)
      executor.shutdown();

    try {
      if (!executor.awaitTermination(5000, TimeUnit.MILLISECONDS)) {
        System.out.println("Timed out waiting for consumer threads to shut down, exiting uncleanly");
      }
    } catch (InterruptedException e) {
      System.out.println("Interrupted during shutdown, exiting uncleanly");
    }
  }

  public static void main(String[] args) {
    String zookeeper = "localhost:2181";
    String groupid = "group1";
    String topic = "hellotest";
    int threads = 1;

    ConsumerDemo test = new ConsumerDemo(zookeeper, groupid, topic);
    test.run(threads);

    try {
      Thread.sleep(10000);
    } catch (InterruptedException ie) {
    }

    test.shutdown();
  }
}

要运行上面的代码,需要加入如下依赖
                 <dependency>
			<groupId>org.apache.kafka</groupId>
			<artifactId>kafka_2.9.2</artifactId>
			<version>0.8.2.1</version>
		</dependency>



总结:

在window上安装kafka还挺麻烦的,上面提供的安装方式比较繁琐,应该有更加简单的方式。目前还没找到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值