Kafka 入门三问

@

当我在学习一个新技术的时候, 入门阶段, 基本上都遵循

是什么->为什么->怎么用

这样的原则。

1 Kafka 是什么?

1.1 背景

Kafka 最初是 LinkedIn 的一个内部基础设施系统, 后续捐赠给了 Apache, 目前是 Apache 的一个顶级项目。

1.2 定位

在官网中, 现定位是分布式流处理平台

  1. 可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似
  2. 可以储存流式的记录,并且有较好的容错性
  3. 可以在流式记录产生时就进行处理

它可以用于两大类别的应用:

  1. 构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)
  2. 构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topic之间内部进行变化)

OK, 暂时了解这些就够了。

1.3 产生的原因

Kafka 产生的原因, 与其他类似的系统产生的原因相似。

在日常的程序中, 我们除了需要处理业务逻辑之外, 还需要对我们的程序进行一些额外的工作, 举个两类:

  1. 业务系统和应用程序的性能监控指标数据。
  2. 用户操作行为数据。

刚开始, 类似此类情况我们可以让程序直接连接到度量显示度量指标的应用程序上, 通过此连接将相应的数据推送过去, 进行显示

基础监控

这是比较基础的方案。 后面, 随着需求的增长, 需要分析更长时间片段的度量指标, 原先的一个性能监控服务器满足不了需求, 我们又增加了一台性能监控服务器。 在后面, 我们又多了几个应用, 又陆续增加了很多监控相关的服务器。 后续由于各种原因, 又增加了很多服务器。
多数据监控

显得一团糟糕。 此时, 维护成本就增加了。 因此, 我们决定进行改进, 专门做一个应用程序进行采集, 并给其他系统进行查询。
简单的发布与订阅系统

此时, 一个发布与订阅的系统就建成了。

那这只是度量指标的一个系统, 公司还有其他的, 比如日志, 用户行为跟踪, 如果都使用相同的方式创建这些系统, 则系统就变成这样

多发布与订阅系统

随着公司规模的增长, 需要搭建类似的系统越来越多, 相应又需要付出很多维护成本。同时, 系统之间的无法实现交互。

很显然, 我们需要对这些系统进行大一统, 同时进行改进。

因此, Kafka 就诞生了。

Kafka 在设计之初的目标:

  1. 为生产者和消费者提供一套简单的 API。
  2. 降低网络传输和磁盘存储开销;
  3. 具有高伸缩架构

很显然, 这 3 点目标都做到了。

Kafka

1.4 Kafka 有哪些特征

消息和批次

消息: Kafka 的数据单元。 一条消息在 Kafka 中可以看出数据库中的一条记录。 消息由字节数组组成, 对应有一个键, 键是在消息以可控的方式写入到分区时需要用到的。

批次: 一组消息, 这些消息属于同一个主题和分析。 如果每个消息但单独传输, 会大致大量的网络开销, 分批次传输可以降低。 但批次越大, 对应单位时间内需要处理的消息越多, 单个消息的传输时间越长。

模式

消息在 Kafka 中以字节数组存储, 因此, 如果我们以额外的结构来定义这些消息, 就可以让消息更好的被理解。

如 JSON, XML, 大家都很熟悉, 用起来也不错。 但在 Kafka 中推荐使用 Apache Avro, 是 Hadoop 的一款序列化的框架。

主题和分区

Kafka 的消息通过主题进行分类。 主题就好比数据库的表, 或者系统文件中的文件夹。

主题可以被分为若干分区, 一个分区就是一个提交日志。 通过分区, Kafka 可以实现数据的冗余和伸缩性。 同时, 分区可以在不同的服务器上, 达到一个主题跨越多个服务器。

分区

每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的commit log文件。分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。

在每一个消费者中唯一保存的元数据是offset(偏移量)即消费在log中的位置.偏移量由消费者所控制:通常在读取记录后,消费者会以线性的方式增加偏移量,但是实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录

消费者offset

消息以追加的方式写入分区, 然后以先入先出的顺序读取。 由于分区的存在, 无法保证主题消息的顺序, 但可以保证单个分区的顺序。

生产者和消费者

Kafka 的客户端就是 Kafka 的系统用户, 可以被分成两类: 生产者和消费者。

生产者产生消息。 一般情况下, 一个消息会被发布到一个主题上。 在默认情况下, 生产者会把消息均衡的分布到主题的所有分区中, 不需要关心特定消息具体在哪个区。 但在某些情况下, 生产者会把消息直接写到指定的分区。 通常是通过分区器和键来实现的, 分区器为键生成一个散列, 并将其映射到指定的分区上。

消费者订阅消息。 消费者订阅一个或多个主题, 并按照消息生成的顺序读取它们。 消费者使用一个消费组 名称来进行标识,即会有一个或多个消费者共同读取一个主题。 群组用来保证每个分区只能被一个消费者使用(但一个消费者可以消费多个分区)。 消费者和分区的映射, 通常称之为所有权关系。

broker 和 集群

broker 是一个独立的 Kafka 服务器。 broker 接收来自生产者的消息, 为消息设置偏移量, 并提交到磁盘中保存。 broker 为消费者提供服务, 对读取扥去的请求作出响应, 返回磁盘上的消息。 单个 broker 可以轻松处理数千分区和每秒百万级的消息量。

broker 是集群的组成部分。 每个集群有一个 broker 同时充当了集群控制器的角色。 负责将分区分配给 broker 和监控 broker。 在集群中, 一个分区从属于一个broker, 该 broker 被称为分区的首领。

1.5 Kafka 可以做什么

Kafka作为消息系统

Kafka 作为一款优秀的消息系统, 具有高吞吐量, 内置的分区, 备份冗余分布式等特点。

传统的消息队列:在队列中,消费者池从server读取数据,每条记录被池子中的一个消费者消费, 但队列队列不是多订阅者模式的—一旦一个进程读取了数据,数据就会被丢弃。

发布-订阅系统: 记录被广播到所有的消费者。 发布-订阅系统允许你广播数据到多个进程,但是无法进行扩展处理,因为每条消息都会发送给所有的订阅者

Kafka 消息队列, 在队列中,消费组允许你将处理过程分发给一系列进程(消费组中的成员)。 在发布订阅中,Kafka允许你将消息广播给多个消费组。

Kafka 作为存储系统

数据写入Kafka后被写到磁盘,并且进行备份以便容错。直到完全备份,Kafka才让生产者认为完成写入,即使写入失败Kafka也会确保继续写入

Kafka使用磁盘结构,具有很好的扩展性—50kb和50TB的数据在server上表现一致。

可以存储大量数据,并且可通过客户端控制它读取数据的位置,您可认为Kafka是一种高性能、低延迟、具备日志存储、备份和传播功能的分布式文件系统。

Kafka用做流处理

Kafka 流处理不仅仅用来读写和存储流式数据,它最终的目的是为了能够进行实时的流处理。

将 Kafka 已收集的数据提供给其他流式计算框架进行处理。

批处理

通过组合存储和低延迟订阅,流式应用程序可以以同样的方式处理过去和未来的数据。 一个单一的应用程序可以处理历史记录的数据,并且可以持续不断地处理以后到达的数据,而不是在到达最后一条记录时结束进程

2 为什么选择 Kafka

2.1 多个生产者

Kafka 支持多个生产者, 不管客户端在使用单个主题还是多个主题。

2.2 多个消费者

Kafka 支持多个消费者从一个单独的流系统上读取数据。 而且消费者之间互不影响。 多个消费者组成一个群组, 共享一个消息流, 并保证整个群主对每个给定消息只处理一次。

2.3 磁盘数据存储

Kafka 不仅支持多个消费者, 还允许消费者非实时地读取消息, 这要归功于 Kafka 的数据保留特性。 每个主题可以单独设置保留规则, 以便满足不同消费者的需求。 同时, 消费者可能因为处理速度慢或突发的流量高峰导致无法及时读取消息, 持久化可以保证数据不会丢失。

2.4 伸缩性

用户可以开始时只使用单个 broker, 后续随着数据量的增加, 不断的增加 broker 的数量。 多个 broker 可以很好的进行容错,容灾处理。

2.5 高性能

通过进行横向扩展生产者, 消费者和 broker, Kafka 可以轻松的处理巨大的数据流。

3 怎么使用 Kafka

我这次的使用安装是在 windows 上的(单机版)。

3.1 安装 JDK

JDK 怎么安装就不说了, 网上搜一下就出来了。

3.2 安装 zookeeper

3.2.1 下载

网址 http://zookeeper.apache.org/releases.html#download, 从中选择一个镜像地址, 下载最新的稳定版本, 我的版本是

zookeeper-3.4.13.tar.gz

3.2.2 解压

解压到指定的目录下, 我的 zookeeper 目录

D:\Program Files\zookeeper-3.4.13

3.2.3 修改配置文件

首先, 需要重命名, 打开

zookeeper-3.4.13\conf

将 “zoo_sample.cfg” 重命名为 “zoo.cfg ”。

打开 zoo.cfg, 更改数据目录

dataDir=D:\Program Files\zookeeper-3.4.13\temp

3.2.4 添加系统变量

在系统环境变量中添加 ZOOKEEPER_HOME, 值为 D:\Program Files\zookeeper-3.4.13

编辑已有的 path 系统变量,添加路径:%ZOOKEEPER_HOME%\bin

3.2.5 测试安装是否成功

管理员的权限打开 cmd, 运行 zkServer

zookeeper运行

测试成功。

3.3 安装 Kafka

3.3.1 下载

网址 http://kafka.apache.org/downloads, 选择指定的版本(我的是 kafka_2.12-1.0.0.tgz), 并选择相应的镜像进行下载。

3.3.2 解压

解压到指定的目录下, 我的 zookeeper 目录

D:\Program Files\kafka_2.12-1.0.0

3.3.3 修改配置文件

打开

kafka_2.12-1.0.0\config\server.properties

找到以下配置, 并修改

// log 目录
log.dirs=D:\\Program Files\\kafka_2.12-1.0.0\\kafka-logs
// zookeeper
zookeeper.connect=localhost:2181

3.4 测试

3.4.1 启动 zookeeper

管理员的权限打开 cmd, 运行 zkServer
zookeeper运行

不要关闭!!

3.4.2 启动 Kafka 服务器

打卡 cmd 命令窗口, 打开kafka所在安装目录。

D:\Program Files\kafka_2.12-1.0.0
打开kafka所在安装目录

输入

.\bin\windows\kafka-server-start.bat .\config\server.properties

启动成功, 不要关闭

3.4.3 创建 topic

打卡 cmd 命令窗口, 打开kafka所在安装目录。

运行

.\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic hello

创建hello话题

3.4.4 创建生产者

打卡 cmd 命令窗口, 打开kafka所在安装目录。

运行

.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic hello

创建生产者

可以随便输入一些内容

3.4.4 创建消费者

打卡 cmd 命令窗口, 打开kafka所在安装目录

运行

.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic hello --from-beginning

创建消费者

可以看到之前生产者输出的东西。

此时, 在生产者处在发送消息, 消费者就可以接收到。

posted @ 2018-10-22 14:02  阿进的写字台  阅读(909)  评论(2编辑  收藏  举报