在现代计算领域,我们在计算领域取得了很多进步和快速发展。市场上有如此多的分布式处理软件,处理模式正在频繁地变化。这些软件提供了强大的功能,可以通过高度可扩展的架构来处理大量数据,从而提供根据处理需求动态扩展和缩小的灵活性。
许多分布式软件被组织用作技术现代化计划的一部分,以取代旧的遗留应用程序,从而利用可扩展性 和云原生功能并使用现代处理技术更快地处理数据来获得优势。
现代分布式处理软件提供了强大且可扩展的功能,用于处理大量数据集和数据流。用于分析的分布式数据 处理是每个大中型创新组织中快速扩展的生态系统。所有这些企业都非常重视并专注于这一领域,以拥有可扩展且高性能的系统来处理具有许多复杂数据处理需求的大量数据集。
虽然这些软件应用程序是为高性能数据处理而设计的,但在某些处理场景中您可能会遇到性能问题。在本文中,我将讨论分布式处理应用程序遇到的关键性能挑战之一以及解决性能瓶颈的一些潜在解决方案。该问题与您的工作中的数据分布不均匀有关;它可能导致任务执行不平衡和性能瓶颈。这个问题可能出现在任何类型的处理中,例如,数据聚合和汇总任务,如分组缩减任务或处理任务,在这些任务中,我们加入大数据集以在连接大量数据集后提取有意义的信息。在这种情况下,要处理的大量数据集高度倾斜,这导致处理节点之间的数据分布不均匀,从而导致处理时间线效率低下和退化。这种不均匀的数据分布会导致吞吐量较低和端到端延迟较高。管道可能会失败并可能导致内存溢出并最终进入崩溃循环。
利用现代分布式软件构建的应用程序正在取得成功,并满足组织支持不断变化的数据动态的需求,每天都会产生更多的数据并进行处理,以提取用于多种目的的有意义的见解。当这些现代技术堆栈必须处理的数据对于分布式处理框架来说不一致和统一并且高度倾斜时,几乎没有什么挑战,从而给分布式处理设计带来挑战。
本文将特别关注分布式处理范例中与数据偏斜相关的挑战。正如摘要部分所提到的,偏度可能会导致严重问题,甚至可能导致流程失败。有多种流行的解决方案可以解决数据倾斜问题,并利用底层分布式基础设施的全部功能以最佳方式处理数据。下面列出了几个最突出的解决方案:
Salting:在此技术中,通过向密钥添加随机值来扩展密钥,以帮助在任务槽之间均匀分布数据以消除偏斜。该技术可能适用于某些类型的操作(例如组缩减),但对于其他类型的操作(例如连接操作)来说是一个挑战,在连接操作中必须将相同的随机值添加到两个数据集的键中,以确保连接仍然按预期工作。如果我们使用分布式 SQL 进行处理,这是可以完成的,但对于其他场景来说,这将是一个挑战,例如,如果我们编写了一个带有通用连接框架的框架来进行分布式处理。
重新洗牌:在此技术中,对倾斜数据集调用重新洗牌操作,以显式破坏融合运算符并将数据重新分配到未充分利用的节点。但对这种技术的一个警告是,仅在必要时才使用重新洗牌,因为它是一把双刃剑,不应该在任何地方使用。同样,这可能适用于聚合操作,但对于倾斜的连接操作不是很有效。
重新设计倾斜数据集的数据分布逻辑:在这种方法中,重新审视用于分布式处理的跨任务槽的数据集分布,以采用多步骤分布策略来设计一种分布处理逻辑的方法。这种策略有一个缺点:通过多次移动数据,我们增加了网络内传输更多数据的风险,这可能会降低管道的性能。这种方法对于需要对分布式集群中的每个节点进行大量数据处理的用例和情况是有利的,并且与处理数据相比,移动数据的开销无关紧要。同样,该策略可能适用于特定的处理场景,但不适用于所有场景。
本文将重点讨论这些现代分布式处理应用程序遇到的一些主要处理挑战,并提供详细的用例和示例。另外,我将推荐一些处理策略来解决处理挑战。本文讨论的这些处理挑战将与利用分布式软件进行大量数据处理有关,其中将分发和处理大量数据集。
以下是基于 Apache Spark、Apache Storm、Apache Hadoop、Flink、Samza、Beam 等软件构建的分布式处理应用程序中遇到的一个主要问题。
根据我在技术现代化计划中的经验,我遇到了处理倾斜数据集的挑战。使用分布式软件设计应用程序来处理大量数据集,并具有主要处理用例,例如大数据集的联接、复杂的转换以及数据聚合以生成汇总输出。在此类处理用例中,特别是对于大容量数据集,数据倾斜是处理的主要挑战。当我们利用应用程序的扩展将处理分布到多个工作节点时,事实证明,倾斜的数据集是一个主要的性能障碍。
至关重要的是,性能问题可能有多种根本原因,检测和解决性能问题需要采用协调的方法,包括性能分析、监控和分析。建议利用监控和分析功能来收集性能指标并检测需要优化的问题区域。
我们将在本文中讨论的一个示例是倾斜数据集的连接操作,其中跨处理槽的数据分布基于连接键。这些连接键无法跨处理槽均匀分布数据集,从而导致基数峰值。当一些连接键具有与其关联的大量数据时,就会出现问题。将分配这些键的处理槽将具有进入这些槽的所有关联数据,并且具有与其关联的较少数据的连接键的剩余较大部分将仅被分配数据集的较小部分。这会导致处理槽中的数据偏斜和数据分布不均匀。数据偏斜的主要原因是基数爆炸,这会导致许多其他不利影响,在最坏的情况下,可能导致流程失败。
为了更好地解释问题陈述,我将举一个例子,其中数据集中 85% 的记录仅链接到 10% 的 Join 键。在这种情况下,利用多个节点进行分布式处理,85% 的数据将传输到 10% 的节点,因为连接操作将根据连接键将数据集分布到处理节点上。由于连接键将均匀分布在处理槽中,因此处理 90% 连接键的大多数节点将快速完成,因为它们只有来自较大数据集的 15% 的数据和剩余 10% 的连接键,这,我们说有 85% 的与之关联的数据集必须处理大量数据集的 85% 的倾斜部分。这将导致分配这 10% 连接键的处理节点运行时间更长,并且当分配了 90% 连接键的其他节点在完成处理较小部分的连接键后处于空闲状态时,将难以用有限的资源处理大量数据。大量的数据集。这降低了作业的整体执行效率。此外,倾斜的数据集可能会导致某些执行器内存溢出,从而导致作业失败。如果少数连接键拥有与其关联的大部分数据,则可能会发生内存溢出。例如,一个连接键包含来自一个数据集的 2000 万条记录,这些记录具有相同的连接键。在这种情况下,无论处理的并行度有多少,所有 2000 万条记录都将进入同一个处理节点。如果节点内存不足以处理 2000 万卷,则可能会遇到内存溢出并可能导致进程失败。这对于任何生产运行来说都是最糟糕的结果,可能需要立即解决。
我们将通过使用实际数据场景定义问题陈述来进一步介绍此示例。在下面的问题陈述中,我们有两个需要连接的大量数据集,连接的结果将用于从两个数据集中选择所需的属性以进行后续处理。
在下面的用例中,我将给出一个示例场景和一些数字统计数据来说明问题。这将有助于我们更好地理解倾斜数据集问题造成的影响和瓶颈。我还将提出一个解决方案,可以设想和开发为该问题的通用且可重用的解决方案,从而消除任何此类必须处理倾斜数据集连接问题的用例的瓶颈。
我将从倾斜数据集连接处理场景的图示开始:
在上面两个数据集场景之间的 Join 操作的图示中,第一个数据集大约有 1.7 亿条记录,第二个数据集相对较小,大约有 3500 万条记录。两个数据集基于标准连接键进行连接,并且与第一个数据集中的其他连接键相比,第二个数据集中的一些连接键具有过多的具有相同连接键值的记录。当分布式软件执行这两个数据集之间的连接时。数据基于连接键分布在处理槽中,并且具有相同连接键的所有记录都被分配到两个数据集中的相同处理槽。
这会导致一些处理槽出现偏斜,这些处理槽被分配的键具有来自第一数据集的不成比例的数据量。在上图中,我们展示了跨多个处理槽发生的一些连接。让我们保持简单,假设每个槽都分配有两个连接键。
任务槽 1 被分配了两个连接键,其中第一个数据集分别有 500 万和 400 万条记录,而第二个数据集有一条记录。这导致该任务槽为连接操作处理九百万条记录。
对于第二个任务槽和第三个槽之后的剩余任务槽,连接条件不会创建倾斜的数据集。第一个数据集中的数据不是那么高,只有几百条记录与第二个数据集中的一条记录具有相同的连接键。
同样,在第三个处理槽中,分配给该任务槽的两个连接键分别拥有 1100 万条和 900 万条记录,与第二个数据集中的单个记录相对应。这导致该任务槽为连接操作处理 2000 万条记录。
简而言之,这种连接操作的问题是在所有可用的处理槽中处理连接操作的数据分配不均匀;每个槽都分配有相同数量的连接键。现在,具有相对于分配的连接键的倾斜数据集的槽将必须处理具有连接键的非倾斜数据集的相对槽的大量数据。在上图中,第一个和第三个插槽必须处理这种情况,并且与其他插槽(例如第二个插槽以及第三个插槽之后直到最后第 n 个插槽的所有插槽相比,它们必须处理大量数据,并且只分配了几百条记录) 。所有插槽都具有类似的资源和基础设施,因此第二个插槽以及第三个插槽之后的所有插槽直到最后一个插槽将快速完成处理并处于空闲状态。相比之下,插槽一和插槽三将继续在更长的时间内处理数据。在这种情况下,我们无法最佳地利用分布式基础设施。我们将不得不处理更长的时间,当我们有空闲的可用插槽但无法利用它们来加速处理和优化性能时,会导致性能下降。
在这种情况下,尽管连接键的数量在处理节点之间均匀分布,但很少有连接键具有均匀分布,并且其他组连接键具有与连接键匹配的数据的倾斜部分,从而导致较高的数据量数据进入那些处理槽。当我们对倾斜数据集执行连接操作时,这种情况很常见。这种情况会导致处理周期更长。对于处理节点来说,这将导致背压和更高的内存分配,也可能导致内存溢出,因为处理节点将处理数据集的大量部分。
这种情况也会出现在聚合和汇总操作中,我们必须对大量数据集进行某些汇总。汇总键再次导致倾斜的数据集,其中某些键将产生与倾斜的汇总键匹配的数据集的较大部分,而其他键集具有与键匹配的较小数据子集。在这种情况下,我们必须想出一个解决数据倾斜的方案。我们将帮助利用所有处理节点来统一处理数据,从而提高分布式基础设施的性能和更高的吞吐量。
为了解决这个问题,我们提出了一些定制的解决方案,可以根据用例进行思考和思考,并选择理想的解决方案来解决这些问题。在所提出的方法中,解决难题的关键是确定连接操作中的哪个数据集导致了偏度。当某些键与其他键相比具有过多的记录时,通常会遇到偏度,这会导致大部分数据集链接到特定的一组键,而数据集的其余部分统一链接到其余的一组键。键。第一步是确定那些具有大量记录的键集。
下图描述和解释了一种自定义解决方案,其中使用广播操作将大量数据集的倾斜部分均匀分布在所有工作槽上,并使用正常的连接操作处理数据集的非倾斜部分,并且由于第二部分是非倾斜的,因此它将均匀分布在所有工作槽中,从而能够最佳地利用所有槽资源:
根据用于连接两个数据集的连接键,确定第一个数据集中具有与其关联的大量记录的顶级键。确定与第一个数据集具有倾斜链接的所有键。
接下来,根据上面第一步中识别的键集,我们可以将第一个数据集分为两部分:第一部分是具有所有倾斜键的部分,第二部分是具有所有非倾斜键的部分。除上述第一步中识别的键之外的键的倾斜部分。它看起来像下面这样:
第一个数据集记录连接键属性所在的位置(所有倾斜的连接键都有链接到连接键的大量数据)。
第一个数据集记录连接键属性不存在的位置(所有倾斜的连接键都有链接到连接键的大量数据)。
可以对第二个数据集执行相同的操作,将数据集分成两部分——第一部分包含具有在上面步骤 1 中标识的连接键的记录,第二部分具有不在上面步骤 1 中标识的连接键中的连接键。
在识别出第一个较大数据集的倾斜部分后,我们需要使用广播以及上面步骤 2 中第二个数据集的匹配记录来处理它。包含密钥的第二个数据集的体积非常小,因为并非所有数据都会倾斜,因此我们设想第二个数据集的重要性中只有 1% 到 5% 属于此类别,并且可以用作广播和将可供所有任务槽使用。通过这种方式,第一数据集的倾斜部分可以均匀分布在任务槽中,并将用于使用广播连接来连接第二数据集。这将导致对倾斜数据集的统一处理,平等地利用所有任务槽,从而加速对倾斜数据集的处理。
较大数据集的剩余部分(未倾斜)可以使用连接键与第二个数据集进行常规连接操作来处理。此连接将以最佳方式执行,并且来自两个数据集的数据将均匀分布在所有任务槽中,因为连接不会倾斜。
使用广播对倾斜数据集执行连接操作,并使用常规连接对非倾斜数据集执行连接操作后,两个结果数据集将连接在一起。它们将产生完整的连接数据集。
该方法使用混合解决方案,其中使用连接操作和广播操作来解决完整的数据集连接操作。下面详细解释了所有上述高级步骤:
使用上述方法解决问题的关键是从较大的数据集中确定倾斜数据集,并从第二个较小的数据集中确定相应的连接键记录。这有助于深入了解数据分布,确定如何处理倾斜数据集并将数据集的倾斜部分与非倾斜数据集部分分离。文章来源:https://www.toymoban.com/diary/problem/478.html
结论
技术正在飞速发展,分布式处理框架正在占据主导地位,用于处理大量数据以提取有意义的信息。虽然这些框架经过了高度优化,但很少有与大批量处理相关的挑战可以通过利用创新技术和方法来有效解决。本文解释了一种这样的方法,通过识别数据集的倾斜部分并使用不同的最佳方法解决它,该方法可能被证明对于处理倾斜数据集非常有益。解决问题的主要思想是识别关注点并以不同的方式分离要解决的关注点,这与倾斜的数据集结构一致,均匀分布在集群的所有节点上,并利用所有节点来处理数据集最优。我希望本文讨论的方法将帮助组织克服与处理大量倾斜数据集相关的挑战。文章来源地址https://www.toymoban.com/diary/problem/478.html
到此这篇关于大容量分布式数据处理中倾斜数据集的处理方法的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!