@

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

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

这样的原则。

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 点目标都做到了。

1.4 Kafka 有哪些特征

消息和批次

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

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

模式

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

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

主题和分区

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

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

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

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

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

生产者和消费者

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

测试成功。

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

不要关闭!!

3.4.2 启动 Kafka 服务器

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

D:\Program Files\kafka_2.12-1.0.0

输入

.\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

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

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

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

Kafka 入门三问的更多相关文章

  1. 《OD大数据实战》Kafka入门实例

    官网: 参考文档: Kafka入门经典教程 Kafka工作原理详解 一.安装zookeeper 1. 下载zookeeper-3.4.5-cdh5.3.6.tar.gz 下载地址为: http://a ...

  2. Kafka入门介绍

    1. Kafka入门介绍 1.1 Apache Kafka是一个分布式的流平台.这到底意味着什么? 我们认为,一个流平台具有三个关键能力: ① 发布和订阅消息.在这方面,它类似一个消息队列或企业消息系 ...

  3. Kafka入门 --安装和简单实用

    一.安装Zookeeper 参考: Zookeeper的下载.安装和启动 Zookeeper 集群搭建--单机伪分布式集群 二.下载Kafka 进入http://kafka.apache.org/do ...

  4. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  5. 转 Kafka入门经典教程

    Kafka入门经典教程 http://www.aboutyun.com/thread-12882-1-1.html 问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic. ...

  6. Kafka 入门和 Spring Boot 集成

    目录 Kafka 入门和 Spring Boot 集成 标签:博客 概述 应用场景 基本概念 基本结构 和Spring Boot 集成 集成概述 集成环境 kafka 环境搭建 Spring Boot ...

  7. 全网最通俗易懂的Kafka入门!

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在这篇之前已经写过两篇基础文章了,强烈建议先去阅读: ...

  8. 【转帖】全网最通俗易懂的Kafka入门

    全网最通俗易懂的Kafka入门 http://www.itpub.net/2019/12/04/4597/ 前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://g ...

  9. 【转帖】Kafka入门介绍

    Kafka入门介绍 https://www.cnblogs.com/swordfall/p/8251700.html 最近在看hdoop的hdfs 以及看了下kafka的底层存储,发现分布式的技术基本 ...

随机推荐

  1. [python]函数返回多个return值

    python支持函数直接返回多个变量,具体用法如下: >>> def test(): ... a=2 ... b=3 ... return a,b ... >>> ...

  2. Debian, Ubuntu linux安装openjdk

    sudo apt-get install openjdk-8-jre 这只是单单安装了jre而已,不要安装这个 安装下面这个就行了 sudo apt-get install openjdk-8-jdk ...

  3. C#-非泛型集合的方法

    非泛型集合的类和接口位于System.Collections命名空间 如:列表.队列.位数组.哈希表和字典的集合     ArrayList 动态数组 可被单独索引的对象的有序集合可以使用索引在指定的 ...

  4. c#核心基础--类的构造方法

    一.构造方法 类的构造方法是类的成员方法的一种,它的作用是对类中的成员进行初始化操作.类的构造方法分为: 1.静态构造方法 2.实例构造方法 3.私有构造方法 1.静态构造方法 类的静态构造方法是类的 ...

  5. WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证

    为什么还要写这类文章?因为我看过网上很多讲解的都不够全面,而本文结合实际工作讲解了swaggerui文档,统一响应格式,异常处理,权限验证等常用模块,并提供一套完善的案例源代码,在实际工作中可直接参考 ...

  6. php的register_long_arrays可以关闭以提高性能

    如果你使用php5.0以上,在程序中没有使用$HTTP_*_VARS这种变量,那么就可以考虑将register_long_arrays设置为Off,来提高一点点性能.看下PHP手册中关于registe ...

  7. JavaScript -- 时光流逝(一):数据类型,变量,类型转换,函数

    JavaScript -- 知识点回顾篇(一):数据类型,变量,类型转换,函数 1. 数据类型 Boolean:值类型,布尔(逻辑)只能有两个值:true 或 false. Number:值类型,Ja ...

  8. Python里面search()和match()的区别

    转自https://www.cnblogs.com/aaronthon/p/9435967.html match()函数只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None searc ...

  9. JavaScript对象原型写法详解

        体现对象原型分步式写法 //原型分步式写法 //构造函数 function Person(){} //对象原型 Person.prototype.name = 'Avensatr'; Pers ...

  10. VS的快捷键汇总

    C#中的快捷键,可以更方便的编写代码 CTRL + SHIFT + B 生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O 打开项目 CTRL + ...