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

Where can I find the location of distributed file on slaves using Apache HAWQ?

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

我制作了 table,插入了数据并识别了我使用 postgreSQL 插入的数据。还以为数据主要分布在slaves上

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

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';语句的时候,返回的是空的table,让我有点迷糊。

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

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

综上所述,我的问题如下:

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

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

任何帮助将不胜感激:D

您的 table、retail_demo.order_lineitems_hawq 必须使用哈希分发。当你在 HAWQ 中执行此操作时,桶的数量由 default_hash_table_bucket_number 决定,它是在数据库初始化时设置的。每个桶在 HDFS 中都会有一个文件,这是因为会有固定数量的虚拟段或 vseg,散列分布 tables.

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

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

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

另一种方法是使用随机分布,让优化器计算出它需要使用多少 vseg。这也是推荐的方法。你应该在 HAWQ 中使用随机分布。

CREATE TABLE foo (id int) DISTRIBUTED RANDOMLY;

使用随机分布的 tables,您可以通过调整 GUC hawq_rm_nvseg_perquery_perseg_limit 来指定数据库可以使用的 vseg 的数量。对于具有 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)

并获取 table 的 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”的子目录,它是tablespace oid。在此目录中,有一个数据库目录,然后是 table.

目录下的一个目录
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的数据。由于我使用的是随机分布的 table,因此只有一个文件。

将其更改为散列分布 table,给我更多文件。

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)