在 Greenplum DB [大数据] 上选择分区策略的更好实践

Posted

技术标签:

【中文标题】在 Greenplum DB [大数据] 上选择分区策略的更好实践【英文标题】:Better practices for choosing partitioning strategies on Greenplum DB [Big Data] 【发布时间】:2013-04-02 23:28:13 【问题描述】:

我想知道是否有人有任何通用指南(除了反复试验),用于为 Greenplum 中的一系列查询类型定义最佳分区/索引的良好策略?

Greenplum 对他们的管理指南有一些建议......但事实是,这几乎是 postgres 文档的复制粘贴,虽然其中一些建议似乎很明显(IE:当表太大而无法放入内存时进行分区),仅仅定义一个好的策略来实现这一点是不够的。

通常 Greenplum 数据库有非常大的表(超过数百 GB),虽然硬件是专门为这种用途选择的,但大多数时候我在处理非常大的数据库时遇到了麻烦(IE:曾经有一个包含 60 个字段的表和超过 2 亿行的数据库,每天增加 4-8 百万个注册表)。

我知道选择合适的分区有一些技巧,比如选择可预测的范围,这些范围将以几乎相等的大小分隔(如日期范围)。但还有一个事实是,当我尝试依赖索引的任何其他数据库时,Greenplum 通过给予某些设置更大的权重来完全不鼓励它们,比如它的随机页面成本,因此根本不使用索引。

但我读过一些完全适得其反的情况:假设您有三个节点,每个节点 64GB 内存,根据 GP,您不应该分区,直到表超过 192,但由于不使用索引,您最终将 seq 扫描每个节点高达 64gb! --- 虽然这仍然可以很快,但如果你强制使用索引,你可以从 20 多秒减少到几毫秒。

另一种已知情况是,在分区时,开销使查询比应有的速度慢很多。

那么,回到原来的问题: 有人对如何定义分区/索引策略有任何好的、坚定的建议吗? 使用我们的一些 ETL,来自源的测试查询可能需要半小时到一整小时,因此跟踪和错误确实会降低生产力。

谢谢。

【问题讨论】:

【参考方案1】:

我认为您的问题的答案不太依赖于数学,而更多地取决于您的用户将如何访问该表。对于日期范围分区,如果用户通常会查找一天的数据,那么每日分区是有意义的。如果用户通常查询更长的日期范围,那么每日分区只会增加开销。 Greenplum DB 表中的每个分区或子分区都被视为一个单独的表(因此文件系统上的一个单独文件),因此您必须扫描的分区越多以满足查询,您需要访问的打开文件就越多。了解您的用户希望如何访问数据,这将为您提供有关可能的分区策略的更好线索。

混合分区策略也很有用。某些用例会支持一个表,其中有最近一周/一个月的每日分区,然后让较旧的分区覆盖更长的时间范围,因为它们访问频率较低,通常用于报告/分析查询而不是行查找或类似查询。

就索引而言,虽然 Greenplum DB 的优化器偏爱表扫描而不是索引访问,但在某些地方索引是有意义的。在某些情况下,我对位图索引很幸运。

不幸的是,GPDB 的调优与其他数据库一样仍然是一种艺术形式,因此可能不可避免地需要进行一定程度的反复试验。

【讨论】:

以上是关于在 Greenplum DB [大数据] 上选择分区策略的更好实践的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 DB2 DB 传输到 greenplum DB

使用 MapReduce 或 Sqoop 将数据加载到 Greenplum DB

出于灾难恢复的目的,如何将 Greenplum DB 复制到另一个数据中心?

开源大数据引擎:Greenplum 数据库架构分析

GreenPlum 大数据平台--安装

Greenplum中定义数据库对象之创建与管理模式