0

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

- 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?

谢谢

4

1 回答 1

2

您可以在 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 增加到更高的值。它指定每个查询跨整个集群的虚拟段总数。
于 2017-01-24T21:16:19.990 回答