15

次のように、Hive で 2 つの大きなテーブル (1 つは 10 億行以上、もう 1 つは約 1 億行) を結合しています。

create table joinedTable as select t1.id, ... from t1 join t2 ON (t1.id = t2.id);

2 つのテーブルを同じ方法でバケット化し、id ごとにそれぞれ 100 個のバケットにクラスタリングしましたが、クエリにはまだ時間がかかります。

これをスピードアップする方法に関する提案はありますか?

4

3 に答える 3

17

私が見ているように、答えは@Adrian Langeが提供したものよりも少し複雑です。

まず、BucketJoin と Sort-Merge Bucket Join (SMBJ) の非常に重要な違いを理解する必要があります。

前述のように、 bucketjoinを実行するには、「一方のテーブルのバケットの量は、もう一方のテーブルのバケットの量の倍数である必要があります」、さらにhive.optimize.bucketmapjointrue に設定する必要があります。結合を発行すると、上記の条件が発生した場合、ハイブはそれをbucketjoin
に変換しますが、ハイブはバケット化を強制しないことに注意してください! これは、バケット化されたテーブルを作成するだけでは、指定された量のバケットにテーブルを実際にバケット化するには不十分であることを意味します。テーブルにデータを挿入するクエリの最終段階でのレデューサーの数)。hive.enforce.bucketing
パフォーマンスの面では、bucketjoinを使用する場合、マッパーがアクセスして結合を実行する前に、単一のタスクが「小さい」テーブルを分散キャッシュに読み込むことに注意してください。 ~100m列!
病棟の後、結合はレデューサーで行われる通常の結合と同じように行われます。

SMBJを実行するには、両方のテーブルの同じ列にまったく同じ量のバケットがあり、 hive.optimize.bucketmapjoin.sortedmergetrueに設定するだけでなく、これらの列で並べ替えられている必要があります。
前の最適化と同様に、Hive はバケット化と並べ替えを強制しませんが、テーブルが実際にバケット化され、並べ替えられていることを前提としています (定義だけでなく、hive.enforce.sorting挿入時にデータを設定または手動で並べ替えることによって) - これはどちらの場合も間違った結果につながる可能性があるため、非常に重要です。
パフォーマンスの面では、この最適化は次の理由でより効率的です。

  1. 各マッパーは両方のバケットを読み取り、分散キャッシュの読み込みで単一タスクの競合は発生しません
  2. 実行される結合は、データが既にソートされているマージソート結合であり、非常に効率的です。

次の考慮事項に注意してください。

  • どちらの場合set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
    も実行する必要があります
  • どちらの場合も/*+ MAPJOIN(b) */、クエリに a を適用する必要があります ( の直後で、selectb小さいテーブルです) 。
  • バケツはいくつ?
    これは、この角度から見る必要があります。大きなテーブルはこの方向からの影響が大きいため、厳密に考慮する必要があります。後者の構成は、小さなテーブルに適用する必要があります。経験則として、各バケットには 1 ~ 3 ブロック、おそらく 2 ブロック近くのブロックが含まれている必要があると思います。したがって、ブロック サイズが 256MB の場合、より大きなテーブルの各バケットに最大 512MB のデータを格納するのが合理的であると思われるため、これは単純な除算の問題になります。

また、これらの最適化だけでは、クエリ時間の高速化が常に保証されるわけではないことを忘れないでください。
SMBJ を実行することを選択したとしましょう。これにより、結合を実行する前に 2 つのテーブルを並べ替えるコストが追加されます。したがって、クエリを実行する回数が増えるほど、この並べ替え段階で "支払う" 金額が少なくなります。

場合によっては、単純な結合で最高のパフォーマンスが得られ、上記の最適化のいずれも役に立たず、アプリケーション/論理レベルで、またはメモリ使用量/並列処理などの MapReduce/Hive 設定を調整して、通常の結合プロセスを最適化する必要があります。

于 2013-11-26T14:25:12.220 に答える