我正在使用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
答案 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)