AnalyticDB for MySQL は、さまざまなシナリオに対応した複数のデータインポート方法を提供しています。ただし、データスキューを引き起こす不適切なテーブルモデリングや、最適でないインポート設定によるリソース使用の非効率性など、さまざまな要因がデータインポートのパフォーマンスに影響を与える可能性があります。このトピックでは、さまざまなシナリオでデータインポートパフォーマンスをチューニングする方法について説明します。
外部テーブルインポートの最適化
分散キーの確認
分散キーは、並列インポートのためにデータがシャード間でどのように分散されるかを決定します。データが均等に分散されていない場合、より多くのデータを受け取るシャードがボトルネックになり、データスキューが発生してインポートジョブ全体が遅くなる可能性があります。これを回避するには、インポート中にデータが均等に分散されるようにしてください。分散キーの選択方法の詳細については、「分散キーの選択」をご参照ください。
分散キーが適切かどうかを確認します。
-
データをインポートする前に、ビジネスロジックに基づいて選択した分散キーを評価します。たとえば、Lineitem テーブルで
l_discount列を分散キーとして選択した場合、そのカーディナリティが低い (個別値が 11 個しかない) ため、深刻なデータスキューが発生します。同じ割引値を持つすべてのデータが同じシャードに送信され、ボトルネックが発生してパフォーマンスが低下します。より適切な選択肢はl_orderkey列です。注文 ID は一意であり、データをより均等に分散するためです。 -
データをインポートした後、データモデリング診断レポートで分散フィールドスキューが示されている場合、分散キーが不均等なデータ分散を引き起こしています。これらの診断を表示する方法の詳細については、「ストレージ診断」をご参照ください。
パーティションキーの確認
INSERT OVERWRITE SELECT を使用すると、インポートされたパーティションは、ターゲットテーブル内の同じ名前を持つ既存のパーティションを上書きします。各シャード内で、データはパーティションキーに基づいてそれぞれのパーティションにインポートされます。パフォーマンスを低下させる外部ソートプロセスがトリガーされるのを避けるには、一度に多くのパーティションをインポートしないでください。パーティションキーの選択方法の詳細については、「パーティションキーの選択」をご参照ください。
パーティションキーが適切かどうかを確認します。
-
データをインポートする前に、ビジネスニーズとデータ分散に基づいてパーティションキーを評価します。たとえば、Lineitem テーブルを 7 年間にわたって
l_shipdate列でパーティション化する場合、日単位でパーティション化すると 2,000 を超えるパーティションが作成されるため、非効率的です。月単位または年単位でのパーティション化がより適切なアプローチです。 -
データをインポートした後、データモデリング診断レポートで過剰な数のパーティションが示されている場合、パーティションキーは適切ではありません。これらの診断を表示する方法の詳細については、「パーティションテーブル診断」をご参照ください。
インデックスの確認
デフォルトでは、AnalyticDB for MySQL はテーブルの作成時にすべての列にインデックスを作成します。ワイドテーブルに全列インデックスを構築するのはリソース集約的です。ワイドテーブルにデータをインポートする場合は、プライマリキーインデックスを使用します。プライマリキーインデックスは重複排除に使用されますが、プライマリキーに多くの列を使用すると、このプロセスが遅くなる可能性があります。プライマリキーの選択方法の詳細については、「プライマリキーの選択」をご参照ください。
インデックスが適切かどうかを確認します。
-
オフラインインポートのシナリオでは、オフライン計算ジョブがすでにデータの重複を排除しているため、通常、プライマリキーインデックスは不要です。
-
タブで、テーブルデータ、インデックスデータ、プライマリキーインデックスデータのサイズを確認します。インデックスデータのサイズがテーブルデータのサイズを超えている場合は、長い文字列値を持つ列を確認してください。これらの列のインデックス作成には時間がかかり、大量のストレージを消費します。これらのインデックスは削除できます。詳細については、「ALTER TABLE」をご参照ください。
説明プライマリキーインデックスは削除できません。テーブルを再構築する必要があります。
ヒントによるインポートの高速化
インポートステートメントに direct_batch_load=true ヒントを追加して、インポートを高速化できます。
このヒントは、V3.1.5 以降の Data Warehouse Edition のエラスティッククラスターでのみサポートされています。大幅なパフォーマンス向上が見られない場合は、チケットを送信してください。
例:
SUBMIT JOB /*+ direct_batch_load=true*/INSERT OVERWRITE adb_table
SELECT * FROM adb_external_table;
エラスティックインポートによる高速化
-
エラスティックインポート機能は、カーネルバージョン 3.1.10.0 以降のクラスターでのみ利用できます。
-
この機能は、ジョブリソースグループが設定された Enterprise Edition、Basic Edition、および Data Lakehouse Edition クラスターでサポートされています。
-
エラスティックインポートは、MaxCompute からのデータ、および Object Storage Service (OSS) からの CSV、Parquet、または ORC データのみをサポートします。
-
エラスティックインポートを使用する場合は、キューの待機時間が長くなることや、実行の遅延、ジョブの失敗を防ぐために、ジョブリソースグループに十分なリソースがあることを確認してください。
エラスティックインポート機能を使用すると、複数のインポートジョブを同時に実行できます。また、より多くのリソースを割り当てることで、単一のインポートジョブを高速化することもできます。詳細については、「データインポート方法」をご参照ください。
例:
/*+ elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/
submit job insert overwrite adb_table select * from adb_external_table;
パラメーターの詳細については、「ヒントパラメーター」をご参照ください。
DataWorks データインポートの最適化
ジョブ設定の最適化
-
書き込みあたりのデータレコード の最適化
このパラメーターは、各インポートのバッチサイズを指定します。ほとんどの場合、デフォルト値の 2048 を維持することを推奨します。
ただし、単一のレコードが 512 KB のように大きい場合は、このパラメーターを 16 に設定することを検討してください。これにより、バッチサイズが 8 MB 未満に保たれ、フロントエンドノードでメモリ使用量が多くなるのを防ぎます。
-
チャネル制御の最適化
-
データ同期のパフォーマンスは、[タスクの最大同時実行数] パラメーターの値に正比例します。[タスクの最大同時実行数]をできるだけ大きくすることを推奨します。
重要[Expected Maximum Concurrency] の値を大きくすると、より多くの DataWorks リソースを消費します。ニーズに合った値を選択してください。
-
同期パフォーマンスを向上させるには、[分散処理能力]を有効にしてください。
-
一般的な問題と解決策
-
クライアントがデータを送信する速度が遅すぎる場合、クラスターの CPU 使用率、ディスク I/O、書き込み応答時間も低くなります。データベースサーバーはクライアントから送信されたデータを処理できますが、受信データ量が少ないため、書き込み TPS が予想よりも低くなります。
解決策: [書き込みごとのデータレコード数] と タスクの最大同時実行数 の値を大きくします。データインポートのパフォーマンスは、インポートの負荷が増加するにつれて線形に向上します。
-
ターゲットテーブルにデータスキューが存在する場合、一部のクラスターノードが過負荷になり、インポートのパフォーマンスが低下します。この場合、CPU とディスク I/O の使用率は低いですが、書き込み応答時間は長くなります。 ページで、スキューのあるテーブルを特定できます。
解決策:テーブルスキーマを再設計してから、データを再インポートしてください。詳細については、「テーブルスキーマ設計」をご参照ください。
JDBC データインポートの最適化
クライアント側の最適化
-
アプリケーションでのデータのバッチ処理
-
JDBC プログラムを使用してデータをインポートする場合は、バッチインポートを使用してネットワークと接続のオーバーヘッドを削減してください。特定の要件がない限り、単一行のインポートは避けてください。
-
バッチサイズは 2048 レコードを推奨します。単一のレコードが大きい場合は、バッチの合計サイズを 8 MB 未満に保ってください。8 MB を単一レコードのサイズで割ることで、バッチあたりのレコード数を計算できます。バッチが大きすぎると、フロントエンドノードで過剰なメモリを消費し、インポートのパフォーマンスが低下する可能性があります。
-
-
アプリケーションの同時実行数の設定
-
アプリケーションからデータをインポートする場合は、複数の同時スレッドを使用してください。単一のスレッドではクライアントリソースを十分に活用できず、クライアント側でのデータ処理とバッチ処理のため、データベースのインポート速度に追いつけないことがよくあります。同時インポートにより、速度を大幅に向上させることができます。
-
最適な同時実行レベルは、バッチ処理、データソース、クライアントマシンの負荷などの要因によって異なります。単一の最適値はありません。ワークロードに最適な同時実行数を見つけるためにテストしてください。インポート速度が予想を下回る場合は、同時実行数を 2 倍にしてみてください。速度が低下した場合は、徐々に減らして最適な設定を見つけてください。
-
一般的な問題と解決策
カスタムプログラムから AnalyticDB for MySQL にデータをインポートする際にパフォーマンスが低い場合は、まずクライアント側のパフォーマンスボトルネックを確認してください。
-
データソースが十分な速度でデータを提供できることを確認してください。データが他のシステムやファイルから取得される場合は、クライアントに出力ボトルネックがないか確認してください。
-
データ処理速度を確認し、データの生成と消費が同期していること、およびAnalyticDB for MySQL にインポートされるのを待っている十分なデータがあることを確認してください。
-
クライアントマシンの負荷を確認して、CPU やディスク I/O などの十分なシステムリソースがあることを確認してください。