当前位置: 首页 > 网络应用技术

流量计算引擎数据一致性的本质

时间:2023-03-08 01:39:27 网络应用技术

  简要介绍:根据本文流量计算的本质,重点是分析流量计算领域数据处理的一致性,并简单地定义了一致性问题,提供了当前流量计算引擎的开发的观点。了解有关当前计算引擎的更多信息,并为选择可能的流计算技术提供一些参考。

  在大数据领域,流计算的应用和实践变得越来越普遍。重要性是自我的。通用流量计算引擎包括Google DataFlow,Apache Flink,Apache Kafka流,Apache Spark流媒体等。流计算系统中的数据一致性通常由消息的语义语义来定义。例如,如果发动机声称提供语义语义语义语义语义语义语义语义语义语义语义语义语义语义语义语义语义,则意味着(或提示)发动机保证了数据一致性。实际上,“确切的一致性”不等于流量计算计算的输出数据,该数据满足一致性的要求。这个术语在理解和使用方面有很多误解。

  从当前计算的本质开始,本文重点是分析流量计算领域数据处理的一致性问题。同时,它只是在一致性问题上仅定义,从而瞥见了当前流计算引擎开发的视角。对流动计算引擎的理解更多地在-Depth中,提供了一些参考,以选择可能的流。计算技术。文章主要分为三个部分:第一部分将介绍流量计算系统的本质和一致性问题;流量计算引擎如何通常概括达到一致性的概括方法。

  在识别流量计算系统的一致性之前,我们需要精确定义流量计算。流程计算是对无限数据的低删除计算的数据处理过程。相应地,批次计算更准确地处理边界处理的处理。数据,即清除边界的数据处理。流量和批准只是不同数据集的两种传统数据计算方法。

  如果我们将流量计算的过程(获取输入数据,处理数据,输出计算结果)视为数据库的主要同步过程,或者是从流量数据生成的数据集(表)数据一致性和关系的过程中得出的过程 -类型数据库交易酸理论理论中的一致性类似于同一工作。后者是指在交易的开始或结束时,数据库范围内的记录定义为:在计算过程中或故障恢复计算后,流程系统的内部状态和外部输出的数据应处于一致状态。例如,在恢复故障后,计算结果符合数据的一致性(即,用户无法在恢复之前和之后区分数据)?记录重复/丢失,第三- 方系统已获得相同计算结果的结果。会有不一致的价值吗?在一致性具有清晰的认知和定义之后,让我们看看为什么要实现一致性如此困难。

  在定义一个中,我们可以看到输入的数据输入数据是无限的,因此会有不确定的因素,例如流量计算系统延迟的延迟,混乱的顺序,大小的数字/尺度以及未知的因素因素。复杂性远大于批处理处理系统的原因:批处理系统中的输入是可以肯定的。在计算过程中,计算出的原子性可以确保数据的一致性(例如SPARK中的RDD血液)。此外,与其他分布式应用程序一样,流量计算系统通常会受到各种事故的影响,例如流量激增,网络抖动和云服务资源分布。在不确定输入的前提下,很难设计出强大的容错机制。

  除了数据输入带来的挑战外,流量计算输出的数据还将实时消耗。与批处理处理不同的应用程序方案类似,需要考虑数据。数据的一致性或同一下游的谈判一致性带来的许多挑战。

  正确理解流量计算系统一致性的固有含义和能力对于我们构建正确且可靠的流计算任务至关重要。BELOW我将介绍几组概念,以使每个人都能更好地了解流量计算系统的一致性。

  碰巧一次是一致的

  如今,大多数流计算引擎都使用“恰好一个”来暗示用户:由于输入数据不是静态集,但会连续更改,因此每个消息的输出数据必须相同。上述逻辑的派生过程还可以,但这并不严格,因为恰好用作形容词,并且以后连接的动词或物体被故意消灭。不同的表达方式将非常不同。

  示例1,然后连接不同的动作(名称)单词:正好的一开始交付和正当的过程。后者从流量计算的应用级别描述了数据处理过程。

  示例2,之后不同的名词:恰好是一个州的一致性和完全符合的过程。恰好表达了一致性的一致性:流量计算要求状态的状态更新仅将其提交给持续的后端存储,但是这里的状态通常不包括“输出到下游结果”,但仅指导内部状态发动机(例如每个计算儿童的状态,实际时间 - 时间消耗偏移等)的发动机的保证,发动机的内部状态的保证不能等于从输入到输出的一致性。

  简而言之,稍后如何查看准确的XXX,我们必须警惕要显示哪些信息。

  结束 - 端数据一致性

  端对一的一致性,数据的输出也被用作流量计算引擎一致性设计的一部分。正确的结果通过整个流计算应用程序运行:从输入,处理过程,输出,输出链接需要确保其自己的数据一致性。同时,在整个流计算过程中,总体上实现了末端到末端的一致性。

  在下面的描述中,如果未明确说明,则一致性是指引擎本身的一致性,而末端的一致性是指输出的一致性。

  之前,我们定义了流量计算一致性的概念。从概念开始,该部分将正式分解问题,以获得常见的溶解方法。

  如上所述,流计算的输入数据没有边界,这与我们传统上对流量计算的认知认知相符。流批准,即任何数据的处理都是“流”和“表”,在这种情况下,该流用于表征运动中的数据,并且表用于表征静态数据:

  在这个统一的理论框架下,批处理过程的一致性也可以包含在本文的范围中。但是是纯流计算还是上面的统一数据处理模型,我们可以抽象流程(批准)数据处理的过程分为“读取数据处理数据输出数据”的三个部分。不防止图表,其中点代表数据处理逻辑,同时指示数据流,并且在数据处理过程中的中间状态(状态)通常需要持久存储。

  流计算中的确定性是指相同的一组数据,以提供相同的数据集,反复运行多次或将数据破坏到发动机顺序中。计算完成后,将输出相同的结果,否则是不燃烧的计算。通用的非确认计算包括使用随机数,系统时间,字符串缝制等。计算,这将造成许多困难,以实现 - 端的一致性实现,并且某些引擎无法很好地支持这种情况。

  在不确定计算的流量计算中,不确定性计算的(中间)的结果可以视为流计算发动机状态的一部分。在整个过程中,任何时间点的发动机状态等于计算结果的积累在所有以前的事件(中间结果和输出结果)中。目前是状态(t),状态(t)包括每个操作员。

  state(t)= operatorsState(t) + sourcestate(t)

  然后定义流量计算引擎的计算过程,并存在计算和计算逻辑F:

  f(e(t),接收器(t),状态(t))= sink(t + 1) +状态(t)

  O(t)= sink(t) +状态(t)的顺序,即将计算出发动机状态作为特殊输出的更新,流量计算过程可以简化为:

  f(e(t),o(t))= o(t+1)

  结合一致性计算的定义以上计算,我们希望当发动机失败故障转移时,会有一个恢复功能r

  r(e(t),o(t))= o'(t+1)和o'(t+1)= o(t+1)

  在这里,我们将引擎状态作为特殊的输出考虑。首先,发动机的状态通常也输出到外部存储(例如RockSDB/HDFS),这与计算下游的输出。引擎的容错机制,简化了末端到末端的一致性问题的抽象过程,以更好地理解问题本身。

  我们在上面定义了末端-to -end的一致性问题:r(e(t),o(t))= o(t+1)。从使用输出结果的视角(内部和下游数据消费者引擎):对于记录o(t + 1),当故障发生小于t(数据未输出)或大于t + 1(数据数据(数据数据数据已导出)时,数据绝对是相同。

  当T?T + 1时发生故障时,恢复功能R可以阻止此故障的副作用,因此用户认为没有故障,并且可以获得正确的O(t + 1).e(t)和O(t)用作输入,并重新执行计算F,然后可以获得正确的O(t+1)。具体而言,可以通过替换数据偏移来获得E(t)。可以获得O(t)。o(t)需要从持久存储中获得。是不可能的,因为计算过程中可能存在不确定性。计算逻辑,如果是收入,则有一定的概率O(t)≠f(e(t-1),o(t-1))。

  因此,我们获得了末端 - 到末端一致性数据处理语义的完整必要条件:在流动计算过程中,我们需要实时存储每个中间和最终计算结果。以常规方式进行批量存储。每个O(t)存储后,恢复函数R的实现要简单得多:恢复任务后,再次加载O(t),然后使用F执行操作的原因。

  我们将末端 - 末端一致性问题与工程实践相结合,以分析一般解决方案下的几个实现场景。

  在一般解决方案方法中,我们需要存储每个计算的中间结果。这对引擎的架构设计和支撑基础设施功能有很高的要求。因此,我们将条件退化为批量存储,可以通过交易批量存储。(状态)在一致性的前提下,它可以达到较高的吞吐量。

  进一步分析,当每个存储或批处理交易存储o(t)时,引擎做了什么?我们以前定义了o(t)= sink(t) + state(t) - > o(t) - > o(t)= sink(t) + operatorsState(t) +源代理(t)。对于发动机,当出现故障转移时,批处理交易)可以实现更改(例如功率)的影响:如果结果已经存在,则使用现有结果来消除不确定性计算带来的副作用。如果先前的结果不存在,则不会影响外部系统的权利。

  如果我们的计算过程肯定可以肯定,那么上述条件的适当和必要条件会发生什么?在确定性计算的前提下,如果可以将引擎输出结果的接受端作为功率实现,那么许多限制将被简化。.bavy o(t)= sink(t) +状态(t),引擎的内部在电力状态和其他状态更新中很好地实现。如果发动机的下游系统也意识到数据功率,则当故障转移出现在T?T + N中时,故障转移出现在房间中,当故障转移出现在T?T + N中时,它会出现。引擎可以直接直接通过重新计算T?T + N之间的所有值,输出到下游使用。

  因此,在仅具有确定性计算的流计算系统中,末端到末端的足够必要条件可以降解为:在流量计算过程中,外部结果的外部结果的最终结果是必需品结果,如果您认为无法存储吞吐量,则有必要定期存储在批处理中。在上述条件下删除了“交易”要求的原因:如果在提交此批次数据的过程中存在异常,例如仅部分零件,例如节点的结果是输出的一部分,并且其他节点的失败丢失了,并将上一批的状态返回到上一批数据。在此过程中,由于只有确定性计算,无论是发动机,无论是发动机,无论是发动机,无论是发动机,还是发动机外部,数据的一致性都可以通过电源来保证。

  在实际的流计算引擎中,结果的大部分定义是相同的,主要包括输入源消费者移位源(T),例如Kafka Offset,操作员(T),例如火花RDD的血缘,输出,输出量(t)的结果,例如KAFKA事务消息,但是结果存储的方法是不同的。让我们看一下该行业中几个主流流计算引擎的设计考虑因素。

  目前,流计算引擎有许多类型。并非所有发动机都可以实现一致的流处理。在具有这种能力的引擎中,考虑到技术成本,引擎架构和功能,将有不同的选择和实现。例如,Flink使用轻巧的“分布式一致性快照”来进行状态管理。Kafka流为什么不使用?能力等输出能否一致?本章将一一回答上述问题。

  在2013年,Google发布了一篇题为“磨坊:耐故障流的流程”的文章。大规模的,户外的数据Procesig”)与20世纪初期GFS(Bigtable and MapReduce)中三篇论文对大数据的影响相媲美。后来,Google继续在磨刀上开发。“流计算”,因此我们专注于分析的磨坊。

  Millwheel使用一种称为“强生产”的机制将每个操作员的输出导出到将下游发送到下游之前持续的。“实际 - 时间存储每个中间计算结果”。用于流计算方案的情况下,计算不确定,当故障转移时,引擎将从源发送消息以提出原因。多次计算可能会产生不一致的结果,但是因为“强大的生产”将集中在计算上,因此,即使进行了多次进行,仅一次,只有一次,仅一次出口到下游(下游操作员或结果)接受结束)。总体观点,数据得到满足。“有效的决定论”。

  Millwheel将为每个记录提供每个记录的独特ID,同时,它维护了一个基于此ID处理当前记录的目录。对于每个流入当前操作员的记录,该引擎将此ID目录找到到确定是否已经处理了此记录。这里有许多技术挑战,这里有一些例子。

  例如,稳定且高通量存储的后端需要用于结果存储,而Google内部的功能则扮演其角色。在流媒体任务之前和之后,引擎将优化流流,例如将多个逻辑运算符合并为单个操作员(类似于Flink中的链),节点中的第一个合并(计数 /总和),然后洗牌等。所有操作员都意味着减少运算符之间IO的数据量表。

  此外,当判断“当前记录已经处理过,磨刀键都使用Bloom过滤器进行预滤波,因为在正常运行的流计算任务中,大多数记录时间都不会重复。这不会重复。这是不重复的。不重复。不重复。它只是适合Bloom滤波器的使用方案(例如,如果过滤器返回而没有存在的情况,则不存在记录)。引擎中的每个节点都以记录ID为主键。在计算此过滤器之前,它将在计算此过滤器之前通过此过滤器。确定,如果提示不存在,则执行数据处理。当然,磨坊实际上在实际使用中实际使用了Bloom过滤器,这做出了多个转换,并且不是在这里专门推出的。

  作为一个内部系统,磨坊可以存储每个中间结果,但是对于开源系统的Apache Flink,并非每个公司都有这样的完整技术基础架构。Flink会定期以交易方式批量存储结果。此处的“结果”如上所述,由接收器(t)和输出结果接收器(t)组成,其中源状态源(t),operatorState(t)和输出。源状态和操作员状态为包装,统称为“分布式一致性快照”(基于Chandy-Lamport分布式Express Photo算法),数据将在RockSDB中耐用。

  如上图所示,Flink Engine将以2pc的方式提交结果(每个周期称为时代)。实际上,即使不考虑结果输出,Flink的“分布式一致性快照”的实现也是2PC过程:操作员状态类似于2PC的准备阶段,但对提交的确认仅需要Coink Jobmanager(Flink Jobmanager)启动了“是否已收到完整的操作员是否已接收到“已接收到完整的运营商”来启动COMMIT.在这里还满足了快照生成的结果2PC的结果,末端到末端一致性数据处理语义的适当和必要条件:在流动计算过程中,以方式使用常规(时期)(2PC))将结果存储在批处理(2pc)中。(分布式一致性快照+编写外部存储)。应该注意的是,因为Flink会使用Epoch作为定期输出结果,因此流动处理系统BASED将具有一定的末端 - 端延迟。

  Kafka Streams是Apache Kafka 0.10.0版本中包含的Java库。严格来说,这不是完整的流处理引擎。使用此库,用户可以基于kafka.kafka流的真实时间数据处理应用程序构建一个状态,需要数据输入源和输出作为KAFKA消息队列。

  Kafka流中的“结果”也以交易的方式批量生产,并且与Flink不同,这些结果将写入不同的消息队列:

  Kafka流式传输定期将上述结果分批存储在批处理中。上述交易称为Kafka中的Transacts API。使用此API构造的流处理应用程序可以同时提交多个主题消息。IFIF交易已终止或退回,下游消耗不会读取相应的结果(当然,下游消费者还需要配置相应的一致性级别)。该过程如下图所示:

  如果您回顾弗林克一致性的逻辑,您会发现这两个点有许多相似的点,因此kafka流的输出结果也将具有一定的末端 - 端延迟。提交结果,平均交易大小由提交间隔确定。当流量相同时,较短的提交间隔将导致小型交易,但是太小的间隔将导致吞吐量下降。因此,在末端到末端处理延迟之间是妥协的。

  同时,我们需要注意,Flink和Kafaka中的“交易”提交与我们常规操作-Type数据库中的事务仍然不同。运算符状态等,流量计算引擎需要设计一个全局交易协议,以与每个存储后端交互以提交到下游。例证:Kafka Streams的输出后端需要KAFKA,以与交易提交过程合作。计算输出的观点,这些消息已成功地同时处理到下游,但是从结束到末端的一致性的角度来看,它们仍然属于不一致的数据。在另一个示例中,使用Flink处理CDC(更改数据捕获)场景。如果下游是mySQL,则在完成FLINK 2PC之前,实际上已经提交了来自不同弗林克节点的数据输出。与Kafka Broker中的消息类似,无法撤回MySQL提交提交交易不能退回的交易,因此在输出数据中需要类似的字段来实现隔离语义以阻止此不一致的数据。

  这里提到的火花流是指基于“微批量,微批量”的原始火花流处理引擎。Spark还建议结构化流媒体使用连续处理模式来替换“微批量”来解决延迟问题。例如,也使用了链式lmmport算法。结构流目前不成熟。目前,它不能完全支持一开始的处理,因此,这里是对比较火花流的重点。

  火花流只能确保发动机的内部处理逻辑是一致的,但是对于结果的输出,没有特殊的抽象。因此,如果我们想实现末尾 - 端的一致性语义,我们需要自行维护和判断一些信息。类似于传统的批处理处理系统,该流处理还可以从RDD构建整个数据血液。发生故障转移时,可以重新计算整个RDD。可以记录每个RDD分区的执行,并避免重复执行(功率等),也可以在一定程度上保持一致,但这需要大量的转换。最终形式将类似于磨刀;2;2;2,条件不足II“事务存储”需要确保每个RDD输出链接的交易性(例如HDFS的最终结果不是原子)。

  考虑一个相对简单的方案:没有未确定的计算流量计算应用程序。等等。然后,火花流可以实现 - 到端的一致性。其原因是,当用火花流邮寄形式的结果定义时,它会发现当结果以“ Micro -batch的形式存储”时“源和操作员自然状态和输出导致RDD血液自然和输出结果。结合,也就是说,当输出的最终结果时,我们实际上输出了源和操作员状态,并且操作符合一致性状况。

  此外,当仅具有确定性计算的火花流(功率)和仅具有确定性计算(功率输出)的flink时,将发现这两者非常相似。RDDBlood Edge分布分布一致性快照,批量输出类似于一致性的一致性一致性。结果输出,微批量比率时期。区别在于:1。在计算过程中的每个RDD生成阶段中,火花流将延迟,并且可以在计算过程中实时处理FLINK;2. Spark流只有一个“时代”,Flink可以具有多个多倍。“时代”存在。基于上述两个原因,Flink数据处理的末端 - 端延迟较小,但是这两个发动机的输出可以达到一致性。

  我们简要描述当前主流流计算引擎的一致性实现机制。整体,如果实现了末端 - 端的一致性,则有必要满足正式定义得出的适当和必要条件:真实的时间存储每个中间和最终计算结果都需要定期存储在批处理中。此处的结果包括流动计算引擎的状态。上述完整的必要条件可以进一步简化,也就是说,实时存储结果或常规交易可以视为当前处理逻辑单元(操作或最终存储)上游输入(发动机状态+输出结果)。返回到最后一批批处理的最后一致性状态 - 终端到端共识的端到端一致性。

  下图列出了每个发动机的末端 - 到末端一致性的路线图:

  在实现先前的分析结束 - 到末端一致性时,重点是分析引擎处理(操作员)和输出最终行为。没有提及数据源的要求。它属于基本要求,在这里不再扩展。

  从流量计算的本质开始,本文得出了流处理中末端到末端一致性的一般解决方案。同时,与一般解决方案方法相结合,分析了当前主流流量计算引擎对当前一致性实现的实现。具有“财富和粗糙”类型的Google Millwheel被强大的状态基础架构使用管理;具有“思想和灵魂”类型的Apache Flink巧妙地结合了分布式的一致性快照和两个阶段的交易实现;剑波的Apache Kafka流”“ Sword Wufeng”直接传输流程处理过程,阻止了逻辑的基础逻辑,它的逻辑是逻辑的,它而且编程模型和理解成本更简单(当然,在一定程度上可以限制其使用场景);也有“有力开发” Apache Spark(结构化)流媒体,底部的某些实现想法是变得越来越像Apache Flink。可以预期,它可以在批处理过程中达到类似的Apache Spark的状态。

  当然,尽管发动机太多,但背后有几条主要线条。我希望我们能够拉开雾气并受到营销的头的影响,我们可以理解一些更重要的东西。本文中的末日流程处理的一致流数据处理侧重于“计算”的管理。和状态”,但实际上,需要考虑许多因素,例如时间窗口的推导,延迟数据的处理策略以及计算节点的通信容错的底层等,这些问题还将影响数据的一致性。考虑到文本的长度,它不会在这里展开。有兴趣的学生可以在深度研究中选择一个主题。

  以下论文非常有助于进一步理解流量计算。有兴趣的学生可以参考:

  作者|Qiguang Source |阿里技术公共帐户