人大金仓分析型数据库分布与倾斜

目录

前言

一、本地连接

二、数据倾斜

三、处理倾斜


前言

        在分布式无共享环境中,查询的总体响应时间由所有节点的完成时间来度量。 系统只能与最慢的节点一样快。 如果数据偏斜,具有更多数据的节点将花费更多时间来完成,因此每个节点必须具有大致相等的行数并执行大致相同的处理量。如果一个节点具有比其他节点更多的处理数据,则可能导致性能不佳和内存不足。大表做连接操作时,最佳分布至关重要。 要执行连接,匹配的行必须位于同一节点上。 如果数据未在同一连接列上分发,则其中一个表所需的行将动态重新分发到其他节点。 有些情况下,执行广播动作,每个节点将其各个行发送到所有其他节点上,而不是每个节点重新哈希数据并根据哈希值将行发送到适当的节点的重新分配。


一、本地连接

        在所有节点上均匀分布表能让本地连接的哈希分布可以提供显着的性能提升。 当连接的行位于同一节点时,可以在节点实例中完成大部分处理。 这些连接被称为本地连接。 本地连接最小化数据移动; 每个节点独立于其他节点,没有节点之间的网络流量或通信。

        要做到经常进行连接的大型表使用本地连接,请在同一列上分布表。 本地连接要求连接的两端分布在相同的列上(并且顺序相同),并且在连接表时使用分布子句中的所有列。 分发列也必须是相同的数据类型 ,尽管不同数据类型的某些值可能看起来具有相同的表示,但它们以不同方式存储并且哈希值不同,因此它们存储在不同的节点上。

二、数据倾斜

        数据倾斜可能是由于错误选择分布键或单个元组表插入操作导致的数据分布不均匀。 出现在表级别的数据倾斜通常是查询性能不佳和内存不足情况的根本原因。 倾斜的数据会影响扫描(读取)性能,它也会影响所有其他查询执行操作,例如,连接和按操作分组。验证分布以确保数据在初始加载后均匀分布非常重要。 在增量加载后继续验证分布同样重要。

        以下查询显示每个节点的行数以及最小和最大行数的方差:

SELECT 'Example Table' AS "Table Name",
max(c) AS "Max Seg Rows", min(c) AS "Min Seg Rows",
(max(c)-min(c))*100.0/max(c) AS "Percentage Difference Between Max & Min"
FROM (SELECT count(*) c, gp_segment_id FROM facts GROUP BY 2) AS a;

        gp_toolkit里有两个视图可以供检查倾斜:

  • gp_toolkit.gp_skew_coefficients view通过计算存储在每个节点上的数据的来显示数据分布倾斜。 skccoeff列显示系数,计算为标准差除以平均值。 它考虑了数据系列平均值附近的平均值和可变性。 值越低越好。 值越高表示数据倾斜越大
  • gp_toolkit.gp_skew_idle_fractions view通过计算表扫描期间空闲的系统百分比来显示数据分布倾斜,这是计算倾斜的指示。 siffraction列显示在表扫描期间空闲的系统百分比。 这是数据分布不均匀或查询处理倾斜的指标。 例如,值0.1表示10%偏斜,值0.5表示50%偏斜,依此类推。 倾斜超过10%的表应评估其分配策略

        当创建一个随机分布表(DISTRIBUTED RANDOMLY),数据库以轮询方式将数据分发到表中。 数据库为每个插入或复制操作启动轮询周期的新实例。 因此,将随机分布的表中的单个元组插入分配给第一个节点,将导致数据偏斜。

        当创建复制表(CREATE TABLE子句DISTRIBUTED REPLICATED)时,数据库会将每个表行分发到每个节点实例。 复制表的数据均匀分布,因为每个节点具有相同的行。 使用复制表上的gp_segment_id系统列来验证均匀分布的数据的查询将失败,数据库不允许查询引用复制表的系统列。

三、处理倾斜

        当不成比例的数据流向一个或几个节点并由其处理时,则要处理倾斜结果。 它往往是数据库性能和稳定性问题的罪魁祸首。 它可能发生在诸如连接,排序,聚合和各种OLAP操作之类的操作中。 处理倾斜在执行查询中发生,并且不容易检测数据倾斜。

        如果单个节点失败,即不是主机上的所有节点,则可能是处理倾斜问题。 识别处理倾斜目前是一个手动过程。 如果存在倾斜,但不足以导致失败,则不会成为性能问题。 如果确定存在倾斜,则找到导致倾斜的查询。 以下是要使用的步骤和命令。

        找到要监视倾斜处理的数据库的OID:

SELECT oid, datname FROM pg_database;

        运行gpssh命令检测集群所有节点的文件大小。 使用先前命令将<OID>替换为数据库的OID:

gpssh -f ~/hosts -e \
"du -b /data[1-2]/primary/gpseg*/base/<OID>/pgsql_tmp/*" | \
grep -v "du -b" | sort | awk -F" " '{ arr[$1] = arr[$1] + $2 ; tot = tot + $2 }; END \
{ for ( i in arr ) print "Segment node" i, arr[i], "bytes (" arr[i]/(1024**3)" GB)"; \
print "Total", tot, "bytes (" tot/(1024**3)" GB)" }' -

 如果磁盘使用率存在显着且持续的差异,则应检查正在执行的查询是否存在可能的倾斜(上面的示例输出未显示出明显的倾斜)。 在监控系统中,总会存在一些倾斜,但通常持续时间很短。

        如果出现偏斜,查看排序文件大小:

gpssh -f ~/hosts -e
"ls -l /data[1-2]/primary/gpseg*/base/19979/pgsql_tmp/*"
| grep -i sort | awk '{sub(/base.*tmp\//, ".../", $10); print $1,$6,$10}' | sort -k2 -n

        使用lsof命令找到排序文件所属进程的PID:

lsof /data2/primary/gpseg45/base/19979/pgsql_tmp/pgsql_tmp_slice10_so

        使用ps命令找到PID并确认数据库和连接信息:

ps -eaf | grep 15673
几乎在所有情况下处理倾斜的解决方法是重写查询。 创建临时表可以消除倾斜。 临时表可以随机分配以强制进行两阶段聚合。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值