View a markdown version of this page

秘匿化ログについて - AWS Clean Rooms

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

秘匿化ログについて

AWS Clean Rooms は、エクスポート前に Spark ログを編集して、エクスポートされたログがメンバーのデータの内容を明らかにしないようにしたり、ソースデータのテーブルとストレージの場所を特定したりします。 はログレコードを AWS Clean Rooms 再構築し、共有しても安全であることがわかっているフィールドのみを出力します。クエリが読み取る列の名前など、一部の情報は意図的に保持されます。

編集ではメンバーを区別しません。別のメンバーの情報と同じ用語で、独自のクエリ用にエクスポートするログから独自のテーブル名とクエリ値が編集されることを想定します。空のフィールドとプレースホルダーフィールドは正常であり、エクスポートの問題を示すものではありません。

エクスポートされたログの内容

エクスポートされたログは、障害とパフォーマンスの問題の診断に必要な情報を保持します。

  • タイミング – タスクとステージの期間、実行時間、CPU 時間、ガベージコレクション時間、逆シリアル化と結果のシリアル化時間、シャッフル待機時間、シャッフル書き込み時間はすべて正確に保持されます。タイミングはパフォーマンス分析の主なシグナルです。

  • Spark 実行識別子とカウント – ジョブ、ステージ、タスク、試行 IDs、パーティション数、タスク数、エグゼキュター IDs、ホスト名、ポート。

  • クエリプラン構造 – HashAggregate、、 などのオペレータ名を含む物理プランツリー。プランの形状とSortMergeJoinExchange、エンジンがクエリの実行をどのように選択したかを確認できます。Spark 自体ではない演算子名は として表示されます[REDACTED]。

  • ソース列名 – スキャン対象のテーブルから取得される列名。フィルター、結合、集計で使用される列を確認できます。エイリアスなど、クエリが作成する名前は保持されません。詳細については、「列名とテーブル名の処理方法」を参照してください。

  • スキャンタイプとファイル形式 – スキャン演算子には通常、読み取られるテーブルの名前が含まれます。名前は、 などのスキャンタイプとファイル形式のみを識別するフォームに置き換えられるためScan parquet、データの読み取り方法を引き続き確認できます。ファイル形式が で AWS Clean Rooms 認識されない場合、演算子は形式なしで Scan として表示されます。

  • エラークラス – クエリが失敗すると、ログはエラーの種類を識別しますが、エラーの原因となったデータは識別しません。Spark のエラークラス、SQLSTATE コード、およびそのクラスに対して Spark が定義する標準メッセージが報告され、メッセージの<placeholder>トークンはデータから取得されるため、未入力のままになります。例えば、失敗したキャストは、あるタイプの値を値を表示せずに別のタイプにキャストできないことを説明するレポート[CAST_INVALID_INPUT]とメッセージです。ある障害によって別の障害が発生した場合、チェーン内のエラークラスは、最大数レベルの深さまで一緒に報告されます。Spark で発生しなかった障害は、非 Spark エラーとしてのみ報告され、 クラスは報告されません。

    個々のタスクの失敗は、 などの失敗の種類のみをレポートしますExceptionFailure。独自のエラークラスはありません。

  • Spark 設定 – 値が常に数値、サイズ、または固定キーワードであり、パフォーマンスの問題の診断に最も頻繁に必要な設定: ドライバーとエグゼキュターのコアとメモリ、メモリの割合とオフヒープ設定、動的割り当て設定、アダプティブクエリ実行設定、デフォルトの並列処理とシャッフルパーティション数、ブロードキャスト結合しきい値、最大パーティションサイズ、シャッフル圧縮設定、スケジューラモード、シリアライザー。設定にはパス、識別子、クエリテキストを含めることができるため、他のほとんどの設定は編集されます。これらの設定の 1 つは、その値がプレーン番号、サイズ、またはキーワードでない場合にも省略されます。

  • メモリ使用率とデータボリューム – ピーク実行メモリ、メモリとディスクのスピル、エグゼキュター JVM メモリ、キャッシュされたデータサイズ、シャッフルブロック数、シャッフル読み取りボリュームと書き込みボリュームを含む読み取りと書き込みのバイト数とレコード数。これらの数値は、正確ではなく切り捨てられます。詳細については、「秘匿化ログと標準 Spark ログの違い」を参照してください。

  • エグゼキュターが停止した理由 – メモリ不足、ドライバーによるシャットダウン、廃止、応答の失敗など、停止した各エグゼキュターのカテゴリ。これは、クエリが失敗した理由を説明する最も速い方法です。ログには、Spark がスケジューリング作業を停止したエグゼキュターまたはホストも記録されます。これは、障害が 1 か所で再発し続ける場合に便利です。詳細については、「秘匿化ログと標準 Spark ログの違い」を参照してください。

  • シャッフルフェッチ失敗の詳細 – タスクがシャッフル出力を取得できない場合、シャッフル、マップ、マップインデックス、および削減識別子は、フェッチが試行されたエグゼキュターとホストとともに保持されます。これにより、通常は応答しないエグゼキュターを示す単一のソースと、通常は一時的なネットワーク問題を示す多くのソースにまたがる障害を区別できます。

秘匿化される内容

  • データ値 – クエリからのリテラル値、および任意のテーブルからのデータ値。フィルター述語は、どの列がフィルタリングされたが、比較された値ではないかを示します。

  • テーブル名とストレージの場所 – テーブル識別子、データベース名、Amazon S3 パス。

  • クエリテキスト – SQL ステートメントとクエリに関連付けられた説明。

  • エラーメッセージテキストとスタックトレース – エラーメッセージはエラーの原因となった値を引用符で囲む可能性があるため、メッセージテキストとスタックトレースは削除されます。ユーザー定義関数によってスローされる例外には、クエリ作成者が選択した名前が含まれるため、基になる例外クラスの名前も編集されます。Spark エラークラスは、代わりにクエリとジョブのために保持されます。ステージが失敗した理由とタスクが強制終了された理由も編集されます。

  • Spark が独自の作業について記録する名前 – ステージとキャッシュされたデータセットの名前と呼び出しサイト、およびアプリケーション名。これらは、テーブル名またはストレージパスをエコーできるフリーテキストフィールドです。したがって、Spark History Server では、ステージは通常それらを識別する説明なしで表示され、代わりに ID とプラン内の場所によってステージを見つけます。

  • 計算列名とエイリアス列名 – クエリエンジンが式からそのような名前を生成し、名前に値を含めることができるため、クエリがテーブルから読み取るのではなく作成する名前。これらは、 などの数値識別子として表示されます#42。詳細については、「列名とテーブル名の処理方法」を参照してください。

  • スキャンの詳細 – 読み取りスキーマ、各スキャンに適用されるフィルター述語 (プッシュダウンフィルター、パーティションフィルター、データフィルター)、およびデータの場所。

  • ドライバーログとエグゼキュターログへのリンク – Spark が各エグゼキュターとドライバーについて記録するログ URLs。Spark History Server では、通常ドライバーまたはエグゼキュターログを開くリンクは入力されません。

  • リソース識別子とサービスエンドポイント – AWS アカウント IDs、IAM ロールや AWS KMS キーなどの ARNs、クエリを実行するために が AWS Clean Rooms 呼び出すサービスのエンドポイント URLs。

  • AWS サービスの詳細 – AWS Clean Rooms クラス名、クラスパスエントリ、JVM 設定、Hadoop およびシステムプロパティ。ジョブプロパティも編集されますが、Spark History Server がジョブを属するクエリ実行に関連付けるために必要な識別子は除きます。

列名とテーブル名の処理方法

エクスポートされたログは、クエリが読み取る列の名前を保持します。クエリで作成されたテーブル名と列エイリアスは編集されます。クエリが作成する名前は、その名前の式から生成され、生成された名前にはクエリの値を含めることができます。 は という名前の列SELECT 'confidential'を生成しますconfidential。したがって、名前は、スキャンされたテーブルの列にトレースできる場合にのみ表示されます。他のすべての名前は数値識別子に置き換えられます。

例えば、次のクエリを検討します。

SELECT user_id, SUM(amount) AS total FROM sales WHERE region = 'us-west' GROUP BY user_id

エクスポートされたログは、次のように表されます。

クエリの要素 エクスポートされたログ
列 user_id、amount、および region 名前で表示されるため、クエリがグループ化、合計、フィルタリングされた内容を確認できます。
テーブル sales、そのデータベース、およびストレージの場所 [なし]
値 'us-west' を に置き換えました [REDACTED]
エイリアス total クエリがテーブルから読み取るのではなく名前を作成したため、 を数値識別子に置き換えました

秘匿化ログと標準 Spark ログの違い

行数とデータボリュームは概算です

レコード数、バイトボリューム、スピルサイズ、ピークメモリ測定値は、正確な数によって別のメンバーのデータのサイズが明らかになる可能性があるため、桁違いに切り下げられます。1,342 個のレコードを読み取るタスクは 1,000 個のレポートを記録します。100 未満の測定値は 0 と報告されます。

すべての数値は切り捨てられるため、100 をレポートするタスクと 1,000 をレポートするタスクは、ほぼ同じ数のレコードを読み取っている可能性があります。1,000 と 10,000,000 など、1 桁だけ異なる数値は慎重に扱います。1,000 と 10,000,000 など、大きな違いは依然として確実に歪んでいることを示しています。

編集された値は複数の形式をとります

クエリプランでは、編集された値がリテラルテキスト として表示されます[REDACTED]。ログの他の場所では、編集されたフィールドは通常空です。Spark History Server が引き続きレコードを読み取れるように、空白の文字列、空のリスト、またはまったく存在しない値である場合があります。どちらの形式も同じ意味です。

クエリプランで使い慣れた演算子構文が使用されていない

プランの式は、数学表記ではなく関数呼び出しとして記述されます。比較は、 EqualTo(#12, [REDACTED])ではなく として表示されます(a = 5)。関数名もこの形式で表示され、ユーザー定義の関数名はまったく表示されません。

物理プランのみが含まれます

エクスポートされたログには物理プランが含まれています。通常付随する解析、分析、または最適化された論理プランは含まれません。

タスクごとのメトリクスは編集されます

プラングラフには、出力行数など、各演算子が報告するメトリクスが一覧表示されます。個々のタスクがレポートするメトリクスには、その背後にあるタスクごとの数値が削除されるため、まったく値が表示されません。タスクレベルの数値の場合は、代わりにステージビューでタスクごとのメトリクスを使用します。

Spark ドライバーメトリクスは切り捨てられます

ブロードキャスト、スキャン、書き込みなどのドライバーで Spark が計算するメトリクスは値を報告しますが、レコード数とデータボリュームが同じ理由で桁違いに切り下げられます。正確な数値は、別のメンバーのデータのサイズを明らかにする可能性があります。

イベントログのみがエクスポートされます

エクスポートには Spark イベントログが含まれます。Spark が一緒に書き込む自由形式のドライバーとエグゼキュターの出力は含まれません。この出力の 1 行には、テーブル名、ストレージパス、またはデータ値を含めることができるためです。診断はイベントログから行う必要があります。

エグゼキュターの失敗に一般的なエラーメッセージが表示される

エグゼキュターが停止した自由形式の理由には AWS Clean Rooms サービスの詳細を含めることができるため、ログは代わりにout-of-memoryの終了、ドライバーによって開始されたシャットダウン、廃止されたエグゼキュター、失われたプロセスなどの一般的なエラーメッセージを報告します。このレコードは に固有 AWS Clean Rooms であり、標準の Spark イベントではないため、Spark History Server やその他のツールでは表示されない場合があります。表示されない場合は、エクスポートされたイベントログファイルで確認できます。

認識されないレコードはデフォルトで編集されます

ログレコードが AWS Clean Rooms を認識しない場合、そのすべてのテキストはフィールド名を含む [REDACTED]に置き換えられ、そのすべての番号はゼロに置き換えられます。レコードタイプのみが保持されます。このようなレコードには診断情報はありません。