提交云数据流作业时出错
Error submitting a cloud dataflow job
几天前,我无法再提交我的数据流作业,它们因以下错误而失败。
我尝试提交简单的 WordCount 作业,但成功了。即使是我自己的工作的一个非常简化的版本,一切都很好。但是当我添加更多代码(添加 GroupByKey 转换)时,我无法再提交它。
有人知道这个错误是什么意思吗?
谢谢,
G
线程 "main" java.lang.RuntimeException 中的异常:无法创建工作流作业:收到无效的 JSON 负载。未知令牌。
{ 8r 瓦
^
在 com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.run(DataflowPipelineRunner.java:219)
在 com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run(阻塞DataflowPipelineRunner.java:96)
在 com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run(阻塞DataflowPipelineRunner.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
{
"code" : 400,
"errors":[{
"domain" : "global",
"message" : "Invalid JSON payload received. Unknown token.\n\u001F \b\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \t{ 8r\u0000 W\n^",
"reason" : "badRequest"
} ],
"message" : "Invalid JSON payload received. Unknown token.\n\u001F \b\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \t{ 8r\u0000 W\n^",
"status" : "INVALID_ARGUMENT"
}
为了调试此问题,我们要验证发出的请求是否有效并找到 JSON 有效负载的无效部分。为此,我们将:
- 增加日志记录的详细程度
- 重新运行应用程序并捕获日志
- 在日志中找到代表 JSON 有效载荷的相关部分
- 验证 JSON 有效载荷
增加日志记录的详细程度
通过在构建管道之前将以下几行添加到您的 main 中,您将告诉 Java 记录器实现增加 "com.google.api" 包的详细程度。这反过来会将 HTTP request/responses 记录到 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 应用程序并捕获日志。这取决于你的开发环境,你用的是什么OSand/orIDE。例如,当使用 Eclipse 时,日志将出现在控制台 window 中。保存这些日志将帮助您维护问题的记录。
在日志中找到代表 JSON 有效载荷的相关部分
在重新执行数据流作业期间,您需要查找与提交数据流作业相关的日志。这些日志将包含 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/,因为它很简单。如果可以,请通过更新问题来分享您的发现,或者如果您遇到困难,请随时给我发私信。
几天前,我无法再提交我的数据流作业,它们因以下错误而失败。
我尝试提交简单的 WordCount 作业,但成功了。即使是我自己的工作的一个非常简化的版本,一切都很好。但是当我添加更多代码(添加 GroupByKey 转换)时,我无法再提交它。
有人知道这个错误是什么意思吗?
谢谢, G
线程 "main" java.lang.RuntimeException 中的异常:无法创建工作流作业:收到无效的 JSON 负载。未知令牌。 { 8r 瓦 ^ 在 com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.run(DataflowPipelineRunner.java:219) 在 com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run(阻塞DataflowPipelineRunner.java:96) 在 com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run(阻塞DataflowPipelineRunner.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 { "code" : 400, "errors":[{ "domain" : "global", "message" : "Invalid JSON payload received. Unknown token.\n\u001F \b\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \t{ 8r\u0000 W\n^", "reason" : "badRequest" } ], "message" : "Invalid JSON payload received. Unknown token.\n\u001F \b\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \t{ 8r\u0000 W\n^", "status" : "INVALID_ARGUMENT" }
为了调试此问题,我们要验证发出的请求是否有效并找到 JSON 有效负载的无效部分。为此,我们将:
- 增加日志记录的详细程度
- 重新运行应用程序并捕获日志
- 在日志中找到代表 JSON 有效载荷的相关部分
- 验证 JSON 有效载荷
增加日志记录的详细程度
通过在构建管道之前将以下几行添加到您的 main 中,您将告诉 Java 记录器实现增加 "com.google.api" 包的详细程度。这反过来会将 HTTP request/responses 记录到 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 应用程序并捕获日志。这取决于你的开发环境,你用的是什么OSand/orIDE。例如,当使用 Eclipse 时,日志将出现在控制台 window 中。保存这些日志将帮助您维护问题的记录。
在日志中找到代表 JSON 有效载荷的相关部分
在重新执行数据流作业期间,您需要查找与提交数据流作业相关的日志。这些日志将包含 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/,因为它很简单。如果可以,请通过更新问题来分享您的发现,或者如果您遇到困难,请随时给我发私信。