安装kafka到window上,编写kafka java客户端连接kafka

原创 2015年08月27日 09:51:32

最近想测试一下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();
  }
}

代码二
package com.kafka;

import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;

public class ConsumerDemoRun implements Runnable {
  private KafkaStream aStream;
  private int aThread;

  public ConsumerDemoRun(KafkaStream stream, int thread) {
    aStream = stream; // set stream from main read
    aThread = thread; // set thread from main read
  }

  public void run() {

    ConsumerIterator<byte[], byte[]> iterator = aStream.iterator(); // used to
                                                                    // check
                                                                    // throughout
                                                                    // the list
                                                                    // continiously

    while (iterator.hasNext()) {
      System.out.println("Thread " + aThread + ": " + new String(iterator.next().message()));
    }
    System.out.println("Shutting down Thread: " + aThread);

  }
}


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



总结:

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

本地Consumer和Producer无法使用远程Kafka服务器的处理办法

之前连接公司的的Kafka服务器一直没有没有问题,最近在自己的服务器上装了一个Kafka做学习使用,安装完成后一直无法使用,处理过程可谓上一波三折,下面分享一下我的处理经验,以便帮助有需要的朋友,少走...
  • cysdxy
  • cysdxy
  • 2016-08-27 22:13
  • 3573

Kafka使用Java客户端进行访问

本文环境如下: 操作系统:CentOS 6 32位 JDK版本:1.8.0_77 32位 Kafka版本:0.9.0.1(Scala 2.11) 1. maven依赖包 or...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

基于flume-ng抓取mysql数据到kafka

flume是一个日志收集器,更多详细的介绍可以参照官网:http://flume.apache.org/   在apache flume的官网上没有找到sql数据源数据抓取的source, 可以...

Kafka安装配置及简单通道传输操作(kafka2.9.2)

Storm单机伪分布配置图文详细步骤一. Zookeeper安装配置(zookeeper3.4.6) 安装配置jdk 解压Zookeeper的tar安装包 修改配置文件vim conf/zoo.cf...

windows的eclipse下运行kafka工程

项目至少包含kafka-clients-0.10.1.1.jar 和kafka_2.10-0.10.1.1.jar及scala-library-2.10.6.jar,metrics-core-2.2....

用eclispe来调试Kafka源代码

我是看好Scala的,毕竟Kafka、Spark这两个大招太牛了,你想不用它都不行,所以Scala肯定会红火起来的! 看了2周的Scala了,Kafka也用了好几年了,终于可以把Kafka的源代码下下...

Kafka实践(三) java开发环境搭建

前面已经部署好了Kafka集群(伪分布式),下面要进入java开发环境搭建。 一、环境描述       1、win10下 eclipse (kepler)        2、本机建立了虚拟机 系...
  • csolo
  • csolo
  • 2016-09-06 14:21
  • 4239

漫游Kafka实战篇之客户端编程实例

Consumer API有两个级别。低级别的和一个指定的broker保持连接,并在接收完消息后关闭连接,这个级别是无状态的,每次读取消息都带着offset。 高级别的API隐藏了和brokers连接...

Kafka开发环境搭建

转自:http://my.oschina.net/ielts0909/blog/95440 如果你要利用代码来跑kafka的应用,那你最好先把官网给出的example先在单机环境和分...

漫游kafka实战篇之搭建Kafka开发环境

上篇文章中我们搭建了kafka的服务器,并可以使用Kafka的命令行工具创建topci,发送和接收消息。下面我们来搭建kafka的开发环境。 大家开发环境需要引入kafka的jar包,一种方式是将Ka...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)