在哪里可以使用Apache HAWQ在从站上找到分布式文件的位置?

时间:2017-03-10 10:29:17

标签: hawq

我正在使用Apache HAWQ并试图处理一些数据。我有一个主节点和两个hawq奴隶。

我制作了表格,插入数据并识别我使用postgreSQL插入的数据。我认为数据主要分布在奴隶身上。

执行以下命令时,会出现多个gp_segment_id,给人一种使用多个奴隶的印象。

my_db=# select gp_segment_id, count(*) from retail_demo.order_lineitems_hawq GROUP BY gp_segment_id;
 gp_segment_id | count  
---------------+--------
             3 | 170682
             4 | 170680
             2 | 170696
             1 | 341397
             0 | 170703
(5 rows)

现在,我真的希望看到我的数据分布在从属节点上。但是,虽然我搜索了一些博客,但我不知道该怎么做。我找到了这个https://discuss.pivotal.io/hc/en-us/articles/204072646-Pivotal-HAWQ-find-data-files-for-specific-tables,并按照下面指示的命令。

执行SELECT * FROM pg_filespace_entry WHERE fselocation LIKE '%gpseg0';语句时,空表返回给我,让我有点困惑。

我想要做的是精确定位从属节点上分布式数据的位置。但是,查询语句(select gp_segment_id, count(*) from retail_demo.order_lineitems_hawq GROUP BY gp_segment_id;)不足以让我识别分布式数据的位置。

而且,我在哪里可以指定gp段的数量?每当运行查询时,gp_segments的数量会根据输入数据大小的数量而有所不同。

总之,我的问题如下:

1)在哪里可以找到从节点上hdfs上分布式数据的位置?如果没有,我怎么能相信我的数据分发得很好?

2)有没有办法指定细分数量?如果无论输入数据大小如何都能修复段的数量,对我来说理解HAWQ系统会更好。

任何帮助将不胜感激:D

1 个答案:

答案 0 :(得分:1)

您的表retail_demo.order_lineitems_hawq必须使用哈希值进行分发。在HAWQ中执行此操作时,存储区的数量由default_hash_table_bucket_number确定,该数据库在初始化时设置。 HDFS中将为每个存储桶提供一个文件,这是因为将有固定数量的虚拟段或vsegs,其中包含散列分布表。

您可以通过两种方式指定存储桶数量。一种是在创建表时执行此操作。

CREATE TABLE foo (id int) WITH (BUCKETNUM=4) DISTRIBUTED BY (id);

如果未指定BUCKETNUM,则桶数由default_hash_table_bucket_number设置。

另一种方法是使用随机分布,让优化器确定需要使用多少个vsegs。这也是推荐的方法。你应该在HAWQ中使用随机分布。

CREATE TABLE foo (id int) DISTRIBUTED RANDOMLY;

使用随机分布的表,您可以通过调整GUC hawq_rm_nvseg_perquery_perseg_limit来指定数据库可以使用的vsegs数。对于具有1到85个节点的群集,默认值为6,如果您有足够的资源,可以增加此值以获得更好的性能。

数据的位置......

gpadmin=# CREATE TABLE foo (id int) DISTRIBUTED RANDOMLY;
CREATE TABLE
gpadmin=# insert into foo select i from generate_series(1,100) as i;
INSERT 0 100

现在获取数据库的oid。

gpadmin=# select oid from pg_database where datname = 'gpadmin';
  oid  
-------
 16508
(1 row)

得到桌子上的oid。

gpadmin=# select oid from pg_class where relname = 'foo';
  oid  
-------
 16519
(1 row)

文件路径格式是类似hdfs://hostname:port/hawqfilespacename/tablespace_oid/database_oid/table_oid/filenumber的字符串。初始化数据库时,将设置HDFS中的位置,通常将其设置为“/ hawq_data”(文件空间)。在该目录中,总有一个名为“16385”的子目录,它是表空间oid。在此目录中,有一个数据库目录,然后是该表下的目录。

hdfs dfs -ls /hawq_data/16385/16508/16519
Found 1 items
-rw-------   1 gpadmin hdfs       1016 2017-03-10 10:17 /hawq_data/16385/16508/16519/1

该单个文件是foo的数据。由于我使用的是随机分布的表,因此只有一个文件。

将此更改为散列分布式表,为我提供了更多文件。

gpadmin=# drop table foo;
DROP TABLE
gpadmin=# CREATE TABLE foo (id int) DISTRIBUTED BY (id);
CREATE TABLE
gpadmin=# insert into foo select i from generate_series(1,100) as i;
INSERT 0 100
gpadmin=# select oid from pg_class where relname = 'foo';
  oid  
-------
 16524
(1 row)

我在HDFS中有两个文件,因为我的单节点群已配置为将桶号默认为2.

[gpadmin@hdb210 ~]$ hdfs dfs -ls /hawq_data/16385/16508/16524/
Found 2 items
-rw-------   1 gpadmin hdfs        520 2017-03-10 10:24 /hawq_data/16385/16508/16524/1
-rw-------   1 gpadmin hdfs        520 2017-03-10 10:24 /hawq_data/16385/16508/16524/2
[gpadmin@hdb210 ~]$ psql
psql (8.2.15)
Type "help" for help.

gpadmin=# show default_hash_table_bucket_number;
 default_hash_table_bucket_number 
----------------------------------
 2
(1 row)