1

从几天前开始,我不再能够提交我的数据流作业,它们因以下错误而失败。

我尝试提交简单的 WordCount 作业并成功。即使我自己的工作非常简化,一切都很好。但是当我添加更多代码(添加 GroupByKey 转换)时,我不再能够提交它。

有谁知道这个错误是什么意思?

谢谢,G

线程“主”java.lang.RuntimeException 中的异常:无法创建工作流作业:收到无效的 JSON 有效负载。未知令牌。
       { 8r W
^
    在 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)
    在片段.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^",
    “原因”:“错误请求”
  }],
  "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 有效负载

增加日志记录的详细程度

通过在构建管道之前将以下行添加到您的 main 中,您将告诉 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 应用程序并捕获日志。这取决于您的开发环境、您使用的操作系统和/或 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 回答