作为Apach下一个优秀的开源消息队列框架,Kafka已经成为很多互联网厂商日志采集处理的第一选择。后面在实际应用场景中可能会应用到,因此就先了解了一下。经过两个晚上的努力,总算是能够基本使用。

操作系统:虚拟机Centos 6.5 

1、下载Kafka安装文件,首先进入官网,找到最新的稳定版本

wget http://mirrors.hust.edu.cn/apache/kafka/0.10.2.0/kafka_2.12-0.10.2.0.tgz

2、解压并拷贝到 需要的目录下,我的设定为 /usr/下

       先 cp   然后解压 tar -xzvf 

3、由于我本机已经安装了zookeeper,因此直接修改server.properties 文件

kafka 依赖java版本吗 kafka java客户端_kafka

4、启动服务  bin/kafka-server-start.sh config/server.properties ,问题来了 :



[root@localhost kafka_2.12-0.10.2.0]# Exception in thread "main" java.lang.UnsupportedClassVersionError: kafka/Kafka : Unsupported major.minor version 52.0 
 
 
 

   at java.lang.ClassLoader.defineClass1(Native Method) 
 
 
 

   at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
 
 
 

   at java.lang.ClassLoader.defineClass(ClassLoader.java:615)


启动报错,看提示,由于使用最新的kafka版本,需要1.8的JDK。而我本机查看目前是1.6。


 



5、更换JDK版本



使用wget下载1.8JDK,vim /etc/profile 更改JAVA_HOME的路径,source /etc/profile 后,执行 java -version 仍然显示为 1.6.



重启依然无效,后网上找到解决办法:



which  
   Java 
  
 
  

    /usr/bin/java 
  
 
  

    which javac 
  
 
  

    /usr/bin/javac



1.先将usr/bin目录下的先删除


rm -rf  java 
  
 
  

    rm -rf  javac


2.先将jdk1.8



ln -s   $JAVA_HOME/bin/java  /usr/bin/java 
  
 
  

    ln -s   $JAVA_HOME/bin/javac  /usr/bin/javac


6、启动服务  bin/kafka-server-start.sh config/server.properties  ,未报错



启动一个生产者 ,topic为test:



bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test


启动两个消费者


bin/kafka-console-consumer.sh --zookeeper 192.168.118.131:3181 --topic test --from-beginning  
  
 
  

    bin/kafka-console-consumer.sh --zookeeper 192.168.118.131:3181 --topic test --from-beginning



kafka 依赖java版本吗 kafka java客户端_运维_02

kafka 依赖java版本吗 kafka java客户端_操作系统_03

两个消费端均能收到服务端的信息。

7、尝试用java代码来接收信息,首先建立一个MAVEN工程,POM.xml文件加入依赖:

<dependency>
 <groupId>org.apache.kafka</groupId>
 <artifactId>kafka-clients</artifactId>
 <version>0.8.2.1</version>
 </dependency> <dependency>
 <groupId>org.apache.kafka</groupId>
 <artifactId>kafka_2.11</artifactId>
 <version>0.8.2.1</version>
 </dependency>

然后运行安装代码构建完成。具体调用代码如下

import java.util.List;
import java.util.Properties;
import java.util.concurrent.TimeUnit;import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.consumer.Whitelist;
import kafka.javaapi.consumer.ConsumerConnector;
import kafka.message.MessageAndMetadata;import org.apache.kafka.common.utils.CollectionUtils;
/** 
 * File Name:KafkaConsumer.java 
 * Package_Name:kafkaTest 
 * date:2017-3-25上午10:00:56 
 * Author : cao.zhi10 
 * 
 */
public class KafkaConsumer {
 public static void main(String[] args) throws Exception {
 Properties properties = new Properties(); 
 properties.put("zookeeper.connect", "192.168.118.131:3181"); 
 properties.put("auto.commit.enable", "true"); 
 properties.put("auto.commit.interval.ms", "60000"); 
 properties.put("group.id", "test"); 

 ConsumerConfig consumerConfig = new ConsumerConfig(properties); 

 ConsumerConnector javaConsumerConnector = Consumer.createJavaConsumerConnector(consumerConfig); 

 //topic的过滤器 
 Whitelist whitelist = new Whitelist("test"); 
 List<KafkaStream<byte[], byte[]>> partitions = javaConsumerConnector.createMessageStreamsByFilter(whitelist); 

 if (partitions==null) { 
 System.out.println("empty!"); 
 TimeUnit.SECONDS.sleep(1); 
 } 

 //消费消息 
 for (KafkaStream<byte[], byte[]> partition : partitions) { 

 ConsumerIterator<byte[], byte[]> iterator = partition.iterator(); 
 while (iterator.hasNext()) { 
 MessageAndMetadata<byte[], byte[]> next = iterator.next(); 
 System.out.println("partiton:" + next.partition()); 
 System.out.println("offset:" + next.offset()); 
 System.out.println("接收到message:" + new String(next.message(), "utf-8")); 
 } 
 } 
 }
}

执行main方法,一直报DISCONNECT异常,仔细分析启动日志发现一直在去尝试调用 localhost:9092 。搜索了下该问题,网上给的解决方案是修改 service.properties 里面的hostname 信息,但是目前最新版本已经取消了该节点,目前必须使用 listeners.

kafka 依赖java版本吗 kafka java客户端_kafka_04

 

 8、重新启动服务,生产者,消费者(注意必须用IP地址启动,否则会报错


bin/kafka-console-producer.sh --broker-list 192.168.118.131:9092 --topic test



kafka 依赖java版本吗 kafka java客户端_kafka_05

 

9、java代码启动后,在生产者crt界面输入可以正常接收信息,但是出现了乱码:




kafka 依赖java版本吗 kafka java客户端_kafka_06

 



 字符转换方式 GBK,UTF-8 都不行。后来想到原来实时查看服务器端日志也出现乱码的解决方式,于是修改了下 crt会话里面的编码方式,如下




kafka 依赖java版本吗 kafka java客户端_kafka_07

问题得到解决

kafka 依赖java版本吗 kafka java客户端_kafka 依赖java版本吗_08

kafka 依赖java版本吗 kafka java客户端_大数据_09