16

大厂运维必备技能:PB级数据仓库性能调优

 3 years ago
source link: https://segmentfault.com/a/1190000023935896
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

摘要: 众所周知,数据量大了之后,性能是大家关注的一点,所以我们在业务开发的时候,特别关注性能,做为一个架构师,必须对性能要了解,要懂。才能设计出高性能的业务系统。

一、GaussDB分布式架构

reqMJrr.jpg!mobile

2eAFVb2.jpg!mobile

所谓集群是将多台物理服务器组建成一个逻辑平台,对外展现一个集群平台的形式。

所谓分布式架构是将数据分而治之。以逻辑进行划分,将数据存放在不同的物理节点。

CN:协调节点 负责接收来自应用的访问请求,并向客户端返回执行结果。Coordinator负责分解任务,并调度任务分片在DataNode上并行执行。

CN:SQL语句的解析和任务规划,把具体的任务下发给DN结构

GTM:生成和维护全局事务ID、事务快照、时间戳等需要全局唯一的信息。

DN:数据节点,负责存储业务数据(支持行存、列存、混合存储)、执行数据查询任务以及向Coordinator返回执行结果。【不单存储还负责计算】

一台物理机【2-4个DN】

UZ3EZrR.jpg!mobile

Coorinator做任务的规划 分发,规划完之后,把具体的任务抛给计算节点。

Crew3 Worker1和Crew3 Worker2就是任务树中的叶节点就是数据的扫描任务,接受下级任务的数据输入,向上级任务输出数据。

Crew2 Worker1和Crew2 Worker2中间的节点就是各种数据运算任务,如Hash计算,Join操作,聚集操作和排序操作。接受下级任务的数据输入,向上级任务输出数据。

在非阻塞的任务流程中,上级任务不需要等待下级完成全部任务返回整体结果级才启动,下级任务生成一条结果记录就可以传递给上级。

阻塞情况下,上级任务需要等待下级任务完成所有数据处理工作。

二、调优原则与流程

ENBRNje.jpg!mobile

说白了,就是少花钱,多办事,资源利用最大化,比如我们在点查询场景的时候尽量使用索引扫描。如果实在不能索引扫描,我们会读取每一条元组和点查询条件进行匹配。

在没有资源瓶颈的情况下,尽量充分利用资源,比如在数据排序的时候,尽量使数据不下盘,在内存进行排序。因为在磁盘中读写的速度,肯定是不如内存的。

  • 静态调优一般架构师会根据业务特征确定集群部署方案,表定义,行列存,复制/哈希分布等设计的过程。方案和表一般确定下来,后期如果要改动,代价很大。
  • 可能作为有经验的人来说,收集统计信息,sql改写,数据库参数配置,plan hint等手段基本都做过,它属于执行态调优。但是没有经验的人可能只知道理论,不知道如何操作,久而久之,理论都忘记了。

EVZ3mmN.jpg!mobile

  1. 防止单点(单个DN)数据多, 导致整个集群有效容量下降。
  2. 防止单点扫描,压力过大。
  3. 通过,分区,索引,局部聚簇实现。(后面会有实践操作)
  4. 选择关联列,做为分布列,比如用id关联,将id做为分布列,这样查询的时候,避免跨计算接点的数据流动,减少网络压力。
  5. 局部聚簇是列存储下独有的手段,通过把表数据按照指定列排序后存储,配合稀疏索引,可以实现表数据的快速扫描。【华为独有的科技】

3Uvmuaz.jpg!mobile

rQjaaaq.jpg!mobile

IbiE3i2.jpg!mobile

三、伴随场景介绍

zUJVRf3.jpg!mobile

发现一个犯罪嫌疑人,还有他的车辆,我怎么通过数据挖掘来找到犯罪团伙的场景。

四、调优实践

vAnEfmf.jpg!mobile

mi2INr.jpg!mobile

Plan Information:在sql语句执行的时候,perf语句会包含非常多的执行动作,也会消耗很多的资源,我们通过perf把这些信息都记录下来。常用的是前2个。Plan 执行过程中每个算子的执行概要信息。比如:scan,join等。另外一个是算子,with信息。

Predicate Information: 算子信息,每条数据扫描,伴随的filter条件,join伴随的关联字段。

Nv6bqyR.jpg!mobile

QZnEJfZ.jpg!mobile

1.会对数据类似于分区,然后进行局部排序

2.并通过元数据信息记录这个区间的最大值和最小值。

IFr63mI.jpg!mobile

CUNone:0我忽略了多少个数据段

CUSome:6我需要扫描多少个数据段

Scan的性能提升的两个主要策略

1)减少实际IO

a)索引

b)pck

c)分区

2)Scan压力均衡

a)调整分布列

iIVv6f.jpg!mobile

数据批量入库的时候,按字段做一些排序。排完序之后,再入库。

uaYnaqZ.jpg!mobile

导入表数据和统计信息。

zYniY3v.jpg!mobile

Time:10.422ms

不包含PCK大概花了23.902ms

pck建立的场景和索引的建立场景是有点像的。

emiqUrr.jpg!mobile

qmM32qJ.jpg!mobile

RRfMv2v.jpg!mobile

J3MZZrM.jpg!mobile

nestloop的在特定场景下,性能会非常好,比如小表join大表的时候,

hashjoin在大多数场景下,性能最优。大表join大表

jYbyyee.jpg!mobile

hash join一般期望数据量小的表做内表,

bAVVF3a.jpg!mobile

hash join:137ms

merge join:775ms

nestloop:1137.9ms

ZrYbyan.jpg!mobile

问题总结:

1.truncate和delete快

答:truncate 整个文件都不读 delete标记元组 删除

2.PCK对入库的数据做局部排序影响较小。

3.MPP数据库性能瓶颈在哪些?

答:数据库性能瓶颈在具体数据处理业务场景,分布式架构场景下,业务CPU吃满了,瓶颈在CPU,内存吃满了,瓶颈在内存。

采集于华云数据仓库GaussDB DWS_数据仓库性能调优-version 5.0-华哥

点击关注,第一时间了解华为云新鲜技术~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK