一、Kafka介绍

Kafka是由LinkedIn开发的一个分布式的消息系统,底层使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与Kafka集成。

综上,Kafka是一种分布式的,基于发布/订阅的消息系统,能够高效并实时的吞吐数据,以及通过分布式集群及数据复制冗余机制(副本冗余机制)实现数据的安全


二、Kafka配置

1.从官网下载安装包 http://kafka.apache.org/downloads
2.上传到01虚拟机,解压
3.进入安装目录下的config目录
4.对server.properties进行配置配置示例:
broker.id=0
log.dirs=/home/software/kafka/kafka-logs
zookeeper.connect=hadoop01:2181,hadoop02:2181,hadoop03:2181
delete.topic.enable=true
advertised.host.name=192.168.234.21
advertised.port=9092
5.保存退出后,别忘了在安装目录下创建 kafka-logs目录
6.配置其他两台虚拟机,更改配置文件的broker.id编号(不重复即可)
7.先启动zookeeper集群
8.启动kafka集群
进入bin目录
执行:sh kafka-server-start.sh ../config/server.properties

三、Kafka使用

1.创建自定义的topic
在bin目录下执行:
sh kafka-topics.sh --create --zookeeper hadoop01:2181 --replication-factor 1 --partitions 1 --topic enbook
注:副本数量要小于等于节点数量
2.查看所有的topic
执行:sh kafka-topics.sh --list --zookeeper hadoop01:2181
3.启动producer
执行:sh kafka-console-producer.sh --broker-list hadoop01:9092  --topic  enbook
4.启动consumer
执行:[root@hadoop01 bin]# sh kafka-console-consumer.sh --zookeeper hadoop01:2181 --topic enbook --from-beginning
5.可以通过producer和consumer模拟消息的发送和接收
6.删除topic指令:
进入bin目录,执行:sh kafka-topics.sh --delete --zookeeper hadoop01:2181 --topic  enbook
可以通过配置 config目录下的 server.properties文件,加入如下的配置:配置示例:
delete.topic.enable=true

四、Kafka架构

1、producer:消息生产者,发布消息到 kafka 集群的终端或服务。
2、broker:kafka 集群中包含的服务器。broker (经纪人,消费转发服务)
3.、opic:每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的。
4、partition:partition 是物理上的概念,每个 topic 包含一个或多个 partition。kafka 分配的单位是 partition。
5、consumer:从 kafka 集群中消费消息的终端或服务。
6、Consumer group:high-level consumer API 中,每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。即组间数据是共享的,组内数据是竞争的。
7、replica:partition 的副本,保障 partition 的高可用。副本数量不宜过多,因为降低进群磁盘的利用率。比如3副本,磁盘利用率1/3.
8、leader:replica 中的一个角色, producer 和 consumer 只跟 leader 交互。
9、follower:replica 中的一个角色,从 leader 中复制数据。
10、controller:kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover。
11、zookeeper:kafka 通过 zookeeper 来存储集群的 meta 信息。


五、Topic与Partition

  1. Topic:每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic(主题)。
  2. Parition:是物理上的概念,每个Topic包含一个或多个Partition.

Topic在逻辑上可以被认为是一个queue,每条消息都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。

为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。若创建topic1和topic2两个topic,且分别有13个和19个分区,如下图所示。

因为每条消息都被append到该Partition中,属于顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。


六、Kafka消息流处理

Producer 写入消息序列图

流程说明:

  1. producer 先从 zookeeper 的 “/brokers/…/state” 节点找到该 partition 的 leader
  2. producer 将消息发送给该 leader
  3. leader 将消息写入本地 log
  4. followers 从 leader pull 消息,写入本地 log 后 leader 发送 ACK
  5. leader 收到所有 ISR 中的 replica 的 ACK 后,向 producer 发送 ACK。

七、kafka HA

7.1、概述

同一个 partition 可能会有多个 replica(对应 server.properties 配置中的 default.replication.factor=N)。

没有 replica 的情况下,一旦 broker 宕机,其上所有 patition 的数据都不可被消费,同时 producer 也不能再将数据存于其上的 patition。

引入replication 之后,同一个 partition 可能会有多个 replica,而这时需要在这些 replica 之间选出一个 leader,producer 和 consumer 只与这个 leader 交互,其它 replica 作为 follower 从 leader 中复制数据。

7.2、leader failover

  • 当 partition 对应的 leader 宕机时,需要从 follower 中选举出新 leader。在选举新leader时,一个基本的原则是,新的 leader 必须拥有旧 leader commit 过的所有消息。
  • 由写入流程可知 ISR 里面的所有 replica 都跟上了 leader,只有 ISR 里面的成员才能选为 leader。对于 f+1 个 replica,一个 partition 可以在容忍 f 个 replica 失效的情况下保证消息不丢失。
  • 比如 一个分区 有5个副本,挂了4个,剩一个副本,依然可以工作。

注意:kafka的选举不同于zookeeper,用的不是过半选举。

当所有 replica 都不工作时,有两种可行的方案:

  1. 等待 ISR 中的任一个 replica 活过来,并选它作为 leader。可保障数据不丢失,但时间可能相对较长。

  2. 选择第一个活过来的 replica(不一定是 ISR 成员)作为 leader。无法保障数据不丢失,但相对不可用时间较短。

kafka 0.8+ 使用第二种方式。此外, kafka 通过 Controller 来选举 leader。


八、Kafka的索引机制

  • 数据文件的分段与索引
  • Kafka解决查询效率的手段之一是将数据文件分段,可以配置每个数据文件的最大值,每段放在一个单独的数据文件里面,数据文件以该段中最小的offset命名。
  • 每个log文件默认是1GB生成一个新的Log文件,比如新的log文件中第一条的消息的offset 16933,则此log文件的命名为:000000000000000016933.log,此外,每生成一个log文件,就会生成一个对应的索引(index)文件。这样在查找指定offset的Message的时候,用二分查找就可以定位到该Message在哪个段中。
  • 数据文件分段使得可以在一个较小的数据文件中查找对应offset的Message了,但是这依然需要顺序扫描才能找到对应offset的Message。为了进一步提高查找的效率,Kafka为每个分段后的数据文件建立了索引文件,文件名与数据文件的名字是一样的,只是文件扩展名为.index。索引文件中包含若干个索引条目,每个条目表示数据文件中一条Message的索引——Offset与position(Message在数据文件中的绝对位置)的对应关系。
  • 稀疏索引+二分查找,可以加快查找速度
  • index文件中并没有为数据文件中的每条Message建立索引,而是采用了稀疏存储的方式,每隔一定字节的数据建立一条索引。这样避免了索引文件占用过多的空间,从而可以将索引文件保留在内存中。但缺点是没有建立索引的Message也不能一次定位到其在数据文件的位置,从而需要做一次顺序扫描,但是这次顺序扫描的范围就很小了。
  • 索引文件被映射到内存中,所以查找的速度还是很快的。

九、Kafka的消息系统语义

在一个分布式发布订阅消息系统中,组成系统的计算机总会由于各自的故障而不能工作。在Kafka中,一个单独的broker,可能会在生产者发送消息到一个topic的时候宕机,或者出现网络故障,从而导致生产者发送消息失败。根据生产者如何处理这样的失败,产生了不通的语义:

9.1、至多一次语义(At most once semantics):

如果生产者在ack超时或者返回错误的时候不重试发送消息,那么消息有可能最终并没有写入Kafka topic中,因此也就不会被消费者消费到。但是为了避免重复处理的可能性,我们接受有些消息可能被遗漏处理。

9.2、至少一次语义(At least once semantics):

如果生产者收到了Kafka broker的确认(acknowledgement,ack),并且生产者的acks配置项设置为all(或-1),这就意味着消息已经被精确一次写入Kafka topic了。然而,如果生产者接收ack超时或者收到了错误,它就会认为消息没有写入Kafka topic而尝试重新发送消息。如果broker恰好在消息已经成功写入Kafka topic后,发送ack前,出了故障,生产者的重试机制就会导致这条消息被写入Kafka两次,从而导致同样的消息会被消费者消费不止一次。每个人都喜欢一个兴高采烈的给予者,但是这种方式会导致重复的工作和错误的结果。

9.3、精确一次语义(Exactly once semantics):

即使生产者重试发送消息,也只会让消息被发送给消费者一次。精确一次语义是最令人满意的保证,但也是最难理解的。因为它需要消息系统本身和生产消息的应用程序还有消费消息的应用程序一起合作。比如,在成功消费一条消息后,你又把消费的offset重置到之前的某个offset位置,那么你将收到从那个offset到最新的offset之间的所有消息。这解释了为什么消息系统和客户端程序必须合作来保证精确一次语义。

9.4、新版本Kafka的幂等性实现

一个幂等性的操作就是一种被执行多次造成的影响和只执行一次造成的影响一样的操作。现在生产者发送的操作是幂等的了。如果出现导致生产者重试的错误,同样的消息,仍由同样的生产者发送多次,将只被写到kafka broker的日志中一次。对于单个分区,幂等生产者不会因为生产者或broker故障而发送多条重复消息。想要开启这个特性,获得每个分区内的精确一次语义,也就是说没有重复,没有丢失,并且有序的语义,只需要设置producer配置中的”enable.idempotence=true”。


十、Hbase 下载地址:

百度云盘链接:https://pan.baidu.com/s/1K4gbPquFm1Z6-eAnPI845A(提取码:sj9t
(如果提示过期,请评论再次更新)


• 由 ChiKong_Tam 写于 2021 年 2 月 19 日

Java大数据平台开发 学习笔记(71) —— Kafka 原理(附 Kafka 百度云盘下载地址)相关推荐

  1. Java大数据平台开发 学习笔记(8)—— 选择排序

    一.数据结构与算法: 1.1.创建 选择排序方法: public static void selectSort(int[] arr){for (int i=1; i<arr.length; i+ ...

  2. Hadoop大数据平台开发与案例分析

    关于举办"Hadoop大数据平台开发与案例分析 "高级工程师 一.课程介绍 1. 需求理解 Hadoop 设计之初的目标就定位于高可靠性.高可拓展性.高容错性和高效性,正是这些设计 ...

  3. 秋招面经第十一弹:沐瞳科技一面-大数据平台开发工程师

    秋招第十一弹:沐瞳科技一面-大数据平台开发工程师 写在最前:秋招以来一直在冲,因为事情比较多,对于笔试面试一直没有复盘,现在靠仅存的记忆把面试的一些问题记录下来,尽可能记录出能回忆到的问题,但可能记的 ...

  4. 大数据Hadoop教程-学习笔记01【大数据导论与Linux基础】

    视频教程:哔哩哔哩网站:黑马大数据Hadoop入门视频教程,总时长:14:22:04 教程资源:https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g,提取码: ...

  5. 大数据Hadoop教程-学习笔记02【Apache Hadoop、HDFS】

    视频教程:哔哩哔哩网站:黑马大数据Hadoop入门视频教程 教程资源:https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g 提取码: 6666 [P001-P ...

  6. 大数据平台开发:大数据系统架构模块解析

    企业要开展大数据相关业务,首先就需要基于自身的需求,来设计搭建数据系统平台.而大数据系统平台的搭建,需要基于实际需求,来进行系统架构规划.今天我们就从大数据平台开发的角度,来对大数据系统架构模块做一个 ...

  7. 戮默科技:大数据平台开发运营 赋能企业智慧发展

    随着5G.移动互联网.物联网.云计算等信息技术的发展,大数据在精准营销.教育.金融等领域有着越来越广泛的应用.深圳市戮默科技有限公司(以下简称戮默科技)旗下产品--大数据平台开发运营,正向大数据.云计 ...

  8. 为什么物联网大数据平台,使用TDengine,可不要redis, kafka, spark等软件?

    为什么物联网大数据平台,使用TDengine,可不要redis, kafka, spark等软件? TDengine是一高效的时序空间大数据处理引擎,因为充分利用物联网.车联网.工业互联网等场景的数据 ...

  9. 大数据平台开发架构讲解

    大数据背景 对于业务数据数据量的暴增,用户智能化需求提升.在这个DT的时代,大数据的开发也就应运而生了,大数据开发必须解决两个问题,大数据量如何统一存储,大数据量如何统一计算.针对这些问题产生了很多大 ...

最新文章

  1. java一个参数 多个值_Spring里有类似@RequestParam的办法去绑定一个多值参数吧
  2. leetcode算法题--二叉树中和为某一值的路径
  3. 【学习笔记】C#中的单元测试
  4. C语言判断一个数是否是回文数Palindrome算法(附完整源码)
  5. 世界硬币:比特币类似的评分系统!
  6. debian dhcp服务启动不了_网刻批量装系统pxe启动教程全自动分区装系统
  7. 第 39 级台阶 蓝桥杯
  8. mysql4.1数据库_MySQL数据库练习-4.1
  9. Oracle、SQL Server、MySQL数据类型对比
  10. 市级规划课题《小学数学教材解读策略研究》评审书
  11. 雷神开机logo更改_升级BIOS/更换开机logo教程
  12. 热血江湖辅助代码编写教程(价值500
  13. ESS 控制台之访问控制篇
  14. 《IBM SPSS Modeler数据与文本挖掘实战》之社交网络分析
  15. 工具 | Mac | 截图工具
  16. 广州大学机器学习与数据挖掘实验一
  17. Ubuntu16.04系统迁移SSD
  18. 登录逻辑漏洞整理集合
  19. 【笔记软件obsidian】从入门到精通
  20. 大幅提升冲浪效率,搜狗高速浏览器3.0

热门文章

  1. jwt 例子 java_spring boot 入门之security oauth2 jwt完美整合例子-java编程
  2. VoLTE的前世今生...说清楚VoIP、VoLTE、CSFB、VoWiFi、SIP、IMS那些事...
  3. 2010年第3期新刊上市:移动大时代谁在掘金?
  4. cctalk怎么录屏?cctalk去水印录屏翻录教程
  5. React Native新组件之SwipeableFlatList
  6. Java代码工具之中英文语句分词
  7. docker 部署 mkdocs (mkdocs-material)
  8. 大众点评各城市热门餐厅数据爬虫抓取
  9. python开发项目:学生选课系统
  10. Python+FFmpeg/CMD根据m3u8合并ts文件