您可以创建一个散列分布键指定的HAWQ表或随机。使用HAWQ 2.0,您应该使用随机分布,但首先让我们讨论哈希分布如何在HAWQ中工作。
create table foo (id int, bar text) distributed by (id);
HAWQ有一个用于散列分布表的桶概念。基本上,hdfs中有一个文件对应于每个存储桶。使用分区表,每个分区和每个分区有一个文件,但让我们只关注上面的我的foo表。
当你初始化你的数据库时,GUC的default_hash_table_bucket_number被设置。它根据节点数* 6计算(具有85-102个节点的群集是5 *节点数量等等)因此,10个节点群集将具有default_hash_table_bucket_number = 60。因此,HDFS中将有60个文件用于我的foo表。
- 当您针对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中创建一个文件。 vsegs的数量是在运行时基于查询优化器确定的。对于一个小表,优化器可能只执行一个虚拟段,而一个非常大的表可能会为每个主机使用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增加到更高的值。它为每个查询指定整个集群中虚拟段的总数。
嗨乔恩罗伯茨,非常感谢您的回应。我仍然有一个问题:在扩展群集之后,HAWQ是否将数据(导致执行INSERT查询)写入磁盘空间不足的数据节点?谢谢 –
HAWQ段将在INSERT上写入本地数据节点,然后HDFS将复制该数据以实现冗余。如果您有一个空间不足的节点,则应该运行hdfs平衡器以在新节点之间重新分配数据。数据的副本是hdfs的函数,而不是HAWQ。 –
明白了。非常感谢 :) –