2017-03-10 5 views
0

Apache HAWQを使用していて、データを処理しようとしています。私は1つのマスターノードと2つのhawqスレーブを持っています。Apache 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

あなたのテーブル、retail_demo.order_lineitems_hawqは、ハッシュと一緒に配布されなければなりません。 HAWQでこれを行うと、データベースの初期化時に設定されるdefault_hash_table_bucket_numberによってバケット数が決まります。 HDFSには、バケットごとにファイルがあります。これは、固定された数の仮想セグメント、つまりvsegがハッシュ分散テーブルを持つためです。

バケットの数を2通り指定できます。 1つは、テーブルを作成するときに行うことです。

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

あなたがBUCKETNUMを指定しない場合は、バケットの数はdefault_hash_table_bucket_numberで設定されています。

もう1つの方法は、ランダム分布を使用して、オプティマイザが使用する必要のあるvsegを把握できるようにすることです。これも推奨されるアプローチです。 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 

その1つのファイルはfooのデータです。私はランダムに分散されたテーブルを使用しているので、ファイルは1つだけです。

これをハッシュ分散テーブルに変更すると、ファイルが増えます。

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) 

私の単一ノードクラスタが2

[[email protected] ~]$ 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 
[[email protected] ~]$ psql 
psql (8.2.15) 
Type "help" for help. 

gpadmin=# show default_hash_table_bucket_number; 
default_hash_table_bucket_number 
---------------------------------- 
2 
(1 row) 
にバケット番号をデフォルトに設定されているので、私はHDFSでの2つのファイルを持っています
関連する問題