DISTRIBUTED MAPJOINは、MAPJOINの最適化バージョンです。 小さなテーブルと大きなテーブルを結合するときは、DISTRIBUTED MAPJOINを使用できます。 DISTRIBUTED MAPJOINまたはMAPJOINを使用して、大きなテーブルでのシャッフルとソートを減らすことができます。
使用上の注意
結合するテーブルのサイズは異なります。 大きなテーブルのサイズは10テラバイトを超え、小さなテーブルのサイズは [1 GB, 100 GB] の範囲内でなければなりません。
小さなテーブルのデータは均等に分散する必要があります。 小さなテーブルにロングテールが含まれている場合、テーブルの1つのシャードに過剰なデータが生成されます。 その結果、メモリ不足 (OOM) エラーまたはリモートプロシージャコール (RPC) タイムアウトの問題が発生する可能性があります。
SQLタスクが20分以上実行される場合は、最適化のためにDISTRIBUTED MAPJOINを使用することを推奨します。
タスクの実行中に過剰なリソースが占有されます。 したがって、小さなクォータグループでタスクを実行しないことをお勧めします。
説明クォータページでクォータグループを変更できます。 詳細については、「新しいMaxComputeコンソールでのクォータの管理」をご参照ください。
分散MAPJOINの使用
SELECTステートメントでDISTRIBUTED MAPJOINを使用するには、ヒント /* + distmapjoin(<table_name>(shard_count=<n>,replica_count=<m>))*/ をステートメントに追加する必要があります。 shard_countパラメーターとreplice_countパラメーターの両方を使用して、タスクの並列処理を決定します。 次の式を使用して、並列処理を計算できます。parallelism=shard_count × replice_count。
パラメーター
table_name: 結合する小さなテーブルの名前。
shard_count=<n>: 結合する小さなテーブルのデータシャードの数。 小さなテーブルのデータシャードは、データ処理のために各計算ノードに分散されます。 nはシャードの数を指定します。 ほとんどの場合、このパラメータは奇数に設定されます。
説明shard_countパラメーターを手動で指定することを推奨します。 shard_countパラメーターの値は、小さなテーブルのサイズに基づいて推定できます。 1つのシャードノードで処理される推定データ量は、[200 MB, 500 MB] の範囲内です。
shard_countパラメーターを大きすぎる値に設定すると、データ処理のパフォーマンスと安定性に悪影響を及ぼします。 shard_countパラメーターを小さすぎる値に設定すると、メモリリソースの過剰な使用によりエラーが発生する可能性があります。
replica_count=<m>: 小さなテーブルのレプリカの数。 mはレプリカの数を指定します。 デフォルト値は 1 です。
説明過度のアクセス要求を減らし、単一ノードの障害によるタスク全体の障害を防ぐために、同じシャード内にデータの複数のレプリカを作成できます。 タスクの並列性が高い、または環境のパフォーマンスが不安定なためにノードが頻繁に再起動する場合は、replica_countパラメーターの値を増やすことができます。 このパラメーターを2または3に設定することを推奨します。
構文
-- Recommended. Specify the shard_count parameter and retain the default value 1 for the replica_count parameter. /*+distmapjoin(a(shard_count=5))*/ -- Recommended. Specify the shard_count and replica_count parameters. /*+distmapjoin(a(shard_count=5,replica_count=2))*/ -- Use DISTRIBUTED MAPJOIN to join multiple small tables. /*+distmapjoin(a(shard_count=5,replica_count=2),b(shard_count=5,replica_count=2)) */ -- Use DISTRIBUTED MAPJOIN and MAPJOIN together. /*+distmapjoin(a(shard_count=5,replica_count=2)),mapjoin(b)*/
例
この例では、tmall_dump_lasttableという名前のパーティションテーブルにデータを挿入するときにDISTRIBUTED MAPJOINを使用する方法について説明します。
JOIN構文
insert OVERWRITE table tmall_dump_lasttable partition(ds='20211130') select t1.* from ( select nid, doc,type from search_ods.dump_lasttable where ds='20211203' )t1 join ( select distinct item_id from tbcdm.dim_tb_itm where ds='20211130' and bc_type='B' and is_online='Y' )t2 on t1.nid=t2.item_id;DISTRIBUTED MAPJOIN構文
insert OVERWRITE table tmall_dump_lasttable partition (ds='20211130') select /*+ distmapjoin(t2(shard_count=35)) */ t1.* from ( select nid, doc, type from search_ods.dump_lasttable where ds='20211203' )t1 join ( select distinct item_id from tbcdm.dim_tb_itm where ds='20211130' and bc_type='B' and is_online='Y' )t2 on t1.nid=t2.item_id;