0

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

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

执行下面的命令时,出现了多个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';语句时,但空表返回给我,让我有点困惑。

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

还有,我在哪里可以指定 gp 段的数量?每当运行查询时,gp_segments 的数量取决于输入数据大小的数量。

总而言之,我的问题如下:

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

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

任何帮助将不胜感激:D

4

1 回答 1

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 设置。

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

CREATE TABLE foo (id int) DISTRIBUTED RANDOMLY;

对于随机分布的表,您可以通过调整 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)

并得到表的 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)
于 2017-03-10T15:31:56.873 回答