1

Hadoopクラスターがあり、クエリにHiveを使用していますが、そのうちの1つに小さなバケットがある2つの大きなテーブルを結合したいのですが、読んだところによると、両方のテーブルを結合キーでバケット化すると、パフォーマンスが向上するようです。 。

だから私の設定は次のとおりです。

  • 結合キーの両方のテーブルを同じ数のバケットにバケット化し、
  • 小さいテーブルのバケツはメモリに収まります、
  • set hive.optimize.bucketmapjoin = true;
  • 次のクエリを実行します。
SELECT /*+ MAPJOIN(a) */
 count(*)
FROM a JOIN B ON  a.join_key = b.join_key;

質問1:上記の設定はバケットマップの参加をトリガーするのに十分ですか?

質問2:バケットマップ結合についての私の理解は、各バケットのハッシュテーブルを作成し、ハッシュされたバケットを各マッパーにアップロードするローカルタスクを開始することです。この理解は正しいですか?

質問3:上記の理解が正しければ、なぜHiveはローカルでハッシュを行うのですか?なぜ生のバケットをアップロードせず、マップタスクでハッシュを実行するので、並列処理と高速化を実現できますか?

4

1 に答える 1

-1

上記の設定は、バケット マップ結合をトリガーするのに十分ですか?

回答: 1) 「テーブル/パーティションの合計サイズが大きく、マップ結合に適していない」場合は、バケット マップ結合を使用します。必要な設定は次のとおりです。 set hive.optimize.bucketmapjoin = true;

2)「テーブル/パーティションのサイズに制限がない、つまりテーブルサイズが非常に大きい」場合は、SortMergeバケット結合に進みます。必要な設定は次のとおりです。 set hive.optimize.bucketmapjoin = true; hive.optimize.bucketmapjoin.sortedmerge = true; を設定します。hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat; を設定します。

バケット マップ結合についての私の理解では、各バケットのハッシュ テーブルを作成し、ハッシュされたバケットを各マッパーにアップロードするローカル タスクを開始します。この理解は正しいでしょうか?

回答: バケット マップ結合の場合、1) ハイブはローカル マップ縮小結合を実行して HashTable ファイルを作成します。2) ファイルを圧縮してアーカイブし、分散キャッシュにロードします (i- ハッシュ テーブル ファイルが大きいと、分散の伝播が遅くなります)。キャッシュ. ii- マッパーは分散キャッシュからのハッシュ テーブル ファイルを待っています. 3) マップ結合タスクのマッパーへのロード.

上記の理解が正しければ、なぜ Hive はローカルでハッシュを行うのでしょうか? 生のバケットをアップロードせず、マップ タスクでハッシュを実行して、並列処理と高速化を実現するのはなぜですか?

回答: ファイルが大きい場合、以下の問題が発生します i- ハッシュ テーブル ファイルが大きいと、分散キャッシュの伝播が遅くなります。ii- マッパーは、分散キャッシュからのハッシュ テーブル ファイルを待機しています。

したがって、以下の手順を実行すると、パフォーマンスが向上します。

1) ハイブは、ローカル マップ縮小結合を実行して HashTable ファイルを作成します。2) ファイルを圧縮およびアーカイブし、分散キャッシュにロードします
。3) マップ結合タスクのマッパーにロードします。

これにより、マップ結合または通常の結合よりもパフォーマンスが向上します。

于 2016-07-24T03:30:18.207 に答える