kafka入门

1.概要

1.1简介

Apache kafka 是一个分布式的基于push-subscribe的消息系统,它具备快速、可扩展、可持久化的特点。它现在是Apache旗下的一个开源系统,作为hadoop生态系统的一部分,被各种商业公司广泛应用。它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/spark流式处理引擎。

1.2特性

高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒
可扩展性:kafka集群支持热扩展
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
高并发:支持数千个客户端同时读写

1.3应用场景
  1.日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
  2.消息系统:解耦和生产者和消费者、缓存消息等。
  3.用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过   

  4.订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
  5.运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
  6.流式处理:比如spark streaming和storm
  7.事件源

2.安装环境搭建

2.1 zookeeper

kafka的运行依赖于zoopeeker,可以从官网http://www.apache.org/dyn/closer.cgi/zookeeper/下载zoopeeker,笔者当前使用的是zookeeper-3.4.8,下载下来后如下图所示:


进入config文件夹,看一下有没有zoo.cfg文件,如果没有的话,复制一份zoo_sample.cfg重命名为zoo.cfg,打开将zoo.cfg文件的dataDir的值改成“\zookeeper-3.4.8\data”。

添加系统变量ZOOKEEPER_HOME:K:\Tools\JAVA\zookeeper\zookeeper-3.4.8(指向你zookeeper的安装目录下),然后再将";%ZOOKEEPER_HOME%\bin;"添加到Path变量中去。

进入CMD:输入zkserver运行。

2.2 kafka

下载kafka资源包,官网http://kafka.apache.org/downloads.html,笔者当前使用的是kafka_2.11-0.8.2.2


进入config文件夹修改server.properties文件,将log.dirs的值改成 “G:\Tools\JAVA\Kafka\kafka_2.11-0.8.2.2\kafka_2.11-0.8.2.2\kafka-logs”(指向你的安装目录下)。

然后打开cmd,进入安装目录的文件夹下:cd K:\Tools\JAVA\Kafka\kafka_2.11-0.8.2.2\kafka_2.11-0.8.2.2   回车

运行:.\bin\windows\kafka-server-start.bat .\config\server.properties。

如果在你运行时发现以下异常:

Unrecognized VM option 'UseCompressedOops'
Did you mean '(+/-)CheckCompressedOops'?
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

原因可能:你电脑的window是32位

解决办法:进入bin/windows目录下,然后打开kafka-run-class.bat文件,找到 -XX:+UseCompressedOops,去掉即可。

2.3 测试

1.开启zookeeper服务器
   zkserver 
2.开启kafaka服务器
   .\bin\windows\kafka-server-start.bat .\config\server.properties
3.创建topics
   kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
4.创建Producer:
   kafka-console-producer.bat --broker-list localhost:9092 --topic test
5.创建Consumer:
   kafka-console-consumer.bat --zookeeper localhost:2181 --topic test

发送者示意图:


接受者示意图:



如果你能正常执行得到以上结果,证明环境已经没问题了.


3.java api

使用java代码来实现消息分发:首先启动zookeeper和kafka服务器,并且创建好topics(我这里创建了一个yzrtopic).然后编写以下代码:

发送端:

package yzr;

import java.util.Properties;
import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;

public class porducer {
	private final Producer<String, String> producer;  
    public final static String TOPIC = "yzrtopic"; 
	public porducer(){
    	Properties props = new Properties();
		props.put("metadata.broker.list", "localhost:9092");
		//配置value的序列化类  
        props.put("serializer.class", "kafka.serializer.StringEncoder");  
          
        //配置key的序列化类  
        props.put("key.serializer.class", "kafka.serializer.StringEncoder"); 
        props.put("request.required.acks","-1"); 
		producer = new Producer<String, String>(new ProducerConfig(props));
	}
	 void produce() {  
	        int messageNo = 1;  
	        final int COUNT = 101;  
	  
	        int messageCount = 0;  
	        while (messageNo < COUNT) {  
	            String messgaekey = String.valueOf(messageNo);  
	            String messageData = "Hello kafka message :" + messgaekey;  
	            producer.send(new KeyedMessage<String, String>(TOPIC, messgaekey ,messageData));  
	            System.out.println(messageData);  
	            messageNo ++;  
	            messageCount++;  
	        }  
	          
	        System.out.println("Producer端全部产生了" + messageCount + "条消息!");  
	    } 
	public static void main(String[] args){
		new porducer().produce();  
	}
	
}


接收端:

package yzr;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;
import kafka.serializer.StringDecoder;
import kafka.utils.VerifiableProperties;

public class Consumer {
	 private final ConsumerConnector consumer; 
	 public final static String TOPIC = "yzrtopic"; 
	 private Consumer() {  
	        Properties props = new Properties();  
	          
	        // zookeeper 配置  
	        props.put("zookeeper.connect", "localhost:2181");  
	        // 消费者所在组  
	        props.put("group.id", "testgroup");  
	        props.put("consumer.id", "c.nick");
	  
	        ConsumerConfig config = new ConsumerConfig(props);  
	  
	        consumer = kafka.consumer.Consumer.createJavaConsumerConnector(config);  
	 }
	 void consume() {  
		 Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
         topicCountMap.put(TOPIC, new Integer(1));
         StringDecoder keyDecoder = new StringDecoder(new VerifiableProperties());  
         StringDecoder valueDecoder = new StringDecoder(new VerifiableProperties());  
         Map<String, List<KafkaStream<String, String>>> consumerMap = consumer.createMessageStreams(topicCountMap,keyDecoder,valueDecoder);
         KafkaStream<String, String> streams = consumerMap.get(TOPIC).get(0);
         ConsumerIterator<String, String> it = streams.iterator();  
         
         int messageCount = 0;  
         while (it.hasNext()){  
             System.out.println(it.next().message());  
             messageCount++;  
             if(messageCount == 100){  
                 System.out.println("Consumer端一共消费了" + messageCount + "条消息!");  
             }  
         }  
	 }
	 public static void main(String[] args) {
		 new Consumer().consume();  
	}
}
如果你在执行时发现错误,检查一下是否缺少了jar包.就像手机一样,当你想关掉一些进程又不知道怎么关的时候,就重启吧,在这里把全部都导入,肯定就不会报错.(不喜勿喷)


测试结果:先把接收端启动起来,然后执行发送端发送数据,看一下接收端是否能够自动接受到发送端发送的所有消息:



接受端:



参考链接:http://blog.csdn.net/lipeng_bigdata/article/details/51036099

本文源代码下载:下载案列代码

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值