HAWQ随机分配,每个段的磁盘空间几乎已满。添加新的datanode

时间:2017-01-24 09:46:39

标签: greenplum hawq

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

2017-01-27 10:00:55,052 [http-bio-8080-exec-10] [Spring Security Debugger] [INFO] - 

************************************************************

Request received for POST '/app/Login/':

org.apache.catalina.connector.RequestFacade@22b79260

servletPath:/app
pathInfo:/Login/
headers: 
host: localhost:8080
connection: keep-alive
content-length: 81
cache-control: max-age=0
origin: http://localhost:8080
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
content-type: application/x-www-form-urlencoded
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
referer: http://localhost:8080/testapp/app/Login/
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.8,zh-TW;q=0.6
cookie: JSESSIONID=6F6A74E4DDCE967BFBFDC521AF5AFEB8
dnt: 1


Security filter chain: [
  SecurityContextPersistenceFilter
  WebAsyncManagerIntegrationFilter
  HeaderWriterFilter
  CsrfFilter
  LogoutFilter
  UsernamePasswordAuthenticationFilter
  BasicAuthenticationFilter
  RequestCacheAwareFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  FilterSecurityInterceptor
]


************************************************************

感谢

1 个答案:

答案 0 :(得分: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。因此,我的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中创建一个文件。根据查询优化器在运行时确定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增加到更高的值。它指定每个查询在整个群集中的虚拟段总数。