日常积累
数仓相关
根据工作日常接触到的术语等进行积累记录
示例 CALL set_table_property(‘public.ods_xhs_goods’, ‘distribution_key’, ‘goods_m_id’);
在提供的 ods_xhs_goods
表定义中,goods_m_id
被用作分布列(distribution key)。要确定是否合理,我们需要考虑以下几点:
-
分布列的基数:
goods_m_id
列的基数是否足够高,使得数据能够均匀分布在所有节点上?如果goods_m_id
是一个高基数的列,那么它通常是一个不错的选择。如果这个列的基数较低,可能导致数据分布不均衡。 -
查询模式:典型的查询是否会使用
goods_m_id
进行过滤或连接?如果goods_m_id
经常在查询中被用作过滤条件,那么选择它作为分布列是合理的,因为这可以减少数据传输和节点间的通信。 -
数据倾斜:有没有数据倾斜的问题?即某些
goods_m_id
的值是否会导致某些节点过载?如果存在这种情况,可能需要重新考虑分布列的选择。
从表的定义和属性设置来看,goods_m_id
作为分布列是合理的选择。但为了进一步确认,我们可以考虑如下几个方面:
校验分布列的合理性
-
基数检查:检查
goods_m_id
列的基数。如果基数较高(例如,有很多不同的goods_m_id
),那么选择goods_m_id
作为分布列是合理的。SELECT COUNT(DISTINCT goods_m_id) FROM public.ods_xhs_goods;
-
数据分布检查:检查
goods_m_id
在不同节点上的数据分布情况。如果数据分布均匀,那么选择是合理的;如果数据倾斜严重,可能需要重新选择分布列。-- 示例查询,具体实现依赖于数据库系统 SELECT goods_m_id, COUNT(*) FROM public.ods_xhs_goods GROUP BY goods_m_id;
其他可能的分布列
如果 goods_m_id
不满足高基数或者数据均匀分布的要求,可以考虑其他列。例如:
source_id
:如果source_id
也有高基数并且查询经常使用它。- 复合分布列:可以考虑使用多个列的组合来增加分布的随机性,如
(goods_m_id, source_id)
。
结论
下述步骤可以帮助确认 goods_m_id
作为分布列的合理性:
- 确保
goods_m_id
列具有高基数(即大量不同的值)。 - 确保
goods_m_id
列在查询中经常被使用。 - 检查数据在节点间的分布是否均匀。
如果所有这些条件都满足,goods_m_id
作为分布列是合理的选择。如果不满足,则可能需要重新评估分布列的选择。
什么叫不合理分布列导致的严重溢出
在数据仓库和大数据管理中,表的分布列(distribution key)用于决定数据如何在不同的节点上分布。这对于提高查询性能和数据处理效率至关重要。然而,如果分布列选择不当,可能会导致数据在节点间的分布不均衡,甚至发生数据溢出,这就是所谓的 “不合理分布列导致的严重溢出”。
什么是分布列?
分布列是用于将表的数据在数据库的多个节点之间进行分片(sharding)的一列或多列。通过合理选择分布列,可以确保数据在节点间均匀分布,避免某些节点过载,从而提升查询和写入性能。
不合理分布列的影响
-
数据倾斜:如果选择的分布列不能均匀地分布数据,可能会导致某些节点存储大量数据(热节点),而其他节点存储很少的数据(冷节点)。这会导致查询时某些节点的负载过高,影响整体性能。
-
查询性能下降:数据倾斜会导致查询时某些节点需要处理更多的数据和计算任务,从而延长查询时间,影响系统的响应速度。
-
资源浪费:不均衡的数据分布会浪费系统资源,因为某些节点可能处于过载状态,而其他节点则处于闲置状态,无法充分利用集群的计算和存储能力。
-
数据溢出:在极端情况下,某些节点可能因为数据过多而超出其存储和处理能力,导致数据溢出,系统崩溃或数据丢失。
如何避免不合理的分布列
-
选择高基数列:分布列应选择高基数(distinct values多)的列,这样可以确保数据均匀分布。例如,用户ID通常是一个高基数列,比选择性较低的列(如性别、地区)更适合作为分布列。
-
避免热点列:避免选择那些可能导致数据集中在少数几个值上的列。例如,布尔值列(只有两个可能值)或具有少量不同值的枚举列不适合作为分布列。
-
使用复合分布列:在某些情况下,可以使用多个列的组合作为分布列,以增加数据分布的随机性和均匀性。例如,使用
(user_id, order_id)
组合而不是单一的user_id
。 -
监控和调整:持续监控数据分布情况,及时调整分布列,以应对数据量和数据模式的变化。许多现代数据库系统提供了自动分片和重新分布数据的功能。
在你的ODS表中的应用
在ODS(Operational Data Store)表中,合理选择分布列尤为重要,因为ODS表往往存储大量运营数据,查询频繁且数据量大。确保数据均匀分布可以显著提升系统的处理能力和响应速度。
总结来说,不合理分布列的定义导致的数据溢出和性能问题是大数据管理中的常见挑战之一。通过合理选择和调整分布列,可以有效避免这些问题,确保系统的高效和稳定运行。