1

数日前から、データフロー ジョブを送信できなくなりました。以下のエラーで失敗します。

単純な WordCount ジョブを送信しようとしましたが、成功しました。私自身の仕事の非常に単純化されたバージョンでも、すべて問題ありません。しかし、さらにコードを追加すると (GroupByKey 変換を追加すると)、それを送信できなくなります。

このエラーの意味を知っている人はいますか?

ありがとう、G

スレッド「メイン」の例外 java.lang.RuntimeException: ワークフロー ジョブの作成に失敗しました: 無効な JSON ペイロードを受け取りました。不明なトークン。
       { 8r 西
^
    com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.run (DataflowPipelineRunner.java:219) で
    com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run (BlockingDataflowPipelineRunner.java:96) で
    com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run (BlockingDataflowPipelineRunner.java:47) で
    com.google.cloud.dataflow.sdk.Pipeline.run (Pipeline.java:145) で
    snippet.WordCount.main(WordCount.java:165) で
原因: com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
  「コード」:400、
  「エラー」: [ {
    「ドメイン」:「グローバル」、
    "message": "無効な JSON ペイロードを受信しました。不明なトークンです。\n\u001F \b\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \t{ 8r\u0000 W\n^",
    「理由」:「badRequest」
  } ]、
  "message": "無効な JSON ペイロードを受信しました。不明なトークンです。\n\u001F \b\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \t{ 8r\u0000 W\n^",
  「ステータス」:「INVALID_ARGUMENT」
}
4

1 に答える 1

1

この問題をデバッグするには、行われているリクエストが有効であることを検証し、JSON ペイロードの無効な部分を見つけたいと考えています。これを行うために、次のことを行います。

  1. ログの詳細度を上げる
  2. アプリケーションを再実行し、ログを取得します
  3. JSON ペイロードを表すログ内の関連セクションを見つけます
  4. JSON ペイロードを検証する

ロギングの詳細度を上げる

パイプラインを構築する前に次の行をメインに追加することで、Java ロガーの実装に「com.google.api」パッケージの冗長性を高めるように指示します。これにより、HTTP リクエスト/レスポンスが Google API に記録されます。

import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MyDataflowProgram {
  public static void main(String[] args) {
    ConsoleHandler consoleHandler = new ConsoleHandler();
    consoleHandler.setLevel(Level.ALL);
    Logger googleApiLogger = Logger.getLogger("com.google.api");
    googleApiLogger.setLevel(Level.ALL);
    googleApiLogger.setUseParentHandlers(false);
    googleApiLogger.addHandler(consoleHandler);
    ... Pipeline Construction ...
}

アプリケーションを再実行し、ログを取得します

Dataflow アプリケーションを再実行して、ログを取得する必要があります。これは、開発環境、使用する OS や IDE によって異なります。たとえば、Eclipse を使用している場合、ログはコンソール ウィンドウ内に表示されます。これらのログを保存すると、問題の記録を維持するのに役立ちます。

JSON ペイロードを表すログ内の関連セクションを見つけます

Dataflow ジョブの再実行中に、Dataflow ジョブの送信に関連するログを見つける必要があります。これらのログには、HTTP 要求とそれに続く応答が含まれ、次のようになります。

POST https://dataflow.googleapis.com/v1b3/projects/$GCP_PROJECT_NAME/jobs
Accept-Encoding: gzip
... Additional HTTP headers ...
... JSON request payload for creation ...
{"environment":{"clusterManagerApiService":"compute.googleapis.com","dataset":"bigquery.googleapis.com/cloud_dataflow","sdkPipelineOptions": ...

-------------- RESPONSE --------------
HTTP/1.1 200 OK
... Additional HTTP headers ...
... JSON response payload ...

取得しているエラーは、それが問題の原因であることを示しているため、リクエスト ペイロードに関心があります。

JSON ペイロードを検証する

使用できる JSON バリデーターは多数ありますが、私はその単純さからhttp://jsonlint.com/を使用することを好みます。可能であれば、質問を更新して調査結果を共有してください。行き詰まった場合は、お気軽にプライベート メッセージを送信してください。

于 2015-03-09T17:18:59.527 に答える