を新しいデータ・ノードを追加したり、無作為に。 HAWQ 2.0では、ランダム分布を使用する必要がありますが、最初に、HAWQでのハッシュ配布の仕組みについて話しましょう。
HAWQには、ハッシュ分散テーブル用のバケットの概念があります。基本的に、各バケットに対応するファイルがhdfsにあります。パーティションテーブルでは、パーティションやバケットごとにファイルがありますが、上記のfooテーブルに注目しましょう。
データベースを初期化すると、GUC default_hash_table_bucket_numberが設定されます。これはノード数* 6に基づいて計算されます(85-102ノードのクラスタは5 *ノード数など)。したがって、10ノードクラスタはdefault_hash_table_bucket_number = 60となります。したがって、私のfooテーブルのHDFSには60のファイルがあります。
- fooに対してクエリを実行すると、その1つのテーブルの60個の仮想セグメント(各ファイルに1つ)が存在します。
- クラスタを展開すると、テーブルのバケット数が固定されます。 60個のバケットは動作しますが、すべてのノードに分散されます。
- ハッシュ配布を使用した後は、クラスタ内のノード数に基づいてdefault_hash_table_bucket_numberを調整し、正しいバケット数を持つようにハッシュ分散テーブルを再作成する必要があります。
また、このようなテーブルのためのバケット数を指定することができます。
create table foo (id int, bar text) with (bucketnum=10) distributed by (id);
今、私は私のテーブルのための10個のバケツを持っているためにデータベースを強制的にではなく、default_hash_table_bucket_numberから値を使用しています。
しかし、ランダムに分散されたテーブルがハッシュよりも推奨されています。どうして?弾力性のために。
create table foo_random (id int, bar text) distributed randomly;
この表では、hdfs内に1つのファイルしか作成されません。 vsegの数は、クエリオプティマイザに基づいて実行時に決定されます。小さなテーブルの場合、オプティマイザは単一の仮想セグメントのみを実行し、非常に大きなテーブルはホストごとに6つの仮想セグメントを使用することがあります。
クラスタを展開するときに、データを再配布する必要はありません。データベースは必要に応じて自動的に仮想セグメントの総数を増やします。
hawq_rm_nvseg_perquery_perseg_limitは、1セグメントあたりのクエリごとに作成可能な仮想セグメントの数を決定するGUCです。デフォルトでは6に設定されていますが、増減できます。 hawq_rm_nvseg_perquery_limitはここで重要な別のGUCです。デフォルトは512で、クエリクラスタ全体で実行できる仮想セグメントの総数を制御します。ランダムに分布してHAWQで要約でそう
、:
- 推奨ストレージ技術
- ノードを追加すると、ノードを削除するデータ
- の再配布は、データの再配分を必要としない必要はありません
- hawq_rm_nvseg_perquery_perseg_limitを6から高い値に変更して、麻痺を増やすことができます。
- hawq_rm_nvseg_perquery_limitを512から高い値に増やす必要があります。クエリごとにクラスタ全体の仮想セグメントの合計数を指定します。
こんにちはJon Roberts、ありがとうございます。私はまだ問題があります。クラスタを拡張した後、HAWQはディスクスペースが不足しているデータノードにデータを書き込みます(INSERTクエリを実行する原因となります)。ありがとう –
HAWQセグメントがINSERTのローカルデータノードに書き込むと、HDFSは冗長性のためにそのデータのコピーを作成します。スペースが不足しているノードが1つある場合は、hdfs balancerを実行して、新しいノード間でデータを再配布する必要があります。データのコピーはHAWQではなくhdfsの関数です。 –
入手しました。本当にありがとう :) –