您可以在 HAWQ 中创建使用散列分布键或随机指定的表。在 HAWQ 2.0 中,您应该使用随机分布,但首先,让我们谈谈哈希分布在 HAWQ 中的工作原理。
create table foo (id int, bar text) distributed by (id);
HAWQ 有一个用于散列分布式表的桶的概念。基本上,hdfs中有一个文件对应每个bucket。对于分区表,每个分区和每个存储桶都有一个文件,但我们只关注上面的 foo 表。
当您初始化数据库时,GUC default_hash_table_bucket_number 被设置。它是根据节点数 * 6 计算的。(具有 85 - 102 个节点的集群是 5 * 节点数等等)所以一个 10 节点的集群将有一个 default_hash_table_bucket_number=60。因此,我的 foo 表在 HDFS 中将有 60 个文件。
- 当您对 foo 执行查询时,该表将有 60 个虚拟段(每个文件一个)。
- 当您扩展集群时,我的表的存储桶数是固定的。60 个桶仍然可以工作,但它会分布在所有节点上。
- 扩展并使用哈希分布后,您应该根据集群中的节点数调整 default_hash_table_bucket_number,然后重新创建哈希分布表,使其具有正确的桶数。
您还可以像这样指定表中的桶数:
create table foo (id int, bar text) with (bucketnum=10) distributed by (id);
现在我强制数据库为我的表提供 10 个存储桶,而不是使用 default_hash_table_bucket_number 中的值。
但是建议使用随机分布的表而不是散列。为什么?因为弹性。
create table foo_random (id int, bar text) distributed randomly;
现在这个表只会在 hdfs 中创建一个文件。vseg 的数量是在运行时根据查询优化器确定的。对于一个小表,优化器可能只执行一个虚拟段,而一个非常大的表可能每个主机使用 6 个虚拟段。
当您扩展集群时,您不需要重新分配数据。如果需要,数据库也会自动增加虚拟段的总数。
hawq_rm_nvseg_perquery_perseg_limit 是 GUC,它确定每个查询每个段将创建多少个可能的虚拟段。默认情况下,这设置为 6,但您可以增加或减少它。hawq_rm_nvseg_perquery_limit 是另一个在这里很重要的 GUC。它默认为 512,并控制可以在查询集群范围内执行的虚拟段的总数。
总而言之,在随机分布的 HAWQ 中:
- 推荐的存储技术
- 添加节点不需要重新分配数据
- 删除节点不需要重新分配数据
- hawq_rm_nvseg_perquery_perseg_limit 可以从 6 增加到更高的值以增加平行度。
- hawq_rm_nvseg_perquery_limit 可能需要从 512 增加到更高的值。它指定每个查询跨整个集群的虚拟段总数。