Kafka基本概念与应用场景

一、Kafka的定义

Apache Kafka是一种分布式的、基于发布/订阅的消息系统,由Scala语言编写而成。它具备快速、可扩展、可持久化的特点。Kafka最初由LinkedIn开发,并于2011年初开源, 2012年10月从Apache孵化器毕业,成为Apache基金会的顶级项目。目前,越来越多的开源分布式处理系统支持与Kafka集成,例如:Apache Storm、Spark。也有越来越多的公司在Kafka的基础上建立了近乎实时的信息处理平台,例如:LinkedIn、Netflix、Uber和Verizon。在国内也有很多互联网公司在生产环境中使用Kafka作为其消息中间件。

二,Kafka的应用场景

1,消息系统:

Kafka支持Topic广播类型的消息,具备高可靠性和容错机制。同时Kafka也可以保证消息的顺序性和可追溯性。传统的消息系统很难实现这些消息系统的特性。同时,Kafka可以将消息持久化保存到磁盘,从而有效地减少数据丢失的风险。从这个角度看,Kafka也可以看成是一个数据存储系统。

2,大数据流式计算处理:

在大数据计算领域中,计算主要分为大数据离线计算和大数据流式计算。可以将流式数据进行实时采集然后缓存到Kafka中,从而进一步通过Storm、SparkStreaming和Flink DataStream进行数据的实时计算。

3,系统的解耦:

由于Kafka支持异步的消息机制,可以将Kafka用于系统的解耦设计。这样,一个系统的架构变动,就不会影响另一个系统的运行。

4,持久性日志

Kafka可以为外部系统提供一种持久性日志的分布式系统。日志可以在多个节点间进行备份,Kafka为故障节点数据恢复提供了一种重新同步的机制。同时,Kafka很方便与HDFS和Flume进行整合,这样就方便将Kafka采集的数据持久化到其他外部系统。

5,网站用户行为追踪

为了更好地了解用户行为、操作习惯,改善用户体验,进而对产品升级改进,将用户操作轨迹、内容等信息发送到Kafka集群上,通过Hadoop、Spark或Strom等进行数据分析处理,生成相应的统计报告,为推荐系统推荐对象建模提供数据源,进而为每个用户进行个性化推荐。

三、Kafka的架构

Kafka基本概念与应用场景_第1张图片

1,Producers(生产者)

生产者将数据推送给经纪人。 当新代理启动时,所有生产者搜索它并自动向该新代理发送消息。 Kafka生产者不等待来自代理的确认,并且发送消息的速度与代理可以处理的一样快。

2,Consumers(消费者)

因为Kafka代理是无状态的,这意味着消费者必须通过使用分区偏移来维护已经消耗了多少消息。 如果消费者确认特定的消息偏移,则意味着消费者已经消费了所有先前的消息。 消费者向代理发出异步拉取请求,以具有准备好消耗的字节缓冲区。 消费者可以简单地通过提供偏移值来快退或跳到分区中的任何点。 消费者偏移值由ZooKeeper通知。

3,Broker(代理)

Kafka集群通常由多个代理组成以保持负载平衡。 Kafka代理是无状态的,所以他们使用ZooKeeper来维护它们的集群状态。 一个Kafka代理实例可以每秒处理数十万次读取和写入,每个Broker可以处理TB的消息,而没有性能影响。 Kafka经纪人领导选举可以由ZooKeeper完成。

4,ZooKeeper

ZooKeeper用于管理和协调Kafka代理。 ZooKeeper服务主要用于通知生产者和消费者Kafka系统中存在任何新代理或Kafka系统中代理失败。 根据Zookeeper接收到关于代理的存在或失败的通知,然后生产者和消费者采取决定并开始与某些其他代理协调他们的任务。

四、Kafka的特性

1,消息持久化

Kafka高度依赖于文件系统来存储和缓存消息。说到文件系统,大家普遍认为磁盘读写慢,依赖于文件系统进行存储和缓存消息势必在性能上会大打折扣,其实文件系统存储速度快慢一定程度上也取决于我们对磁盘的用法。据Kafka官方网站介绍:6块7200r/min SATA RAID-5阵列的磁盘线性写的速度为600 MB/s,而随机写的速度为100KB/s,线性写的速度约是随机写的6000多倍。由此看来磁盘的快慢取决于我们是如何去应用磁盘。加之现代的操作系统提供了预读(read-ahead)和延迟写(write-behind)技术,使得磁盘的写速度并不是大家想象的那么慢。同时,由于Kafka是基于JVM(Java Virtual Machine)的,而Java对象内存消耗非常高,且随着Java对象的增加JVM的垃圾回收也越来越频繁和繁琐,这些都加大了内存的消耗。鉴于以上因素,使用文件系统和依赖于页缓存(page cache)的存储比维护一个内存的存储或是应用其他结构来存储消息更有优势,因此Kafka选择以文件系统来存储数据。
消息系统数据持久化一般采用为每个消费者队列提供一个 B 树或其他通用的随机访问数据结构来维护消息的元数据,B树操作的时间复杂度为O(logn
),O(logn
)的时间复杂度可以看成是一个常量时间,而且B树可以支持各种各样的事务性和非事务性语义消息的传递。尽管B树具有这些优点,但这并不适合磁盘操作。目前的磁盘寻道时间一般在10ms以内,对一块磁盘来说,在同一时刻只能有一个磁头来读写磁盘,这样在并发IO能力上就有问题。同时,对树结构性能的观察结果表明:其性能会随着数据的增长而线性下降。鉴于消息系统本身的作用考虑,数据的持久化队列可以建立在简单地对文件进行追加的实现方案上。因为是顺序追加,所以Kafka在设计上是采用时间复杂度O(1)的磁盘结构,它提供了常量时间的性能,即使是存储海量的信息(TB级)也如此,性能和数据的大小关系也不大,同时Kafka将数据持久化到磁盘上,这样只要磁盘空间足够大数据就可以一直追加,而不会像一般的消息系统在消息被消费后就删除掉,Kafka提供了相关配置让用户自己决定消息要保存多久,这样为消费者提供了更灵活的处理方式,因此Kafka能够在没有性能损失的情况下提供一般消息系统不具备的特性。
正是由于Kafka将消息进行持久化,使得Kafka在机器重启后,已存储的消息可继续恢复使用。同时Kafka能够很好地支持在线或离线处理、与其他存储及流处理框架的集成。

2,高吞吐量

高吞吐量是Kafka设计的主要目标,Kafka将数据写到磁盘,充分利用磁盘的顺序读写。同时,Kafka在数据写入及数据同步采用了零拷贝(zero-copy)技术,采用sendFile()函数调用,sendFile()函数是在两个文件描述符之间直接传递数据,完全在内核中操作,从而避免了内核缓冲区与用户缓冲区之间数据的拷贝,操作效率极高。Kafka还支持数据压缩及批量发送,同时Kafka将每个主题划分为多个分区,这一系列的优化及实现方法使得Kafka具有很高的吞吐量。经大多数公司对Kafka应用的验证,Kafka支持每秒数百万级别的消息。

3,扩展性

Kafka要支持对大规模数据的处理,就必须能够对集群进行扩展,分布式必须是其特性之一,这样就可以将多台廉价的PC服务器搭建成一个大规模的消息系统。Kafka依赖ZooKeeper来对集群进行协调管理,这样使得Kafka更加容易进行水平扩展,生产者、消费者和代理都为分布式,可配置多个。同时在机器扩展时无需将整个集群停机,集群能够自动感知,重新进行负责均衡及数据复制。

4, 多客户端支持

Kafka核心模块用Scala语言开发,但Kafka支持不同语言开发生产者和消费者客户端应用程序。0.8.2之后的版本增加了Java版本的客户端实现,0.10之后的版本已废弃Scala语言实现的Producer及Consumer,默认使用Java版本的客户端。Kafka提供了多种开发语言的接入,如Java、Scala、C、C++、Python、Go、Erlang、Ruby、Node.js等,感兴趣的读者可以自行参考https://cwiki.apache.org/confluence/display/KAFKA/Clients。同时,Kafka支持多种连接器(Connector)的接入,也提供了Connector API供开发者调用。Kafka与当前主流的大数据框架都能很好地集成,如Flume、Hadoop、HBase、Hive、Spark、Storm等。

5,安全机制

当前版本的Kafka支持以下几种安全措施:
通过SSL和SASL(Kerberos),SASL/PLAIN验证机制支持生产者、消费者与代理连接时的身份认证;
支持代理与ZooKeeper连接身份验证;
通信时数据加密;
客户端读、写权限认证;
Kafka支持与外部其他认证授权服务的集成。

6, 数据备份

Kafka可以为每个主题指定副本数,对数据进行持久化备份,这可以一定程度上防止数据丢失,提高可用性。

7,轻量级

Kafka的代理是无状态的,即代理不记录消息是否被消费,消费偏移量的管理交由消费者自己或组协调器来维护。同时集群本身几乎不需要生产者和消费者的状态信息,这就使得Kafka非常轻量级,同时生产者和消费者客户端实现也非常轻量级。

8,消息压缩

Kafka支持Gzip、Snappy、LZ4这3种压缩方式,通常把多条消息放在一起组成MessageSet,然后再把MessageSet放到一条消息里面去,从而提高压缩比率进而提高吞吐量。

你可能感兴趣的:(大数据,KafKa,kafka,大数据,分布式)