分布式计算细节

2024-02-26 03:32
文章标签 细节 分布式计算

本文主要是介绍分布式计算细节,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据库的设计还是要结合业务模式来分析,例如OLTP通常采用航储存,OLAP通常采用列储存等等。

如果等值查询较多的话,那么按照哈希存储数据比较好;如果范围查询较多的话,那么按照有序数组储存数据比较好。

聚合操作:groupBy,count,sum等。

值得注意的一点是:尽管当前案例的分布式数据库支持sql语法,但底层存储依然采用nosql kv存储方式,因此有更多选择余地。

可采用lsm tree也可使用b-tree。

lsm-tree通过牺牲小部分读性能换来高性能写,使得LSM树成为非常流行的存储结构。

因为相比起提升写性能,提升读性能会容易很多,例如使用memcache等手段都可迅速提升读性能。

其技术思路有点类似Redis的AOF方式,先不考虑排序连续写入一个内存,然后满了后开新进程将内容排序合并到磁盘里。

lsm-tree结构分析:LSM-tree 基本原理及应用 - 简书

目录

一、如何将分布式计算表的数据映射到分布式KV存储引擎

三、分布式数据库如何更改schema

四、优化

五、执行


一、如何将分布式计算表的数据映射到分布式KV存储引擎

分布式系统里最核心的两个部分就是分布式计算和分布式存储。 

对于一个分布式数据库而言,一般将计算的sql layer置于分布式存储的kv之上,示意图如下:

分布式数据库一般同样支持sql语法,但实现逻辑大不一样。

mysql一般直接将数据按照行记录格式进行存储,每一个索引也是直接对应一个文件。而分布式数据库则会将每一个行记录或索引拆分出来,按照key-value的形式在kv存储引擎进行存储。

转换规则如下所示:

又或者这样:

    Key: tablePrefix_tableID_recordPrefixSep_rowIDValue: [col1, col2, col3, col4]

其中 Key 的 tablePrefix/recordPrefixSep 都是特定的字符串常量,用于在 KV 空间内区分其他数据。 对于索引,会为每一个索引分配表内唯一的 indexID,然后按照如下规则编码成 Key-Value pair:

    Key: tablePrefix_tableID_indexPrefixSep_indexID_indexColumnsValueValue: rowID

当然,我们还需要考虑非唯一索引,这个时候上面的方法就行不通了,我们需要将 rowID 也编码进 Key 里使之成为唯一的:

   Key: tablePrefix_tableID_indexPrefixSep_indexID_ColumnsValue_rowIDValue:null

二、如何通过parser将输入的sql语句转为易于执行的AST

AST:抽象语法树

参考链接:TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现 | PingCAP

转换实现示例:

// https://dev.mysql.com/doc/refman/8.0/en/join.html
JoinTable:/* Use %prec to evaluate production TableRef before cross join */TableRef CrossOpt TableRef %prec tableRefPriority{$$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin}}/* Your code here. *//*从左到右一次对应各个参数,具体含义可参考dml.go里的join结构体,此时5个参数*/
| TableRef CrossOpt TableRef "ON" Expression{on := &ast.OnCondition{Expr: $5}$$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on}}/*7个参数,各个参数的含义可参考下面的内容*/
| TableRef JoinType OuterOpt "JOIN" TableRef "ON" Expression{on := &ast.OnCondition{Expr: $7}$$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $5.(ast.ResultSetNode), Tp: $2.(ast.JoinType), On: on}}JoinType:"LEFT"{$$ = ast.LeftJoin}
|	"RIGHT"{$$ = ast.RightJoin}OuterOpt:{}
|	"OUTER"CrossOpt:"JOIN"
|	"INNER" "JOIN"

 使用lex逐项解析语法构造ast节点,然后对ast节点处理后顺序执行

三、分布式数据库如何更改schema

主要参考Google F1里面的schema变更算法。

核心是分为三个阶段,不一次从原始态直接跳到最终态,而是逐层转移,同时最多有两种模式存在,保证最终结果一致。

参考链接:builddatabase/schema-change.md at master · ngaut/builddatabase · GitHub

四、优化

优化过程主要分为逻辑优化(Logical Optimize)和物理优化(Physical Optimize)两个阶段。逻辑优化是将一棵逻辑算子树(LogicalPlan Tree)进行逻辑等价的变化,最后的结果是一棵更优的逻辑算子树;而物理优化则是将一棵逻辑算子树转换成一棵物理算子树(PhysicalPlan Tree)。这棵物理算子树就是我们说的物理执行计划,将交由 TiDB 执行引擎去完成后续的 SQL 执行过程。

逻辑优化阶段时,抽象语法树AST已经转换为对应的逻辑算子树,逻辑优化就是将一个逻辑算子树进行逻辑上等价变换的过程。逻辑优化基于规则实施,典型的规则包括:列剪裁、谓词下推、最大最小消除等。

物理优化是将逻辑算子树转换为物理算子树的过程。在物理优化中,优化器会结合数据的分布(统计信息)情况来对查询计划进行优化,物理优化是一个记忆化搜索的过程,搜索的目标是为逻辑执行计划寻找满足特定物理属性的物理执行计划,并在其中选择代价最低的作为搜索结果,因此也被称为基于代价的优化(Cost-Based Optimization,CBO),例如 DataSource 应该选择怎样的扫描路径(使用哪个索引),Join 应该选择怎样的执行方式(HashJoin、MergeJoin 或 IndexJoin)等。

因为分布式数据库里传递数据有很大的代价,因此在物理优化过程中还会尽量把操作流程下推到节点进行具体处理。

参考示例:

1-聚合查询

 此外,在join的过程中还涉及外连接以哪个表作为驱动表的问题和索引如何选取的问题,这些也都包含在物理优化过程中。要根据统计数据进行判断,决定如何执行操作。

五、执行

在数据库最后的执行阶段,需要尽可能加快执行效率。例如,通过多进程的方式进行join(每次检索部分数据)、不逐行读取而是采用向量化的方式按批读取等。

这篇关于分布式计算细节的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/747589

相关文章

vscode中使用go环境配置细节

1、在docker容器中下载了go的sdk 2、在/etc/profile.d/go.sh里填入如下内容: #!/bin/bashexport GOROOT=/home/ud_dev/goexport PATH=$GOROOT/bin:$PATH  3、设置go env go env -w GOPROXY=https://goproxy.cn,directgo env -w GO

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

1:MSSQL SQL语法篇: BULK INSERT      [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]         FROM 'data_file'        [ WITH       (      [ [ , ] BATCHSIZE = batch_siz

【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节

激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 `FeatureExtraction` 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算(`calculateSmoothness()`)2. 标记遮挡点(`markOccludedPoints()`)3. 特征提取(`extractF

Post-Training有多重要?一文带你了解全部细节

1. 简介 随着LLM学界和工业界日新月异的发展,不仅预训练所用的算力和数据正在疯狂内卷,后训练(post-training)的对齐和微调方法也在不断更新。InstructGPT、WebGPT等较早发布的模型使用标准RLHF方法,其中的数据管理风格和规模似乎已经过时。近来,Meta、谷歌和英伟达等AI巨头纷纷发布开源模型,附带发布详尽的论文或报告,包括Llama 3.1、Nemotron 340

【项目日记】高并发内存池---细节优化及性能测试

终此一生,只有两种办法: 要么梦见生活,要么落实生活。 --- 勒内・夏尔 --- 高并发内存池---细节优化及性能测试 1 细节优化1.1 大块内存的申请处理1.2 配合定长池脱离使用new1.3 释放对象无需内存大小 2 调试Debug3 性能测试4 项目总结 1 细节优化 在前面的文章中我们已经实现了高并发内存池的申请内存逻辑和释放内存逻辑:

AI时代产品经理面临的变与不变:0经验求职产品经理要注意哪些细节?

AI时代,各种产品形态、业务的变化,让市场也对产品经理提出了新的要求,产品经理要有哪些变与不变呢?现在入行产品经理是好时机么?没有技术背景、没有学历有优势如何入行做产品经理?今天我们一起探讨一下! 产品人究竟需要具备哪些能力?看这个最新的能力模型图就知道了。 随着当前市场的细分,不同行业和领域对产品经理的能力要求已经从单一的具备产品专业能力演变成了兼具产品专业技能+行业/业务知识

端口安全老化细节

我们都知道port-security aging-time命令用来配置端口安全动态MAC地址的老化时间,但是后面还可以加上类型: [SW1-GigabitEthernet0/0/1]port-security aging-time 5 type  ·  absolute    Absolute time 绝对老化  ·  inactivity  Inactivity time相对老化 默认

【深度学习 图像分类】图像分类任务细节

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。人工智能教程 实现一个完整的图像分类任务,大致需要分为五个步骤: 1、选择开源框架 目前常用的深度学习框架主要包括tensorflow、keras、pytorch、mxnet,caffe等; 2、构建并读取数据集 根据任务需求搜

【扩散模型(十)】IP-Adapter 源码详解 4 - 训练细节、具体训了哪些层?

系列文章目录 【扩散模型(一)】中介绍了 Stable Diffusion 可以被理解为重建分支(reconstruction branch)和条件分支(condition branch)【扩散模型(二)】IP-Adapter 从条件分支的视角,快速理解相关的可控生成研究【扩散模型(三)】IP-Adapter 源码详解1-训练输入 介绍了训练代码中的 image prompt 的输入部分,即 i