Apache KafKa阅读官方文档心得
Apache KafKa阅读官方文档心得
概念
2、Kafka群集将名为主题的类别的记录流存储起来。
3、每个记录由一个键,一个值和一个时间戳组成。
使用场景
1、构建可在系统或应用程序之间可靠获取数据的实时流数据流水线
2、构建对数据流进行变换或反应的实时流应用程序
核心API
2、Consumer API:允许应用程序订阅一个或多个Kafka topics,并处理所产生的对他们记录的数据流。
3、 Streams API:允许应用程序充当流处理器,从一个或多个Kafka topics消耗的输入流,并产生一个输出流至一个或多个输出的Kafka topics,有效地变换所述输入流,以输出流。
使用协议
KafKa描述图
主题和日志(Topics 和 Logs)
对于每个Topics,Kafka集群维护一个分区日志,如下所示:
这种特征的组合意味着Kafka消费者的成本非常低 - 他们可以来回去对集群或其他消费者没有太大影响。例如,您可以使用我们的命令行工具来“tail”任何主题的内容,而无需更改任何现有消费者所消耗的内容。
日志中的分区有几个目的。首先,它们允许日志扩展到适合单个服务器的大小。每个单独的分区必须适合托管它的服务器,但主题可能有很多分区,因此它可以处理任意数量的数据。第二,它们作为并行性的单位 - 更多的是在这一点上。
分配
每个分区有一个服务器,充当“leader”,零个或多个服务器充当“followers”。leader处理分区的所有读取和写入请求,而followers被动地复制leader。如果leader失败,其中一个followers将自动成为新的leader。每个服务器作为其一些分区的leader,并且作为其他分区的followers,因此在集群内负载平衡良好。
生产者
消费者
如果所有的消费者实例具有相同的消费者组,则记录将在消费者实例上有效地负载平衡。
如果所有的消费者实例都有不同的消费者群体,那么每个记录将被广播给所有的消费者进程。
然而,更常见的是,我们发现主题具有少量的消费者群体,每个“逻辑订阅”一个。每个组由许多消费者实例组成,可扩展性和容错能力。这只不过是发布订阅语义,用户是一组消费者而不是单个进程。
在Kafka中实现消费的方式是通过将日志中的分区划分到消费者实例上,以便每个实例都是任何时间点的“公平共享”分区的唯一消费者。维护成员资格的过程由kafka协议动态处理。如果新的实例加入组,他们将从组中的其他成员接管一些分区; 如果一个实例消失,其分区将被分发到剩余的实例。
Kafka仅提供分区内的记录的总顺序,而不是主题中的不同分区之间的总顺序。每个分区排序结合按键分配数据的能力足以满足大多数应用程序的需求。但是,如果您需要总共订单超过记录,则可以使用仅具有一个分区的主题来实现,尽管这仅意味着每个消费者组只有一个消费者进程。
担保
生产者producer发送到特定topics分区的消息将按照发送的顺序进行追加。也就是说,如果记录M1由与记录M2相同的producer 发送,并且首先发送M1,则M1将具有比M2更低的偏移offsers并且在日志中较早出现。
消费者实例按照它们存储在日志中的顺序查看记录。
对于具有复制因子N的主题,我们将容忍最多N-1个服务器故障,而不会丢失提交到日志的任何记录。
KafKa作为消息系统
消息传统上有两种模式:队列和发布 - 订阅。在队列中,消费者池可以从服务器读取,每条记录都转到其中一个; 在发布订阅中,记录将广播给所有消费者。这两个模型中的每一个都有实力和弱点。排队的优点是它允许您在多个消费者实例上分配数据处理,从而可以扩展您的处理。不幸的是,队列不是多用户的 - 一旦一个进程读取数据就会消失。发布订阅允许您将数据广播到多个进程,但无法缩放处理,因为每个消息都发送给每个用户。
kafka消费群体概念概括了这两个概念。与队列一样,消费者组允许您通过一系列进程(消费者组的成员)来划分处理。与发布订阅一样,Kafka允许您将消息广播到多个消费者组。
kafka模型的优点是,每个主题都具有这两个属性 - 它可以扩展处理,也是多用户 - 不需要选择一个或另一个。
kafka也比传统的邮件系统更强大的订购保证。
传统队列在服务器上保存顺序的记录,如果多个消费者从队列中消费,则服务器按照存储顺序输出记录。然而,虽然服务器按顺序输出记录,但是记录被异步传递给消费者,所以它们可能会在不同的消费者处按顺序到达。这意味着在并行消耗的情况下,记录的排序丢失。消息传递系统通常通过使“唯一消费者”的概念只能让一个进程从队列中消费,但这当然意味着处理中没有并行性。
kafka做得更好 通过在主题中有一个并行概念(分区),Kafka能够在消费者流程池中提供排序保证和负载平衡。这是通过将主题中的分区分配给消费者组中的消费者来实现的,以便每个分区由组中的一个消费者消耗。通过这样做,我们确保消费者是该分区的唯一读者,并按顺序消耗数据。由于有许多分区,这仍然平衡了许多消费者实例的负载。但请注意,消费者组中的消费者实例不能超过分区。
KafKa作为存储系统
写入Kafka的数据写入磁盘并进行复制以进行容错。Kafka允许生产者等待确认,以便在完全复制之前写入不被认为是完整的,并且即使服务器写入失败,也保证持久写入。
Kafka的磁盘结构使用缩放,Kafka将执行相同的操作,无论您在服务器上是否有50 KB或50 TB的持久数据。
作为严重存储并允许客户端控制其读取位置的结果,您可以将Kafka视为专用于高性能,低延迟的提交日志存储,复制和传播的专用分布式文件系统。
kafka流处理
在Kafka,流处理器是从输入主题接收数据流的任何东西,对此输入执行一些处理,并生成持续的数据流以输出主题。
例如,零售应用程序可能会收到销售和出货的输入流,并输出根据该数据计算的重新排序和价格调整。
可以直接使用生产者和消费者API进行简单处理。然而对于更复杂的转换,Kafka提供了一个完全集成的Streams API。这允许构建应用程序进行非平凡处理,以计算流中的聚合或将流连接在一起。
该设施有助于解决这种类型的应用程序面临的困难问题:处理无序数据,重新处理输入作为代码更改,执行有状态计算等。
流API基于Kafka提供的核心原语构建:它使用生产者和消费者API进行输入,使用Kafka进行有状态存储,并在流处理器实例之间使用相同的组机制来实现容错。
放在一起
像HDFS这样的分布式文件系统允许存储用于批处理的静态文件。有效像这样的系统允许存储和处理历史从过去的数据。
传统的企业邮件系统允许处理将在您订阅之后到达的未来邮件。以这种方式构建的应用程序在未来数据到达时处理。
Kafka结合了这两种功能,组合对于Kafka作为流应用程序和流数据管道平台来说至关重要。
通过组合存储和低延迟订阅,流式应用程序可以以相同的方式处理过去和未来的数据。这是一个单一的应用程序可以处理历史的,存储的数据,而不是在到达最后一个记录时结束,它可以在将来的数据到达时继续处理。这是一个广泛的流处理概念,其中包含批处理以及消息驱动应用程序。
同样,对于流数据流水线,订阅到实时事件的组合使得可以使用Kafka进行非常低延迟的管道; 但是可靠性地存储数据的能力使得可以将其用于必须保证数据传送的关键数据,或者与仅负载数据的离线系统集成,或者可能会长时间停机以进行维护。流处理设备可以在数据到达时转换数据。
快速开始
步骤一:下载解压(Linux)
步骤二:启动服务器
步骤三:创建主题
步骤四:发送消息
运行生产者,然后在控制台中输入一些消息以发送到服务器。
步骤五:启动消费者
所有命令行工具都有其他选项; 运行没有参数的命令将显示更详细地记录它们的使用信息。
步骤六:设置多代理集群
首先我们为每个broker设置一个配置文件(在Windows上使用copy命令):
查找broker.id: /broker.id 回车
输入i编辑:将broker.id改为2
Esc
查找listeners: /listeners 回车
下面加入:listeners=PALINTEXT://9094
Esc
我们已经有Zookeeper,我们的单个节点启动了,所以我们只需要启动两个新节点:
bin/kafka-server-start.sh config/server-1.properties > /dev/null &
“Leader”: 是负责给定分区的所有读取和写入的节点。每个节点将成为随机选择的分区部分的引导者。
“Replicas”: 是复制此分区的日志的节点列表,无论它们是leader还是目前都是活着的。
“Isr”: 是一组“同步”副本。这是副本列表的子集,该列表目前是活跃的,并且被追加到leader。
请注意,在我的示例中,节点1是主题唯一分区的领导者。
现在我们来看看消息:
步骤七:使用Kafka Connect导入导出数据
Kafka Connect是Kafka包含的工具,用于将数据导入和导出到Kafka。它是一种运行连接器的可扩展工具 ,它实现与外部系统交互的自定义逻辑。在这个快速启动中,我们将看到如何使用从文件导入数据到Kafka主题(topics)并将数据从Kafka主题导出到文件的简单连接器运行Kafka Connect。
首先,我们将首先创建一些种子数据来测试:
在启动期间,您将看到一些日志消息,其中包括一些表示连接器正在实例化的消息。一旦Kafka Connect进程开始,源连接器应该开始读取线路test.txt并将其生成到主题connect-test,并且接头连接器应该开始从主题读取消息并将其connect-test 写入文件test.sink.txt。我们可以通过检查输出文件的内容来验证数据是否通过整个流水线传送:
步骤八:使用Kafka Streams处理数据
final Serde<String> stringSerde = Serdes.String();
final Serde<Long> longSerde = Serdes.Long();
// Construct a `KStream` from the input topic ""streams-file-input", where message values
// represent lines of text (for the sake of this example, we ignore whatever may be stored
// in the message keys).
KStream<String, String> textLines = builder.stream(stringSerde, stringSerde, "streams-file-input");
KTable<String, Long> wordCounts = textLines
// Split each text line, by whitespace, into words.
.flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
// Group the text words as message keys
.groupBy((key, value) -> value)
// Count the occurrences of each word (message key).
.count("Counts")
// Store the running counts as a changelog stream to the output topic.
wordCounts.to(stringSerde, longSerde, "streams-wordcount-output");
作为第一步,我们将为Kafka主题准备输入数据,随后由Kafka Streams应用程序处理。
我们现在可以通过从其输出主题中读取来检查WordCount演示应用程序的输出:
--topic streams-wordcount-output \
--from-begin \
--formatter kafka.tools.DefaultMessageFormatter \
--property print.key=true \
--property print.value=true \
--property key,deserializer=org.apache.kafka.serialization.StringDeserializer \
--property value.deserializer=org.apache.kafka.common.serialization.LongDeserializer
Apache KafKa阅读官方文档心得相关推荐
- 《Apache Common CLI官方文档
本篇文章是并发编程网组织的一次Apache Common组件翻译的一部分,因为无意中看到了Apache Common CLI感觉很好奇,因为这个工具很少在网上看到,当然或许我没有关注过.因为我之前也写 ...
- 3、nginx设置简单的代理服务器-阅读官方文档
官网:Beginner's Guide 翻译部分:Setting Up a Simple Proxy Server 开始! One of the frequent uses of nginx is s ...
- pandas学习笔记——阅读官方文档
1. 初始化 (1)生成简单序列pd.Series >>>s = pd.Series([1,3,5,np.nan,6,8]) >>>s 0 1.0 1 3.0 2 ...
- linux3.10.53编译,根据官方文档在Linux下编译安装Apache
根据官方文档在Linux下编译安装Apache 前言 永远记住官方文档才是最准确的安装手册,这篇文章仅为对官方文档的解读和补充,学习提升务必阅读官方文档: http://httpd.apache.or ...
- 快讯!Apache ShardingSphere 官方文档 pdf 版已上线
Apache ShardingSphere 的官方文档 pdf 版已上线,实时更新,与官网保持同步,欢迎大家留存.大家需要注意 pdf 首页的生成时间,以保证获取的 pdf 文档没有过期. 地址如下: ...
- HBase 官方文档
HBase 官方文档 Copyright © 2010 Apache Software Foundation, 盛大游戏-数据仓库团队-颜开(译) Revision History Revision ...
- Spring Boot 2.0官方文档之 Actuator
https://blog.csdn.net/alinyua/article/details/80009435 前言:本文翻译自Spring Boot 2.0.1.RELEASE官方文档,该Spring ...
- tensorflow 官方文档中文版 tensorflow教程 tensorflow教学
github链接:TensorFlow 最新官方文档中文版 文档链接:https://tensorflow.juejin.im/get_started/ 理论上来说,只要仔细阅读官方文档,便能对ten ...
- 什么!作为程序员你连英文版的官方文档都看不懂?
目录 一.笔者英文基础介绍 二.为啥程序员需要阅读官方文档? 三.如何才能无障碍阅读英文文档? 四.坚持!坚持!坚持! 五.来个约定吧! 这篇文章不聊技术,我们来聊一个某种程度上比技术更重要的话题:一 ...
最新文章
- ES5-Array-join
- php 安装rabbitmq拓展_【RabbitMQ】——centos7安装rabbitmq教程 以及 PHP开启rabbitmq扩展...
- Arduino Yun快速入门教程(大学霸内部资料)
- hbase集群无法重启的可能原因之一及解决办法
- SpringBoot入门教程(十五)集成Druid
- a5d27 emmc启动 修改2
- 使用encodeURl()进行编解码
- Tomcat Caused by java lang OutOfMemoryError PermGen space
- http://item.jd.com/1275996920.html
- 前端html和js编码设置
- 深度 | 苹果略胜微软一筹,为什么说 ARKit 是 AR 的最好选择?
- 《思考的技巧》- 学习总结
- mininet和ryu简单实现自定义topo
- Python+AI智能编辑人脸
- Aseprite学习/技巧
- 过了所有技术面,却倒在 HR 一个问题上
- 计算机组装配置(CPU 后面的字母 有U,H,Y,HQ,M 怎么区别?)
- XCODE - Failed to create provisioning profile
- 弱电时间同步系统(卫星同步时钟)医院学校标准时钟系统建设的意义
- 通信协议整理之 SPI 通信