kafka入门
来源:互联网 发布:怎样创建淘宝号 编辑:程序博客网 时间:2024/05/17 21:43
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
本文源代码下载:下载案列代码
- kafka(1)- kafka入门
- Kafka入门
- Kafka入门
- Kafka入门
- KAFKA入门
- Kafka入门
- Kafka入门
- kafka入门
- kafka入门
- kafka入门
- kafka入门
- kafka入门
- kafka入门
- kafka入门
- Kafka入门
- kafka入门
- kafka入门
- kafka入门
- 基于OpenCV的车牌识别系统之二 ——字符分割与识别
- 树莓派驱动学习之GPIO
- 校内赛数据结构(rise,rotinv,seqmod)
- MTMonkey 安装和部署
- JavaScript-父子dom同时绑定捕获冒泡点击事件时执行顺序
- kafka入门
- Mybatis自动生成代码
- appium初识
- Ubuntu 14.04 LTS 开机自动打开浏览器、vlc播放器等
- 477. Total Hamming Distance | 整数间数的二进制中不同的位数
- 纯属自己的心得
- cad如何转换成pdf文档格式
- el表达式在jsp页面不起作用的解决方法
- 关于unity3d发布WebGL出错需要注意的问题