提交云数据流作业时出错

时间:2015-03-09 09:57:44

标签: google-cloud-dataflow

几天前,我无法再提交我的数据流作业,它们会因以下错误而失败。

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

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

谢谢, ģ

Exception in thread "main" java.lang.RuntimeException: Failed to create a workflow job: Invalid JSON payload received. Unknown token.
       { 8r W
^
    at com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.run(DataflowPipelineRunner.java:219)
    at com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run(BlockingDataflowPipelineRunner.java:96)
    at com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run(BlockingDataflowPipelineRunner.java:47)
    at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:145)
    at snippet.WordCount.main(WordCount.java:165)
Caused by: 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"
}

1 个答案:

答案 0 :(得分:1)

要调试此问题,我们要验证正在进行的请求是否有效,并找到JSON有效内容的无效部分。为此,我们将:

  1. 增加记录详细程度
  2. 重新运行应用程序并捕获日志
  3. 在代表JSON有效负载的日志中查找相关部分
  4. 验证JSON有效负载
  5. 增加日志记录详细程度

    在构建管道之前,通过向main添加以下行,您将告诉Java logger实现增加“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/。如果您有能力,请通过更新问题分享您的发现,或者如果您遇到困难,请随时给我发私信。