Apache Kafka - 流式处理

这篇具有很好参考价值的文章主要介绍了Apache Kafka - 流式处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据

概述

Kafka被广泛认为是一种强大的消息总线,可以可靠地传递事件流,是流式处理系统的理想数据来源。流式处理系统通常是指一种处理实时数据流的计算系统,能够对数据进行实时的处理和分析,并根据需要进行相应的响应和操作。与传统的批处理系统不同,流式处理系统能够在数据到达时立即进行处理,这使得它们特别适合需要实时响应的应用程序,例如实时监控和警报、实时推荐、实时广告投放等。

Kafka的设计使其成为流式处理系统的理想数据源,因为它具有高吞吐量、低延迟和可靠性,并且能够轻松地扩展以处理大量数据。许多基于Kafka的流式处理系统,如Apache Storm、Apache Spark Streaming、Apache Flink和Apache Samza等,已经成功地应用于各种不同的场景中。

Kafka的流式处理类库提供了一种简单而强大的方式来处理实时数据流,并将其作为Kafka客户端库的一部分提供。这使得开发人员可以在应用程序中直接读取、处理和生成事件,而无需依赖外部的处理框架。Kafka的流式处理类库提供了许多有用的功能,如窗口化处理、状态存储和流处理拓扑构建等,使得开发人员能够轻松地构建强大的流式处理应用程序。

随着Kafka的流行和流式处理技术的发展,流式处理系统已经成为数据处理的一个重要领域,并且在越来越多的应用场景中得到广泛应用。Kafka的流式处理类库为开发人员提供了一种强大的工具来处理实时数据流,并从中提取有用的信息,是构建复杂的流式处理系统的理想选择。


什么是流式处理

流式处理是一种编程范式,用于实时处理一个或多个事件流。事件流是无边界数据集的抽象表示,它们是无限和持续增长的,随着时间的推移,新的记录会不断加入进来。

与批处理不同,流式处理可以对事件流进行实时处理,而不需要等待所有数据都可用之后再进行处理。这使得流式处理非常适用于需要实时响应的业务场景,如可疑交易警报、网络警报、实时价格调整和包裹跟踪等。

流式处理具有以下几个特征:

  • 有序:事件流中的数据记录是按照它们发生的时间顺序排列的。这意味着流式处理可以按照事件发生的顺序进行处理,从而得出正确的结果。

  • 不可变:事件流中的数据记录是不可变的,即一旦记录被创建,它就不能被修改。这使得流式处理更容易实现,因为它不需要考虑并发修改问题。

  • 可重播:事件流中的数据记录可以被重复处理,从而使得流式处理具有容错性。如果处理过程中发生了错误,可以重新处理相同的数据记录,直到得到正确的结果。

  • 低延迟:流式处理具有较低的延迟,即处理事件流的时间很短,通常在毫秒或微秒级别。这使得流式处理非常适用于需要实时响应的业务场景。

  • 高吞吐量:流式处理具有较高的吞吐量,即能够处理大量的数据记录。这使得流式处理非常适用于处理大规模的数据集。

  • 不依赖于具体框架或API:流的定义不依赖于任何特定的框架、API或特性,只要从一个无边界的数据集中读取数据并进行处理,就可以进行流式处理。这使得流式处理具有较大的灵活性和可扩展性。

流式处理是一种能够实时处理无边界数据集的编程范式,具有有序、不可变、可重播、低延迟、高吞吐量和灵活性等特点,非常适用于需要实时响应的业务场景。


流式处理的一些概念

时间

时间或许就是流式处理最为重要的概念,也是最让人感到困惑的。在讨论分布式系统时,该如何理解复杂的时间概念? 在流式处理里,时间是一个非常重要的概念,因为大部分流式应用的操作都是基于时间窗口的。事

  • 事件时间(Event Time):事件实际发生的时间。这是最重要的时间概念,大部分流式应用都是基于事件时间来进行窗口操作和聚合的。
  • 日志追加时间(Log Append Time):事件被写入Kafka的时间。这种时间主要是Kafka内部使用的,和流式应用无太大关系。
  • 处理时间(Processing Time):应用程序收到事件并开始处理的时间。这种时间不可靠,可能会产生不同的值,所以流式应用很少使用它。

推荐读者阅读 Justin Sheehy 的论文《There is No Now》来深入理解这些时间概念,特别是在分布式系统环境下的复杂性。

在流式系统中,如果生产者出现网络问题导致离线几个小时,然后大量数据涌入,这会给系统带来很大困难。因为大部分数据的事件时间已经超出我们设定的窗口范围,无法进行正常的聚合计算。

为了解决这个问题,流式系统提供了几种机制:

  1. 丢弃超出窗口的数据:简单但会导致数据损失
  2. 调整窗口:扩大窗口以包含更多数据,但窗口范围变大会影响计算精度
  3. 重发数据:生产者将离线期间的数据重新发送,系统会进行补充计算以产生正确的结果
  4. 水印(Watermark):允许指定数据迟到的最大时间,系统会等待水印时间之内的数据到达后开始计算并输出结果。水印机制可以有效解决数据迟到的问题 while 保证结果的准确性。

所以,在设计流式应用时需要考虑这些时间概念,特别要考虑数据迟到和离线的情况,并选择合适的机制来处理,保证系统的准确性。


状态

  1. 单纯处理单个事件很简单,但涉及多个事件时需要跟踪更多信息,这些信息被称为“状态”。
  2. 状态通常存储在应用程序的本地变量中,如散列表。但本地状态存在丢失风险,重启后状态变化,需持久化最近状态并恢复。
  3. 本地状态或内部状态:只能被单个应用程序实例访问,使用内嵌数据库维护,速度快但受限于内存大小。许多设计将数据拆分到子流使用本地状态处理。
  4. 外部状态:使用外部数据存储维护,如NoSQL系统Cassandra。大小无限制,多个应用实例可访问,但增加延迟和复杂度。大部分流式处理应用避免外部存储,或缓存在本地减少交互以降低延迟,引入内外状态一致性问题

流和表的二元性

  1. 表是记录的集合,具有主键和schema定义的属性,记录可变,查询可得某时刻状态,如CUSTOMERS_CONTACTS表获取所有客户联系信息。但表无历史信息。
  2. 流是事件序列,每个事件是变更。表是多变更结果的当前状态。表和流是同一硬币两面:世界变化,关注变更事件或当前状态。支持两种方式的系统更强大。
  3. 将表转为流需捕获表变更事件(insert、update、delete),如CDC解决方案发送变更到Kafka流式处理。
  4. 将流转为表需应用流所有变更以改变状态,在内存、内部状态存储或外部数据库创建表,遍历流所有事件逐个改变状态,得到某时间点状态的表。

假设有一个鞋店,某零售活动可以使用一个事件流来表示:

“红色、蓝色和绿色鞋子到货”
“蓝色鞋子卖出”
“红色鞋子卖出”
“蓝色鞋子退货”
“绿色鞋子卖出”
如果想知道现在仓库里还有哪些库存,或者到目前为止赚了多少钱,需要对视图进行物化。

kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据

应用流中所有变更事件来改变状态并建立表,表转流需要捕获表上的变更事件并发送到流进行后续流式处理。表代表某时刻的状态,流代表变更,二者相互转化,支持两种方式的系统更强大


时间窗口

针对流的时间窗口操作主要有以下几种类型:

  1. 窗口大小:5分钟、15分钟、1天等,大小影响变更检测速度和平滑度。窗口越小,变更检测越快但噪声也越大;窗口越大,变更越平滑但延迟也越严重。
  2. 窗口移动频率(“移动间隔”):5分钟平均值每分钟变化一次或每秒变化一次或每新事件变化一次。移动间隔等于窗口大小为“滚动窗口”,随每记录移动为“滑动窗口”。
  3. 窗口可更新时间:计算00:00-00:05平均值,1小时后00:02事件,是否更新00:00-00:05窗口结果?可定义时间段内事件添加对应时间片段,如4小时内更新,否则忽略。
  4. 窗口与时间对齐或不对齐:5分钟窗口每分钟移动,第一个片00:00-00:05,第二个00:01-00:06;或应用任时启动,第一个片03:17-03:22。滑动窗口随新记录移动,永不与时间对齐。

窗口大小影响操作结果的灵敏度和平滑度,移动间隔决定结果更新频率,可更新时间决定迟到事件是否参与运算。窗口可与时间对齐或不对齐。

滑动窗口随每新事件移动,滚动窗口按预定间隔移动,但两者移动间隔都不超过窗口大小。滚动窗口移动间隔与窗口大小相等时,相邻窗口没有重叠;滑动窗口移动间隔小于窗口大小时,相邻窗口有重叠。

kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据
【滚动窗口和跳跃窗口的区别】


流式处理的设计模式

单个事件处理

处理单个事件是流式处理最基本的模式。这个模式也叫 map 或 filter 模式,因为它经常被用于过滤无用的事件或者用于转换事件

map 这个术语是从 Map-Reduce 模式中来的,map阶段转换事件,reduce 阶段聚合转换过的事件)。

读取流事件,修改并写到其他流。如读取日志流,ERROR级别消息写高优先级流,其他写低优先级流;或JSON转Avro格式。无需维护状态,易恢复错误或负载均衡。

【单事件处理拓扑】
kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据
这种模式可以使用一个生产者和一个消费者来实现.


使用本地状态

多数流处理应用聚合信息,如每天最高最低股票价和移动平均值。需维护流状态,如保存最小最大值和新值比较。可通过本地状态实现,每操作一组聚合,如下图。Kafka分区确保同代码事件同分区。每个应用实例获取分配分区事件,维护一组股票代码状态。
kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据


多阶段处理和重分区

本地状态适组内聚合,要全信息结果如每日前10股票需两阶段:第一阶段每个实例计算每股涨跌,写单分区新主题;第二阶段单应用实例读取新主题找前10股。新主题只股票摘要,流量小,单实例足以。更多步骤亦如MapReduce多reduce步骤,每个步骤应用隔离。流处理框架可多步骤一应用,框架调度每个步骤哪个应用实例运行。

kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据

【包含本地状态和重分区步骤的拓扑】


使用外部查找——流和表的连接

kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据
【使用外部数据源的流式处理】

外部查找会带来严重的延迟

为了获得更好的性能和更强的伸缩性,需要将数据库的信息缓存到流式处理应用程序里。不过,要管理好这个缓存也是一个挑战。

比如,如何保证缓存里的数据是最新的?如果刷新太频繁,那么仍然会对数据库造成压力,缓存也就失去了作用。如果刷新不及时,那么流式处理中所用的数据就会过时。

如果能够捕捉数据库的变更事件,并形成事件流,流式处理作业就可以监听事件流,并及时更新缓存。捕捉数据库的变更事件并形成事件流,这个过程被称为 CDC——变更数据捕捉(Change Data Capture)。如果使用了 Connect,就会发现,有一些连接器可以用于执行CDC 任务,把数据库表转成变更事件流。

这样就拥有了数据库表的私有副本,一旦数据库发生变更,用户会收到通知,并根据变更事件更新私有副本里的数据,如图

kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据

【连接流和表的拓扑,不需要外部数据源】


流与流的连接

在 Streams 中,上述的两个流都是通过相同的键来进行分区的,这个键也是用于连接两个流的键。这样一来,user_id:42 的点击事件就被保存在点击主题的分区 5 上,而所有 user_id:42 的搜索事件被保存在搜索主题的分区 5 上。Streams 可以确保这两个主题的分区 5 的事件被分配给同一个任务,这个任务就会得到所有与 user_id:42 相关的事件。

Streams 在内嵌的 RocksDB 里维护了两个主题的连接时间窗口,所以能够执行连接操作
kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据

乱序的事件

处理乱序和迟到事件的要点:

  1. 识别乱序事件:检查事件时间,与当前时间比较,超出时间窗口视为乱序或迟到。
  2. 规定时间窗口重排乱序事件:如3小时内事件重排,3周外事件丢弃。
  3. 重排时间窗口内乱序事件的能力:流处理与批处理不同,无“重新运行昨日作业”概念,须同时处理乱序与新事件。
  4. 更新结果的能力:如结果在数据库,用put或update更新;如邮件发送结果,更新方式需巧妙。
  5. 支持时间独立事件的框架:如Dataflow和Streams维护多个聚合时间窗口,更新事件,且可配置窗口大小。窗口越大,本地状态内存需求越高。
  6. Streams API聚合结果写入主题,常为压缩日志主题,每个键只保留最新值。如果聚合窗口结果需更新,直接为窗口写入新结果,覆盖前结果。
    处理乱序和迟到事件需要:
  1. 识别时间窗口外的事件,丢弃或特殊处理
  2. 为时间窗口内的乱序事件定义重排窗口,在该窗口内重排乱序事件
  3. 具有在定义的时间窗口内重排乱序事件并更新结果的能力
  4. 选择支持时间独立事件和本地状态管理的流框架,如Dataflow或Streams
  5. 将更新后的聚合结果直接 overwrite,使用压缩日志主题避免结果主题无限增长

事件的乱序和迟到是流处理的常见场景,但又不太适合批处理的重新计算方式。定义多个时间窗口以管理历史状态,重排时间窗口内乱序事件,直接覆盖更新结果可以有效解决此类问题。

Streams提供的本地状态管理、时间窗口支持和压缩日志主题写入使其可以高效处理乱序和迟到事件。通过配置不同时间窗口,开发人员可以实现不同粒度的状态管理和事件重排。

事件乱序和迟到带来的挑战在于历史状态的管理和结果的更新,Streams等流框架的出现使开发人员无需过于关注这些底层问题,可以专注于流处理应用的业务逻辑。
kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据

重新处理

重处理事件的两种模式:

  1. 改进流处理应用,新版本应用处理同事件流,生成新结果,比较两版本结果,时间点切换客户端新结果流。
  2. 现有应用有缺陷,修复后重处理事件流重新计算结果。

第一种模式实现:

  1. 新版本应用作为新消费者群组
  2. 从输入主题第一个偏移量开始读取事件,获得自己输入流事件副本
  3. 检查结果流,新版本应用赶上进度,切换客户端应用新结果流
    第二种模式挑战:
  4. 重置应用到输入流起点重新处理,重置本地状态,避免混淆两版本结果
  5. 可能需清理前输出流
  6. 尽管Streams提供重置应用状态工具,有条件运行两个应用生成两个结果流更安全,可以比较不同版本结果,无数据丢失或清理引入错误风险

重处理事件模式需要:

  1. 事件流长期在可扩展数据存储,如Kafka
  2. 运行不同版本应用作为不同消费者群组,各自处理事件流并生成结果
  3. 新版本应用从头读取事件,建立自己的输入流副本和结果,避免影响当前版本
  4. 比较不同版本结果,确定切换时机,小心切换客户端到新结果流
  5. 可选清理现有结果和状态,使用重置工具小心操作,或采用并行模式避免清理

事件流的长期保留为重新处理事件和 AB 测试不同版本应用程序提供了可能。重置当前运行的应用程序存在一定风险,并行运行多个版本的应用程序可以最大限度减小风险。

无论采用何种模式,重新处理事件都需要小心谨慎的计划与执行。不同版本应用程序生成的结果流比较可以让我们清楚地知道新的版本是否达到了预期的改进,这为重新处理事件和发布提供了依据。

Streams 的消费者群组管理和工具支持使其在重新处理事件和 AB 测试场景下性能卓越。通过将不同版本应用加入不同消费者群组,各自处理事件流并生成独立结果,再小心migrate客户端,这是一种较为安全可靠的重新处理事件模式。

事件流的长期保留和可靠的状态管理是重新处理事件的基石。AB 测试不同版本应用程序也可借此机制实现,这为流式应用的持续优化和演化提供了可能。

kafka流处理,【MQ-Apache Kafka】,kafka,apache,大数据文章来源地址https://www.toymoban.com/news/detail-689441.html

到了这里,关于Apache Kafka - 流式处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用Apache Kafka和Storm实时处理大规模的Twitter数据集 ?4 Streaming Large Collections of Twitter Data in RealTime

    作者:禅与计算机程序设计艺术 Twitter是一个巨大的社交媒体网站,每天都有数以亿计的用户参与其中。许多企业利用其数据的价值已经成为众矢之的。比如,广告、营销、市场调研等方面都依赖于Twitter数据。 Streaming Large Collections of Twitter Data in Real-Time with Apache Kafka and Stor

    2024年02月07日
    浏览(46)
  • 掌握实时数据流:使用Apache Flink消费Kafka数据

            导读:使用Flink实时消费Kafka数据的案例是探索实时数据处理领域的绝佳方式。不仅非常实用,而且对于理解现代数据架构和流处理技术具有重要意义。         Apache Flink  是一个在 有界 数据流和 无界 数据流上进行有状态计算分布式处理引擎和框架。Flink 设计旨

    2024年02月03日
    浏览(78)
  • 使用 Apache Kafka 和 Go 将数据引入 OpenSearch

            需要编写自定义集成层来满足数据管道中的特定要求?了解如何使用 Go 通过 Kafka 和 OpenSearch 实现此目的。         可扩展的数据摄取是OpenSearch等大规模分布式搜索和分析引擎的一个关键方面。构建实时数据摄取管道的方法之一是使用Apache Kafka。它是一个开源

    2024年02月12日
    浏览(36)
  • Apache Kafka 基于 S3 的数据导出、导入、备份、还原、迁移方案

    博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧

    2024年02月07日
    浏览(60)
  • 【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(基础概念解析+有状态的流式处理)

    Apache Flink 是业界公认的最佳流计算引擎之一,它不仅仅局限于流处理,而是一套兼具流、批、机器学习等多种计算功能的大数据引擎。Flink 的用户只需根据业务逻辑开发一套代码,就能够处理全量数据、增量数据和实时数据,无需针对不同的数据类型开发不同的方案。这使得

    2024年02月03日
    浏览(83)
  • 流式计算中的多线程处理:如何使用Kafka实现高效的实时数据处理

    作者:禅与计算机程序设计艺术 Apache Kafka 是 Apache Software Foundation 下的一个开源项目,是一个分布式的、高吞吐量的、可扩展的消息系统。它最初由 LinkedIn 开发并于 2011 年发布。与其他一些类似产品相比,Kafka 有着更强大的功能和活跃的社区支持。因此,越来越多的人开始使

    2024年02月12日
    浏览(63)
  • Kafka系列之:基于Apache Kafka Connect实现端到端topic数据字段级加密的详细方法

    与其他通信工具一样,加密在 Apache Kafka 中很有价值,可以保护数据。 希望通过与 Apache Kafka Connect 集成来加密数据来实现这一目标。 Kafka 可以利用多种安全功能,从身份验证和授权到基于 TLS 的数据进出 Kafka 主题的线上流量加密。尽管这些措施可以保护传输中的数据,但它

    2024年02月13日
    浏览(45)
  • python大数据分析游戏行业中的 Apache Kafka:用例 + 架构!

    这篇博文探讨了使用 Apache Kafka 的事件流如何提供可扩展、可靠且高效的基础设施,让游戏玩家开心并让游戏公司取得成功。讨论了游戏行业中的各种用例和架构,包括在线和移动游戏、博彩、赌博和视频流。 学习关于: 游戏遥测的实时分析和数据关联 实时广告和应用内购

    2024年03月27日
    浏览(66)
  • 流式数据处理与高吞吐消息传递:深入探索Kafka技术的奥秘

    Kafka 是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用Scala 语言编写,目前是 Apache 的开源项目。 Kafka 概念 Zookeeper 集群是一个基于主从复制的高可用集群,每个服务器承担如下三种角色中的一种 ZooKeeper中常见的角色: 领导者(Leader): 

    2024年02月09日
    浏览(46)
  • 解析Apache Kafka:在大数据体系中的基本概念和核心组件

    关联阅读博客文章:探讨在大数据体系中API的通信机制与工作原理 关联阅读博客文章:深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章:深度剖析:计算机集群在大数据体系中的关键角色和技术要点 关联阅读博客文章:深入理解HDFS工作原理:大数据存储和

    2024年04月10日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包