前言
从本篇开始,带你一起领略Kafka的世界,下面重点介绍它的下载、安装,带你避坑。
提示:如果你只是想解决“bin/kafka-server-stop.sh无效”的问题,直接下滑到文章尾部的4.2章节进行查看!
一、Kafka介绍
1.1 什么是 Kafka
Kafka 是 Apache 基金会开源的一个分布式发布 - 订阅消息中间件,流处理平台。
它起源于 LinkedIn,由 Scala 和 Java两种语言编写而成。
在2011 年成为 Apache 项目,2012 成为 Apache 基金会下顶级项目。
1.2 为什么要用 Kafka
Kafka 专为分布式高吞吐系统而设计,支持离线、在线消费消息。
相比较其他消息中间件,如 RabbitMq 等,Kafka 具有更好的吞吐量,内置分区,复制和固有的容错能力,使得它非常适合应用在大数据领域。
1.3 kafka的特点
低延迟 - Kafka 支持低延迟消息传递,速度极快,能达到 200w 写/秒;
高性能 - Kafka对于消息的发布、订阅都具有高吞吐量。即使存储了 TB 级的消息,依然能够保证稳定的性能,日处理数据量可超过1 PB;
可靠性 - Kafka 是分布式,分区,复制和容错的,保证零停机和零数据丢失。
可拓展性 - Kafka 支持集群水平拓展。
耐用性 - Kafka 使用"分布式提交日志",消息能够快速的持久化的磁盘上。
1.4 kafka高吞吐率实现
为了增加存储能力,Kafka将所有的消息都写入到了低速大容量的硬盘。
Kafka采用以下方式实现高吞吐率:
顺序读写:Kafka将消息顺序追加到Partition中,顺序读写要快于随机读写。
批量发送:Kafka允许批量发送模式。
消息压缩:Kafka允许对消息集合进行压缩。
操作系统页缓存:不直接写IO,直接写入页缓存;消费时大多命中缓存。
Zero Copy:Kafka的生产者、消费者API对于Kafka消息采用零拷贝实现。Java类库通过java.nio.channels.FileChannel中的transferTo()方法(底层sendfile系统调用)在Linux和UNIX系统上支持Zero Copy,内核直接将数据从磁盘文件拷贝到Socket套接字,而无需通过应用程序。
1.5 kafka基本组件
序号 | 组件名称 | 组件的作用 |
---|---|---|
1 | Broker | Kafka集群包含一个或多个服务器,这些服务器被称为Broker。 |
2 | Topic | 逻辑上通RabbitMQ的Queue队列相似,每条发布到Kafka集群的消息都必须有一个topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个Broker上,但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处。) |
3 | Partition | 它是物理概念上的分区,为了提供系统吞吐率,在物理上每个Topic会分成一个或多个Partition,每个Partition对应一个文件夹(存储对应分区的消息内容和索引文件)。 |
4 | Replica | 为防止其中一个partition数据丢失,Replica副本的概念。 每个partition都可以通过副本因子添加多个副本,即便有一台机器故障了,其他机器上也有备份的数据集群环境下也会有其他副本。 |
5 | Producer | 消息生产者,负责生产消息并发送到Kafka Broker。 |
6 | Consumer | 消息消费者,向Kafka Broker读取消息并处理的客户端。 |
7 | Consumer Group | 每个Consumer属于一个特定的组(可为每个Consumer指定属于一个组,若不指定则属于默认组),组可以用来实现一条消息被组内多个成员消费等功能。 |
二、Kafka同类产品对比
常规的 MQ 系统都有两个比较通用的缺陷:
1) 数据丢失(当消费者无法及时消费数据时数据会被丢失);
2) 早期MQ产品很难配合数据的波峰和波谷。
2.1 Flume
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力,过程依赖于hadoop,操作过程基于channel(大多基于内存)。
缺点:资源占用较大,巨量数据处理时,效率不高。
实际使用体验,兼顾采集和轻量化的数据处理,既采集数据又计算处理,个人两种场景能力都一般,建议使用功能专一组件,kafka+flink或kafka+spark。
2.2 Redis
Redis是一个基于Key-Value对的NoSQL数据库,但支持MQ功能,可以作为轻量级