Kafka 安装与入门

来源:互联网 发布:java在线运行 编辑:程序博客网 时间:2024/05/17 07:38

一、概述

KafkaLinkedin201012月份开源的消息系统,它主要用于处理活跃的流式数据。活跃的流式数据在web网站应用中非常常见,这些数据包括网站的pv、用户访问了什么内容,搜索了什么内容等。这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计处理。

传统的日志分析系统提供了一种离线处理日志信息的可扩展方案,但若要进行实时处理,通常会有较大延迟。而现有的消(队列)系统能够很好的处理实时或者近似实时的应用,但未处理的数据通常不会写到磁盘上,这对于Hadoop之类(一小时或者一天只处理一部分数据)的离线应用而言,可能存在问题。Kafka正是为了解决以上问题而设计的,它能够很好地离线和在线应用

下图是KafKa部署结构


kafka是显式分布式架构,producerbrokerKafka)和consumer都可以有多个。Kafka的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。

因为项目的需要这边要安装部署,这里讲述下kafka的安装和一些简单的入门操作

二、kafka安装

kafka的下载地址http://kafka.apache.org/downloads.html

这边用的是kafka_2.9.2-0.8.1.1.tgz,因为这个是官网推荐的稳定版本

具体地址

http://apache.fayea.com/apache-mirror/kafka/0.8.1.1/kafka_2.9.2-0.8.1.1.tgz

 

下载到服务器上,然后解压文件。

> tar -xzf kafka_2.9.2-0.8.1.1.tgz> cd kafka_2.9.2-0.8.1.1

这样就安装完成了……

三、kafka入门

3.1、启动

Kafka 需要使用zookeeper,因此在使用kafka前,需要先安装zookeeper,大家可以看我的这篇文章来安装zookeeper单机或者集群

http://blog.csdn.net/looklook5/article/details/40826241

安装完zookeeper后,启动zookeeper

 

然后启动kafka

> bin/kafka-server-start.sh config/server.properties

从命令中可以看出启动kafka 是使用配置文件config/server.properties

配置文件中的一些主要配置

#一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic,这里broker的ID 必须是整数。broker.id=128#kafka 服务侦听端口port=9092#kafka 服务的hostname ,注意这个默认是localhost,记得改过来。host.name=carl#为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。这里设定partition的个数num.partitions=2#消息队列的存储目录log.dirs=/tmp/kafka-logs#日志的保留小时log.retention.hours=168# zookeeper的设置zookeeper.connect=carl:2181,slave1:2181,slave2:2181

3.2、创建话题

所谓话题,我们可以直接理解为一个队列

创建话题命令

> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

这里说明下如果Topic的"replication factor"为N,那么允许N-1个kafka实例失效

查看话题列表的命令

> bin/kafka-topics.sh --list --zookeeper localhost:2181test

我们可以查看之前配置文件里设置的log.dirs(消息队列的存储目录)来看话题是否创建

[root@carl kafka-logs]# lltotal 40-rw-rw-r-- 1 hadoop hadoop   32 Nov 18 15:34 recovery-point-offset-checkpoint-rw-rw-r-- 1 hadoop hadoop   33 Nov 18 15:34 replication-offset-checkpointdrwxrwxr-x 2 hadoop hadoop 4096 Nov 18 13:49 test-0

因为我们只设置了一个分区,因此这里关于test的话题就一个,即test-0,进入目录

[root@carl kafka-logs]# cd test-0[root@carl test-0]# lltotal 8-rw-rw-r-- 1 hadoop hadoop 10485760 Nov 18 14:32 00000000000000000000.index-rw-rw-r-- 1 hadoop hadoop        0 Nov 18 14:32 00000000000000000000.log

其中,.log即为消息存储的日志,默认每过160小时会清除一次

 

3.3、生产者发送消息

生产者就是往kafka发消息的客户端Kafka使用一个命令行客户端将从一个文件或标准输入接受输入并把它作为消息的输出。

运行生产者然后键入一些消息到控制台发送到服务器

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test This is a messageThis is another message

如果发送成功,我们可以查看之前配置文件里设置的log.dirs(消息队列的存储目录)来看消息是否传过来了,即.log 文件应该大小不为0了。

 

3.4、启动消费者

消费者也就是从kafka取消息的客户端

Kafka 也使用一个命令行客户端将从一个文件或标准输入接受生产者对于话题的输出消息。

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginningThis is a messageThis is another message

这里说明下from-beginning 是指从头取消息

 

3.5、kafka集群的安装

这里可以参考这篇日志进行kafka集群安装,我觉得这篇写的不错

http://blog.csdn.net/zeroOneMan/article/details/40855937

 

3.6、Producer JAVA API

这里主要是对生产者的一些设置、和发送消息

ProducerConfig config = new ProducerConfig(props);Producer<String, String> producer = new Producer<String, String>(config);producer.send(new KeyedMessage<String, String>(话题,内容));

以上是三个关键配置设置配置、初始化producer和发送消息

我们先启动一个test 话题的消费者

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test 

这次不重新读取所有消息了。

 

下面是代码

import java.util.Properties;import java.util.Random;import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessage;import kafka.producer.ProducerConfig;public class SendMessage {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubProperties props = new Properties();props.put("zookeeper.connect", "carl:2181,slave1:2181,slave2:2181");props.put("serializer.class", "kafka.serializer.StringEncoder");props.put("producer.type", "async");props.put("compression.codec", "1");props.put("metadata.broker.list", "carl:9092");ProducerConfig config = new ProducerConfig(props);Producer<String, String> producer = new Producer<String, String>(config);for(int i=0;i<10;i++){producer.send(new KeyedMessage<String, String>("test",String.valueOf(i)));}producer.close();System.out.println("send over ------------------");}}

这里要注意下,如果在windows 上使用eclipse 运行程序的话,这里写的hostname 要在本机的hosts里进行设置,win7的hosts目录为C:\Windows\System32\drivers\etc 

运行后输出


[hadoop@carl kafka_2.9.2-0.8.1.1]$ bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test0123456789

可以看到消息正确输出了。

0 0
原创粉丝点击