Spark SQL 診断機能を使用して、Spark SQL クエリにおけるパフォーマンスボトルネックをトラブルシューティングします。たとえば、以下の操作が可能です。
実行計画ツリーの可視化により、一目で最も遅い演算子を特定します。
結合時のデータ肥大化(結合出力の行数が入力行数を上回る状態)を検出します。
スキャン対象データのスキュー(テーブル間でデータが不均等に分散し、ロングテール効果を引き起こす状態)を検出します。
診断は、過去 14 日間に正常終了した Spark SQL クエリのみ対象となります。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
AnalyticDB for MySQL Data Lakehouse Edition クラスターData Lakehouse Edition
クラスター用に作成されたジョブ リソースグループ。詳細については、「リソースグループの作成」をご参照ください。
クラスター向けに作成済みのデータベースアカウント:
Alibaba Cloud アカウント: 特権アカウントを作成します。詳細については、「データベースアカウントの作成」の「特権アカウントの作成」セクションをご参照ください。
RAM ユーザー: 特権アカウントと標準アカウントの両方を作成し、その後、標準アカウントを RAM ユーザーに関連付けます。詳細については、「データベースアカウントの作成」および「RAM ユーザーとのデータベースアカウントの関連付けまたは関連付け解除」をご参照ください。
AnalyticDB for MySQL は、AliyunADBSparkProcessingDataRole ロールを偽装する権限が付与されています。詳細については、「権限付与の実行」をご参照ください。
Spark SQL クエリの診断
AnalyticDB for MySQL コンソール にログインします。左上隅からリージョンを選択し、左側ナビゲーションウィンドウで クラスターData Lakehouse Edition をクリックします。Data Lakehouse Edition タブで対象クラスターを見つけ、クラスター ID をクリックします。
左側ナビゲーションウィンドウで、診断および最適化 > Spark SQL 診断および最適化 を選択します。クエリ一覧には、診断可能な直近の Spark SQL クエリが表示されます。下表に各カラムの説明を示します。
カラム 説明 SQL 実行された SQL ステートメント。 クエリ ID クエリの ID。 実行 ID Spark SQL アプリケーション内における SQL ステートメントのシーケンス ID。 ステータス 実行ステータス。有効な値: 完了、実行中、失敗。 開始時刻 クエリの送信時刻。 実行時間 SQL ステートメントの実行に要した合計時間。 最大演算子排他的時間 実行中に、ある演算子がリソースを排他的に保持した最長時間。 ピークメモリ使用量 クエリのピークメモリ使用量。 スキャン済みデータ ストレージレイヤーからコンピュートレイヤーへ返されたデータ量。 操作 診断 をクリックして、クエリの実行詳細および診断結果を開きます。 診断対象のクエリを見つけ、操作 カラムの 診断 をクリックします。
クエリプロパティ ページで、実行計画 タブをクリックして、実行計画ツリーの階層図を表示します。
実行計画ツリーの右側にある クエリレベルの診断結果 をクリックして、クエリの診断結果および最適化の提案を表示します。
クエリレベルの診断結果
AnalyticDB for MySQL は、クエリレベルの統計情報を分析し、既知のパフォーマンスパターンを検出した際に、最適化の提案を提示します。
結合時のデータ肥大化
意味: 結合演算子の出力行数が入力行数を上回っています。これは、過剰な計算リソースおよびメモリリソースを消費する非合理的な結合であり、クエリの実行速度を低下させます。
対処方法: 結合実行前に、結合に関与しない行をあらかじめフィルター処理することで、結合演算子が処理する必要のあるデータ量を削減します。
スキャン対象データ量のスキュー
意味: クエリ実行時に、複数のテーブル間でスキャン対象データ量に著しい差異が生じています。ロングテール効果(最も遅いタスクが全体の完了時間を決定する現象)により、データ読み取り時間が延長され、クエリパフォーマンスが劣化します。
対処方法: パーティション間でデータがより均等に分散されるよう、分散キーとして適切なカラムを選択し、各テーブルのスキャン量を削減します。