注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

トラブルシューティングリファレンス

このページでは、同期でよく発生する問題と、そのデバッグ手順について説明します。

PKIX および SSL 例外

PKIX および SSLHandshakeException エラーを含む、証明書と TLS のトラブルシューティングについては、証明書と TLS を参照してください。

同期が Response 421 received. Server closed connection エラーで失敗する場合、サポートされていない SSL プロトコルとポートの組み合わせで接続している可能性があります。たとえば、ポート991での暗黙的 FTPS は、古く、サポートされていない標準です。この場合は、ポート21での明示的 SSL が推奨されます。

エグレスプロキシの問題

FTP 同期

FTP/S 同期の場合は、エグレスプロキシのロードバランサーを使用していないことを確認してください。FTP はステートフルなプロトコルのため、ロードバランサーを使用すると、連続するリクエストの送信元 IP が同じでない場合に同期に失敗することがあります。

負荷分散の性質上、失敗は非決定論的に発生します。負荷分散プロキシが配置されていても、同期やプレビューに成功することがあります。

また、HTTP プロキシは FTP および FTPS のアクティブモード転送をサポートしていません。アクティブモードでは FTP サーバーからクライアントに接続する必要がありますが、HTTP プロキシを介してこの接続を行うことはできません。FTP/FTPS 接続で HTTP プロキシを使用する場合、パッシブモード転送のみがサポートされます。HTTP プロキシ経由で接続する場合は、FTP ソースがパッシブモードを使用するように設定されていることを確認してください。

S3 同期

同期または探索が com.amazonaws.services.s3.model.AmazonS3Exception:Forbidden (Service: Amazon S3; Status Code: 403; Error Code: 403 Forbidden; Request ID: null; S3 Extended Request ID: null) エラーで失敗する場合、コマンドがエグレスプロキシを通過する際にエラーが発生していることを意味します。このエラーが発生した場合は、次のいずれかに該当するかどうかを確認してください。

  • リージョン項目が空になっています。接続先の S3 バケットがプロキシとは異なるリージョンにある場合、この項目は必須です。
  • STS が許可リストに登録されていないため、到達できません。
  • S3 URL が許可リストに登録されていないため、到達できません。
  • STS の資格情報が無効であるか、IAM ロールを引き受けることができません。
  • 同期ではプロキシではなく VPC を使用する必要があります。S3 エンドポイントを解決するには、次の設定を追加して、アドレスをプロキシの対象から除外する必要があります。
    • S3 ソースの proxyConfiguration ブロックに、次を追加します。

      Copied!
      1 2 3 4 host: <address of deployment gateway or egress NLB> port: 8888 protocol: http nonProxyHosts: <bucket>.s3.<region>.amazonaws.com,s3.<region>.amazonaws.com,s3-<region>.amazonaws.com

      例:すべての VPC バケットを許可リストに登録するには、次の設定を追加します。

      Copied!
      1 2 3 4 5 6 clientConfiguration: proxyConfiguration: host: <color>-egress-proxy.palantirfoundry.com port: 8888 protocol: http nonProxyHosts: *.s3.<region>.amazonaws.com, s3.<region>.amazonaws.com, s3-<region>.amazonaws.com

同期または探索が Could not list objects in bucket エラーで失敗する場合、リージョンと署名リージョンの両方が設定されているかどうかを確認してください。両方の値を設定すると、このエラーが発生することがあります。問題を解決するには、署名リージョンのみを設定します。

インクリメンタル(差分)JDBC 同期の問題

ソースシステムに対して実行された正確なクエリを確認するには、_data-ingestion.log を参照してください。

インクリメンタル同期の場合は、単調増加する列(たとえば、タイムスタンプや ID)と、その列の初期値が指定されていることを確認してください。

インクリメンタル列を選択したら、同期設定ページの SQL クエリに ? 演算子を追加していることを確認する必要があります(? はインクリメンタル値に置き換えられ、使用できる ? は1個のみです)。たとえば、SELECT * FROM table WHERE id > ? です。

行の欠落と行が更新されない問題

同期済みデータセットに行が不足している、または以前に同期した行が正しく更新されていないと思われる場合は、次を確認してください。

  • 既存のデータセットに新しい行が追加され、その行のインクリメンタル列に格納されている値が現在のカーソルより小さい場合、新しい行は同期されません。
    • たとえば、単調増加する列として ID を使用していて、前回の同期で最後に同期された ID の値が10だった場合、その後で ID が5の行を追加しても、ID が5の行は同期されません。
  • 上記の理由で同期されていない行がある場合でも、次のいずれかの方法で同期できます。
    • インクリメンタル同期ではなくスナップショット同期を実行します。または、
    • 不足している行を対象にするようにクエリを調整し、1回限りの実行として実行します。

重複する行

既存の行が再同期されていると思われる場合は、次を確認してください。

  • ソースデータベースの既存の行が更新され、その行のインクリメンタル列が現在のカーソルより大きい値に変更された場合、その行は再同期されるため、重複します。たとえば、インクリメンタル列として使用している列が、行の挿入時刻または最終更新時刻を表すタイムスタンプであり、データセットの同期と同期の間に行を更新した場合、その更新された行は再同期されます。
    • 上記の理由で重複する行がある場合は、次のいずれかの方法で削除できます。
      • インクリメンタル同期ではなくスナップショット同期を実行します。または、
      • 重複する行を削除する下流のトランスフォームを使用します。
  • 選択したインクリメンタル列のデータ型がタイムスタンプで、ミリ秒未満の精度を使用している場合、重複する行が再同期されます。これは、現在のインクリメンタル JDBC 同期ではタイムスタンプ値をミリ秒精度までしかシリアライズせず、インクリメンタル値が常にミリ秒単位で切り捨てられるためです。そのため、マイクロ秒精度またはナノ秒精度の行は、現在の(切り捨てられた)インクリメンタル値との比較結果が常に「正」になるため、常に再同期されます。
  • 上記の理由で重複する行がある場合は、インクリメンタル列を LONG または STRING(ISO-8601 形式)にキャストする必要があります。

インクリメンタル同期での NullPointerException の発生

インクリメンタル同期で NullPointerException がスローされる場合、SQL クエリが、インクリメンタル列に null 値が含まれる行をデータベースから取得している可能性があります。

  • たとえば、クエリ SELECT * FROM table WHERE col > ? OR timestamp > 1 を考えます。ここで、col は同期に使用されるインクリメンタル列です。OR を使用しているため、このクエリでは col に null 以外の値のみが含まれることは保証されません。いずれかの行で col の null 値が同期されると、Data Connection が同期のインクリメンタル状態を更新しようとした際に、現在の状態が同期された null 値と比較されてエラーがスローされるため、同期に失敗します。
  • このような状況を解消するには、別のインクリメンタル列を選択するか、現在のインクリメンタル列で null 値が同期されないようにしてください。上記のクエリでは、SELECT * FROM table WHERE (col > ? OR timestamp > 1) AND col IS NOT NULL のように書き換えることでエラーを回避できます。

同期に使用するインクリメンタル列を変更する場合は、新しい同期を作成することを推奨します。

断続的な同期の失敗または停止

Agent のリソースが不足していないか確認する

Agent ホストの <bootvisor-directory>/var/data/processes ディレクトリで ls -lrt を実行し、最も新しく作成された bootstrapper~<uuid> ディレクトリを探します。

  • cd でそのディレクトリに移動し、/var/log/ に移動します。
  • magritte-agent-output.log の内容を確認します。

OutOfMemory Exception エラーが表示される場合、Agent が割り当てられたワークロードを処理できないことを意味します。

  • これを解決するには、「Agent ヒープサイズ」パラメーターを増やす必要がある場合があります。この変更は Agent の概要ページで行えます。ただし、変更する前に、Agent のトラブルシューティングリファレンスガイドのヒープサイズの調整の手順を読むことを推奨します。
  • Agent のヒープサイズを増やせない場合は、「最大同時同期数」パラメーターを減らす必要がある場合があります。この変更も Agent の概要ページで行えます。

同期の停止

同期が停止する一般的な原因と、それぞれの対処方法を以下に示します。

すべての同期:取得段階での停止

同期が取得段階で停止している場合は、ソースが利用可能であり、正常に動作しているかを確認します。

  • ソースが利用可能かどうかを確認するには、Agent やほかの Foundry 製品を使わずに、ソースへの接続と操作を試します。正常に接続でき、クエリが期待どおりに実行される場合は、Palantir の担当者に連絡して支援を依頼してください。
  • ソースに接続できない場合や、ソースに送信したクエリへのレスポンスが遅い場合は、ソースで通常より多くのトラフィックが発生しているか、ソースが停止している可能性が高いです。負荷の高いソースの影響を軽減するために、以下を推奨します。
    • 同期をより小さな同期に分割します。
    • インクリメンタル(差分)同期を使用します(適用可能な場合)。
    • ソースの負荷が高くないとわかっている時間帯に同期をスケジュールします。

JDBC 同期:取得段階での停止

同期の取得段階が完了するまでに予想より時間がかかっている場合、Agent が大量のネットワーク呼び出しとデータベース呼び出しを行っていることが原因かもしれません。同期中に行われるネットワーク呼び出しとデータベース呼び出しの回数を調整するには、フェッチサイズパラメーターを変更できます。

  • フェッチサイズパラメーターはソース設定の「詳細オプション」セクションにあり、特定のクエリについて、データベースとの1回の往復で取得する行数を定義します。そのため、以下のようになります。
    • フェッチサイズパラメーターを減らすと、データベースへの1回の呼び出しで返される行数が減り、必要な呼び出し回数が増えます。ただし、Agent のヒープに同時に格納される行数が減るため、Agent が使用するメモリーは少なくなります。
    • フェッチサイズパラメーターを増やすと、データベースへの1回の呼び出しで返される行数が増え、必要な呼び出し回数が減ります。ただし、Agent のヒープに同時に格納される行数が増えるため、Agent が使用するメモリーは多くなります。
    • フェッチサイズを500に設定して開始し、状況に応じて調整することを推奨します。

JDBC 同期:アップロード段階での停止

同期でファイルのアップロードに時間がかかっている場合や、アップロード段階で失敗する場合は、ネットワークリンクに過剰な負荷がかかっている可能性があります。この場合、最大ファイルサイズパラメーターの調整を推奨します。

  • 最大ファイルサイズパラメーターはソース設定の「詳細オプション」セクションにあり、Foundry にアップロードする出力ファイルの最大サイズ(バイト数または行数)を定義します。そのため、以下のようになります。
    • 最大ファイルサイズパラメーターを減らすと、小さなファイルがより頻繁にアップロードされるため、ネットワークへの負荷が増える可能性があります。ファイルのアップロードに失敗した場合、再アップロードのコストは小さくなります。
    • 最大ファイルサイズパラメーターを増やすと、必要な帯域幅の合計は少なくなりますが、アップロードに失敗する可能性が高くなります。
    • 最大ファイルサイズを120mbに設定することを推奨します。

FTP / SFTP / ディレクトリ / 同期:取得段階での停止

ファイルベースの同期が取得段階で停止する最も一般的な原因は、Agent が大規模なファイルシステムをクロールしていることです。

ファイルシステムをクロールする同期では、別途設定しない限り、ファイルシステム全体を2回クロールします。これは、書き込み中のファイルや、何らかの変更が加えられているファイルを同期でアップロードしないようにするためです。

  • クロールに時間がかからないよう、ソース設定ページでクロール対象のサブフォルダーを必ず指定してください。
    • 注:正規表現フィルターは、ソースのルートディレクトリからの相対ファイルパスに対して実行されます。
  • サブフォルダーが指定されていない場合、同期はソースのルートをクロールします。

大規模なファイルベースの同期は一時的な障害の影響を受けやすい

ファイルベースの同期はトランザクションとして処理されます。同期の途中で失敗すると、トランザクションは中止され、その実行で処理されたファイルはどれもデータセットにコミットされません。たとえば、100万個のファイルをアップロードするように同期が設定されており、最後の1個を除くすべてのファイルをアップロードした後にネットワークエラーが発生すると、トランザクション全体が中止されます。アップロード済みのファイルはどれもコミットされず、データセットのビューは変更されません。

このようなトランザクション動作のため、1回の実行で大量のファイルを処理する同期は、一時的なネットワークの問題やソースシステムの問題の影響を受けやすくなります。同期の失敗による影響を軽減するには、以下の方法を使用します。

  • SNAPSHOT 同期の代わりにインクリメンタル APPEND 同期を使用します。
  • ファイル数の制限フィルターを適用し、実行ごとに処理するファイルのバッチを小さくします。

こうすることで、失敗した場合でも、すべてのファイルではなく現在のバッチのみを再同期すれば済みます。

詳しくは、同期失敗時の動作とファイルベースの同期を最適化するを参照してください。

同期が REQUEST_ENTITY_TOO_LARGE エラーで失敗する場合

大きなファイルのダウンロード、処理、アップロードは、エラーが発生しやすく、時間がかかります。個々のファイルが Agent のアップロード先に設定された最大サイズを超えると、REQUEST_ENTITY_TOO_LARGE サービス例外が発生します。data-proxy アップロード方式では、デフォルトで100 GBに設定されています。

制限のオーバーライドは推奨しません。可能であれば、このデータを小さなファイルに分割してアクセスする方法を探してください。ただし、一時的な回避策としてこの制限をオーバーライドする場合は、以下の手順を使用します。

  1. Data Connection で Agent に移動し、詳細設定の設定タブを選択します。

  2. 「Agent」タブを選択します。

  3. destinations ブロックに以下を追加して、制限を150 Gbに増やします。

    Copied!
    1 2 3 uploadStrategy: type: data-proxy maximumUploadedFileSizeBytes: 161061273600

同期が失敗するようになった

同期が BadPaddingException エラーで失敗する場合

BadPaddingException 例外は、Agent 内に保存されているソースの資格情報の暗号化キーが、期待されるものと異なるために発生します。これは通常、Agent マネージャーを手動でアップグレードした際に、古い /var/data ディレクトリを新しいインストール場所にコピーしなかった場合に発生します。

最も簡単な解決方法は、影響を受ける Agent を使用しているソースごとに資格情報を再入力することです。

予期しないデータが同期された

JDBC 同期のタイムスタンプ列が Foundry で Long 列として表示される場合

JDBC ソースから同期される行にタイムスタンプ列が含まれている場合、そのタイムスタンプ列は Foundry で Long 列にキャストされます。この動作は下位互換性を維持するためのものです。

これらの列のデータ型を修正するには、Python トランスフォーム環境を使用して、このクレンジングを行うことを推奨します。以下は、列 "mytimestamp" をタイムスタンプ形式に戻すコードスニペットの例です。

Copied!
1 df = df.withColumn("mytimestamp", (F.col("mytimestamp") / 1000).cast("timestamp"))