2017-01-24 21 views
0

我正在阅读HAWQ的规范。有一个问题:我创建了一个表(如'table_random'),随机分布在3个数据节点集群中,每个分区的磁盘空间几乎不足。然后我一个新的数据节点添加到集群,然后当我将数据插入到表“table_random”,HAWQ随机分配,每个分区的磁盘空间几乎已满。添加新datanode

- Does HAWQ will distribute data to the old data-nodes ? What will happen actually? 
- Does HQWQ will redistribute the data of table 'table_random' overall the cluster? 

感谢

回答

2

您可以创建一个散列分布键指定的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增加到更高的值。它为每个查询指定整个集群中虚拟段的总数。
+0

嗨乔恩罗伯茨,非常感谢您的回应。我仍然有一个问题:在扩展群集之后,HAWQ是否将数据(导致执行INSERT查询)写入磁盘空间不足的数据节点?谢谢 –

+0

HAWQ段将在INSERT上写入本地数据节点,然后HDFS将复制该数据以实现冗余。如果您有一个空间不足的节点,则应该运行hdfs平衡器以在新节点之间重新分配数据。数据的副本是hdfs的函数,而不是HAWQ。 –

+0

明白了。非常感谢 :) –