分布式场景怎么Join | 京东云技术团队

背景

最近在阅读查询优化器的论文,发现System R中对于Join操作的定义一般分为了两种,即嵌套循环、排序-合并联接。在原文中,更倾向使用排序-合并联接逻辑。

考虑到我的领域是在处理分库分表或者其他的分区模式,这让我开始不由得联想我们怎么在分布式场景应用这个Join逻辑,对于两个不同库里面的不同表我们是没有办法直接进行Join操作的。查阅资料后发现原来早有定义,即分布式联接算法。

分布式联接算法

跨界点处理数据即分布式联接算法,常见的有四种模型:Shuffle Join(洗牌联接)、Broadcast Join(广播联接)、MapReduce Join(MapReduce联接)、Sort-Merge Join(排序-合并联接)。

接下来将进行逐一了解与分析,以便后续开发的应用。

Shuffle Join(洗牌联接)

先上原理解释:

Shuffle Join的核心思想是将来自不同节点的数据重新分发(洗牌),使得可以联接的数据行最终位于同一个节点上。 通常,对于要联接的两个表,会对联接键应用相同的哈希函数,哈希函数的结果决定了数据行应该被发送到哪个节点。这样,所有具有相同哈希值的行都会被送到同一个节点,然后在该节点上执行联接操作。

可能解释完还是有点模糊,举个例子,有两张表,分别以id字段进行分库操作,且哈希算法相同(为了简单,这里只介绍分库场景,分库分表同理。算法有很多种,这里举例是hash算法),那么这两张表的分片或许可以在同一个物理库中,这样我们不需要做大表维度的处理,我们可以直接下推Join操作到对应的物理库操作即可。

在ShardingSphere中,这种场景类似于绑定表的定义,如果两张表的算法相同,可以直接配置绑定表的关系,进行相同算法的连接查询,避免复杂的笛卡尔积。

这样做的好处是可以尽量下推到数据库操作,在中间件层面我们可以做并行处理,适合大规模的数据操作。

但是,这很理想,有多少表会采用相同算法处理呢。

Broadcast Join(广播联接)

先上原理解释:

当一个表的大小相对较小时,可以将这个小表的全部数据广播到所有包含另一个表数据的节点上。 每个节点上都有小表的完整副本,因此可以独立地与本地的大表数据进行联接操作,而不需要跨节点通信。

举个例子,有一张非常小的表A,还有一张按照ID分片的表B,我们可以在每一个物理库中复制一份表A,这样我们的Join操作就可以直接下推到每一个数据库操作了。

这种情况比Shuffle Join甚至还有性能高效,这种类似于ShardingSphere中的广播表的定义,其存在类似于字典表,在每一个数据库都同时存在一份,每次写入会同步到多个节点。

这种操作的好处显而易见,不仅支持并行操作而且性能极佳。

但是缺点也显而易见,如果小表不够小数据冗余不说,广播可能会消耗大量的网络带宽和资源。

MapReduce Join(MapReduce联接)

先上原理解释:

MapReduce是一种编程模型,用于处理和生成大数据集,其中的联接操作可以分为两个阶段:Map阶段和Reduce阶段。 Map阶段:每个节点读取其数据分片,并对需要联接的键值对应用一个映射函数,生成中间键值对。 Reduce阶段: 中间键值对会根据键进行排序(在某些实现中排序发生在Shuffle阶段)和分组,然后发送到Reduce节点。 在Reduce节点上,具有相同键的所有值都会聚集在一起,这时就可以执行联接操作。

MapReduce Join不直接应用于传统数据库逻辑,而是适用于Hadoop这样的分布式处理系统中。但是为了方便理解,还是用SQL语言来分析,例如一条SQL:

SELECT orders.order_id, orders.date, customers.name
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

会被转换为两个SQL:

SELECT customer_id, order_id, date FROM orders;
SELECT customer_id, name FROM customers;

这个过程就是Map阶段,即读取orderscustomers表的数据,并为每条记录输出键值对,键是customer_id,值是记录的其余部分。

下一个阶段可有可无,即Shuffle阶段。如果不在这里排序可能会在Map阶段执行SQL时候排序/分组或者在接下来的Reduce阶段进行额外排序/分组。在这个阶段主要将收集到的数据按照customer_id排序分组,以确保相同的customer_id的数据达到Reduce阶段。

Reduce阶段将每个对应的customer_id进行联接操作,输出并返回最后的结果。

这种操作普遍应用于两个算法完全不相同的表单,也是一种标准的处理模型,在这个过程中,我们以一张逻辑表的维度进行操作。这种算法可能会消耗大量内存,甚至导致内存溢出,并且在处理大数据量时会相当耗时,因此不适合需要低延迟的场景。

额外补充

内存溢出场景普遍在如下场景:

1.大键值对数量:如果Map阶段产生了大量的键值对,这些数据需要在内存中进行缓存以进行排序和传输,这可能会消耗大量内存。

2.数据倾斜:如果某个键非常常见,而其他键则不那么常见,那么处理这个键的Reducer可能会接收到大量的数据,导致内存不足。这种现象称为数据倾斜。

3.大值列表:在Reduce阶段,如果某个键对应的值列表非常长,处理这些值可能会需要很多内存。

4.不合理的并行度:如果Reduce任务的数量设置得不合适(太少或太多),可能会导致单个任务处理不均匀,从而导致内存问题。

我能想到的相应解决方案:

•内存到磁盘的溢写:当Map任务的输出缓冲区满了,它会将数据溢写到磁盘。这有助于限制内存使用,但会增加I/O开销。

•通过设置合适的Map和Reduce任务数量,可以更有效地分配资源,避免某些任务过载。具体操作可以将Map操作的分段比如1~100,100~200,Reduce阶段开设较少的并发处理。

•优化数据分布,比如使用范围分区(range partitioning)或哈希分区(hash partitioning)来减少数据倾斜。

Sort-Merge Join(排序-合并联接)

先上原理解释:

在分布式环境中,Sort-Merge Join首先在每个节点上对数据进行局部排序,然后将排序后的数据合并起来,最后在合并的数据上执行联接操作。 这通常涉及到多阶段处理,包括局部排序、数据洗牌(重新分发),以及最终的排序和合并。

举个理解,还是上面的SQL。

SELECT orders.order_id, orders.date, customers.name
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

1.对orders表按customer_id进行排序。

2.对customers表按customer_id进行排序。

3.同时遍历两个已排序的表,将具有相同customer_id的行配对。

这个就有点类似于原生的排序-合并联接了。也是数据库场景的标准处理办法。

对于已经排序的数据集或数据分布均匀的情况,这种方法非常有效。如果数据未预先排序,这种方法可能会非常慢,因为它要求数据在联接之前进行排序。

当然,这个算法也会造成内存溢出的场景,解决方案如下:

1.当数据集太大而无法一次性加载到内存中时,可以使用外部排序算法。外部排序算法会将数据分割成多个批次,每个批次单独排序,然后将排序后的批次合并。这种方法通常涉及到磁盘I/O操作,因此会比内存中操作慢。

2.对于合并步骤,可以使用流式处理技术,一次只处理数据的一小部分,并持续将结果输出到下一个处理步骤或存储系统。这样可以避免一次性加载大量数据到内存中。

3.当内存不足以处理数据时,可以使用磁盘空间作为临时存储。数据库管理系统通常有机制来处理内存溢出,比如创建磁盘上的临时文件来存储过程中的数据。

4.在分布式系统中,可以将数据分散到多个节点上进行处理,这样每个节点只需要处理数据的一部分,从而减少单个节点上的内存压力。​

作者:京东科技 张俊杰

来源:京东云开发者社区 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/699149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

罗技鼠标滚轮模式介绍 | 鼠标滚轮异响 - 解决方案

滚轮模式介绍 针对罗技的滚轮模式进行介绍: 普通滚轮:滚动时有明显段落感,无法快速滚动。 智能滚轮:滚动力量较弱时,与普通滚轮无异;滚动力量大时,鼠标会自动减小滚轮阻尼,从而使滚…

文本编辑器markdown语法

markdown语法 1.介绍 Markdown是一种使用一定的语法将普通的文本转换成HTML标签文本的编辑语言,它的特点是可以使用普通的文本编辑器来编写,只需要按照特定的语法标记就可以得到丰富多样的HTML格式的文本。 2.标题分级 "# " -> 一级标题 &…

应用感知型网络性能管理

网络基础设施似乎日益复杂和先进,迫使网络管理员抛弃传统的管理方法。应用感知型网络性能管理是一种用于监控网络性能的新型整体方法,它为管理员提供了强大的 IT 资源管理功能。应用感知型网络性能管理为 IT 管理员带来了精细视图、动态资源分配、主动故…

【计网】TCP的三次握手四次挥手

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 三次握手(Connection Establishment) 四次挥手(Connection Termination) 结语 我…

详解计算机病毒

1.1 计算机病毒的基本概念 1.1.1计算机病毒的定义 计算机病毒,是指编制或者在计算机程序中插入的破坏计算机功能或者毁坏数据,影响计算机使用,并能自我复制的一组计算机指令或者程序代码 。 1.1.2计算机病毒的危害 (1) 占用系统空间。计算…

Linux lndir命令教程:创建符号链接的影子目录(附实例详解和注意事项)

Linux lndir命令介绍 lndir(链接目录)命令用于创建一个目录树的影子副本,但影子副本中并未填充真实的文件,而是填充了指向原目录树中真实文件的符号链接。这通常对于维护不同机器架构的源代码非常有用。 Linux lndir命令适用的L…

springboot-cache+redis 为指定名称缓存设置独立超时时间

版本 spring-boot: 3.2.2 方案 注册 RedisCacheManagerBuilderCustomizer Bean对指定名称缓存进行定制 Bean RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {return builder -> builder.withCacheConfiguration(// Cacheable 注解使用的cac…

Linux之权限管理

目录 一.chmod 二.ACL权限 2.1概述 2.2应用ACL权限 一.chmod chmod命令是控制用户对文件的权限的命令。 只有文件所有者和超级用户可以修改文件或目录的权限。 使用权限 : 所有使用者 语法: chmod [-cfvR] [--help] [--version] mode file... 参数说明: mode : …

前端学习——vue学习

文章目录 1. < el-form> 属性 model、prop、rules2. v-bind 与 v-model3. v-if 与 v-show4. v-for 循环语句5. 计算属性 computed6. 监视属性 watch7. 下拉框 el-select、el-option8. 自定义事件9. async与await实现异步调用 1. < el-form> 属性 model、prop、rule…

vue3的elementPlus中使用el-input控制用户输入正确金额,el-input-number遇到的一系列问题

今天在做项目的时候&#xff0c;本来顺顺利利就能上线&#xff0c;但是突然上面给了个任务&#xff0c;在输入框输入金额时&#xff0c;小数点后面位数超过三位就不能在输入了。当时我天真的以为这很好解决&#xff0c;接下来发生的事情让我措不及防。 首先&#xff0c;我原先使…

javaScript前端文件一致性校验-md5方法

需求背景&#xff1a;在处理文件上传时使用了第三方平台存储&#xff0c;后端在下载时需要校验与文件与上传时是否一致&#xff0c;已校验文件是否丢失的问题。如我们公司业务场景使用了分段上传&#xff0c;分段上传如果没有校验合并后的文件是否完整&#xff0c;可能会存在部…

Elasticsearch:基于 Langchain 的 Elasticsearch Agent 对文档的搜索

在今天的文章中&#xff0c;我们将重点介绍如何使用 LangChain 提供的基础设施在 Python 中构建 Elasticsearch agent。 该 agent 应允许用户以自然语言询问有关 Elasticsearch 集群中数据的问题。 Elasticsearch 是一个强大的搜索引擎&#xff0c;支持词法和向量搜索。 Elast…

121 Linux C++ 通讯架构实战 nginx源码学习目的,学习源码前期准备

零 nginx 源码学习的目的 把nginx中重要的&#xff0c;有用的&#xff0c;代码提取出来作为我们自己知识库的一部分&#xff0c;以备将来使用 一&#xff0c;nginx 源码在windows 上也可以下载下来。 我们下载下来&#xff0c;注意下载的是nginx 的 linux源码&#xff0c; 只…

项目管理:如何成功完成一个项目

项目管理是一项重要的技能&#xff0c;它可以帮助你成功地完成一个项目。以下是一些关键的步骤&#xff0c;可以帮助你实现这一目标&#xff1a; 1. 明确项目目标&#xff1a;在开始项目之前&#xff0c;你需要明确项目的目标。这将有助于你制定一个明确的计划&#xff0c;并确…

HDFS 之 Topology(Rack) Awareness - 机架感知

1、 简介 机架感知在大型分布式存储系统中非常实用,可以有效保证数据的高可用,同时提升集群稳定性。在HDFS中,也实现了类似Topology Awareness的机制,只不过是采用软件的方式模拟。 2、机架感知存在的意义 分布式存储系统的一个特殊之处在于其通常包含非常多的机器。Clie…

【目标航迹管理(1)】基于d-s证据理论信息融合的多核目标跟踪方法

1 引言&#xff1a;从航机起始方法开始 我们为什么会有这个议题&#xff1f;因为航机起始方法。 处理目标航迹起始的方法主要分为两大类&#xff1a;批处理和序贯。 在杂波密度比较高的环境下&#xff0c;比如有红外卫星或地面雷达监视区域&#xff0c;则选用批处理方法&…

【Spring】SpringBoot 单元测试

目 录 一.什么是单元测试&#xff1f;二.单元测试有哪些好处&#xff1f;三.Spring Boot 单元测试使用单元测试的实现步骤 一.什么是单元测试&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证的过程就叫单元…

Java基本面试问题(一)

上篇文章Java面试10个问题的一些标准回答&#xff1a; Java中的基本数据类型有哪些&#xff1f; 标准回答&#xff1a;Java中的基本数据类型包括整型&#xff08;int, long, short, byte&#xff09;、浮点型&#xff08;float, double&#xff09;、字符型&#xff08;char&am…

chat GPT第一讲

计算机的语言奇迹&#xff1a;探秘ChatGPT的智能回答和写作能力 目前我们这个行业&#xff0c;最火的话题无疑是AI人工智能&#xff0c;类似ChatGPT这样的智能Ai,今天剩下的时间不多&#xff0c;每天一个主题&#xff0c;我给大家讲一下计算机回答问题和写作的能力&#xff0c;…

模型量化--int8量化

文章目录 一、什么是模型量化&#xff1f;二、常见的模型量化方法1.权重量化&#xff08;Weight Quantization&#xff09;2.激活量化&#xff08;Activation Quantization&#xff09;3.混合精度量化&#xff08;Mixed Precision Quantization&#xff09;4. 剪枝和量化&#…