我主要是参考开发Kafka通用数据平台中间件强大的分布式消息中间件——kafkaKafka 在产品开发中的实践这几篇博客进行学习,并在自己笔记本上安装完成kafka并测试。

一. Kafka概述

  Kafka是Linkedin于2010年12月份创建的开源消息系统,它主要用于处理活跃的流式数据。活跃的流式数据在web网站应用中非常常见,这些活动数据包括页面访问量(Page View)、被查看内容方面的信息以及搜索情况等内容。 这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计分析。

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

1.1kafka结构:

Kafka中间件在系统开发中的应用_kafka


1.2 Kafka关键字:

•Broker : Kafka消息服务器,消息中心。一个Broker可以容纳多个Topic。

•Producer :消息生产者,就是向Kafka broker发消息的客户端。

•Consumer :消息消费者,向Kafka broker取消息的客户端。

•Zookeeper :管理Producer,Broker,Consumer的动态加入与离开。

•Topic :可以为各种消息划分为多个不同的主题,Topic就是主题名称。Producer可以针对某个主题进行生产,Consumer可以针对某个主题进行订阅。

•Consumer Group: Kafka采用广播的方式进行消息分发,而Consumer集群在消费某Topic时, Zookeeper会为该集群建立Offset消费偏移量,最新Consumer加入并消费该主题时,可以从最新的Offset点开始消费。

•Partition:Kafka采用对数据文件切片(Partition)的方式可以将一个Topic可以分布存储到多个Broker上,一个Topic可以分为多个Partition。在多个Consumer并发访问一个partition会有同步锁控制。

Kafka中间件在系统开发中的应用_大数据_02


1.3 消息收发流程:

•启动Zookeeper及Broker.

•Producer连接Broker后,将消息发布到Broker中指定Topic上(可以指定Patition)。

•Broker集群接收到Producer发过来的消息后,将其持久化到硬盘,并将消息该保留指定时长(可配置),而不关注消息是否被消费。

•Consumer连接到Broker后,启动消息泵对Broker进行侦听,当有消息到来时,会触发消息泵循环获取消息,获取消息后Zookeeper将记录该Consumer的消息Offset。

1.4 Kafka特性:

•高吞吐量

•负载均衡:通过zookeeper对Producer,Broker,Consumer的动态加入与离开进行管理。

•拉取系统:由于kafka broker会持久化数据,broker没有内存压力,因此,consumer非常适合采取pull的方式消费数据

•动态扩展:当需要增加broker结点时,新增的broker会向zookeeper注册,而producer及consumer会通过zookeeper感知这些变化,并及时作出调整。

•消息删除策略:数据文件将会根据broker中的配置要求,保留一定的时间之后删除。kafka通过这种简单的手段,来释放磁盘空间。

二、Kayka的应用场景:
1、消息队列
比起大多数的消息系统来说,Kafka有更好的吞吐量,内置的分区,冗余及容错性,这让Kafka成为了一个很好的大规模消息处理应用的解决方案。消息系统一般吞吐量相对较低,但是需要更小的端到端延时,并尝尝依赖于Kafka提供的强大的持久性保障。在这个领域,Kafka足以媲美传统消息系统,如ActiveMR或RabbitMQ。
2、行为跟踪
Kafka的另一个应用场景是跟踪用户浏览页面、搜索及其他行为,以发布-订阅的模式实时记录到对应的topic里。那么这些结果被订阅者拿到后,就可以做进一步的实时处理,或实时监控,或放到Hadoop/离线数据仓库里处理。
3、元信息监控
作为操作记录的监控模块来使用,即汇集记录一些操作信息,可以理解为运维性质的数据监控吧。
4、日志收集
日志收集方面,其实开源产品有很多,包括Scribe、Apache Flume。很多人使用Kafka代替日志聚合(log aggregation)。日志聚合一般来说是从服务器上收集日志文件,然后放到一个集中的位置(文件服务器或HDFS)进行处理。然而Kafka忽略掉文件的细节,将其更清晰地抽象成一个个日志或事件的消息流。这就让Kafka处理过程延迟更低,更容易支持多数据源和分布式数据处理。比起以日志为中心的系统比如Scribe或者Flume来说,Kafka提供同样高效的性能和因为复制导致的更高的耐用性保证,以及更低的端到端延迟。
5、流处理
这个场景可能比较多,也很好理解。保存收集流数据,以提供之后对接的Storm或其他流式计算框架进行处理。很多用户会将那些从原始topic来的数据进行阶段性处理,汇总,扩充或者以其他的方式转换到新的topic下再继续后面的处理。例如一个文章推荐的处理流程,可能是先从RSS数据源中抓取文章的内容,然后将其丢入一个叫做“文章”的topic中;后续操作可能是需要对这个内容进行清理,比如回复正常数据或者删除重复数据,最后再将内容匹配的结果返还给用户。这就在一个独立的topic之外,产生了一系列的实时数据处理的流程。Strom和Samza是非常著名的实现这种类型数据转换的框架。
6、事件源
事件源是一种应用程序设计的方式,该方式的状态转移被记录为按时间顺序排序的记录序列。Kafka可以存储大量的日志数据,这使得它成为一个对这种方式的应用来说绝佳的后台。比如动态汇总(News feed)。
7、持久性日志(commit log)
Kafka可以为一种外部的持久性日志的分布式系统提供服务。这种日志可以在节点间备份数据,并为故障节点数据回复提供一种重新同步的机制。Kafka中日志压缩功能为这种用法提供了条件。在这种用法中,Kafka类似于Apache BookKeeper项目。

我对于kafka的理解:
Kafka中间件把消息生产者producer和消息消费者consumer联系起来,消息生产者产生消息并发送到kafka中间件平台,消息消费者从kafka可以根据自己需求(数据传输率,感兴趣主题等)接受数据。而不是直接接受消息消费者的所有数据,这样势必会造成一些消息的冗余。所以kafka扮演的是一个缓冲者的作用。通过实验我们也知道在虚拟机Sual1上发送的消息在Sual3虚拟机上可以被接收,相反,在虚拟机Sual3上发送的消息在Sual1虚拟机上可以被接收,所以集群上的任意节点都可以接收消息。Kafka中间件可以消息处理的模式可以应用在很多场合。收集日志,寻找时间源,行为跟踪等。比如在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转。传统的企业消息系统并不是非常适合大规模的数据处理。Kafka就可以同时搞定在线应用(消息)和离线应用(数据文件,日志),因此kafka是一个分布式的,可划分的,多订阅者,冗余备份的持久性的服务。

安装kafka并启动测试:

在第一台虚拟机Sual1上启动kafka.

Kafka中间件在系统开发中的应用_大数据_03


在第二台虚拟机Sual3上启动kafka.

Kafka中间件在系统开发中的应用_kafka_04


在Sual1中创建主题test1并查看。

Kafka中间件在系统开发中的应用_数据_05

在Sual1中创建一个消息生产者(producer)来产生消息

Kafka中间件在系统开发中的应用_kafka_06


在Sual1虚拟机中创建消息消费者并接受消息

Kafka中间件在系统开发中的应用_数据_07


在Sual3虚拟机中接受Sual1消息生产者发送的消息并查看。

Kafka中间件在系统开发中的应用_大数据_08