Google cloud dataflow 提交云数据流作业时出错

Google cloud dataflow 提交云数据流作业时出错,google-cloud-dataflow,Google Cloud Dataflow,因为几天前,我无法再提交我的数据流作业,它们失败了,错误如下 我试图提交简单的WordCount作业,但成功了。即使我自己的工作非常简单,一切都很好。但当我添加更多代码(添加GroupByKey转换)时,我就无法再提交它了 有人知道这个错误是什么意思吗 谢谢, G 线程“main”java.lang.RuntimeException中出现异常:未能创建工作流作业:接收到无效的JSON负载。未知标记。 {8r W ^ 位于com.google.cloud.dataflow.sdk.runners.

因为几天前,我无法再提交我的数据流作业,它们失败了,错误如下

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

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

谢谢, G

线程“main”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) 位于snippet.WordCount.main(WordCount.java:165) 原因:com.google.api.client.googleapis.json.GoogleJsonResponseException:400错误请求 { “代码”:400, “错误”:[{ “域”:“全局”, “消息”:“接收到无效的JSON负载。未知令牌。\n\u001F\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t{8r\u0000 W\n^”, “原因”:“坏请求” } ], “消息”:“接收到无效的JSON负载。未知令牌。\n\u001F\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t{8r\u0000 W\n^”, “状态”:“无效的_参数” }
要调试此问题,我们需要验证正在发出的请求是否有效,并找到JSON负载的无效部分。为此,我们将:

  • 增加日志详细性
  • 重新运行应用程序并捕获日志
  • 在代表JSON负载的日志中找到相关部分
  • 验证JSON负载
  • 增加日志详细性

    在构建管道之前,通过在main中添加以下行,您将告诉Java logger实现增加“com.google.api”包的详细程度。这反过来将记录对google api的HTTP请求/响应

    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 ...
    }
    
    重新运行应用程序并捕获日志

    您需要重新运行数据流应用程序并捕获日志。这取决于您的开发环境、您使用的操作系统和/或IDE。例如,使用Eclipse时,日志将显示在控制台窗口中。保存这些日志将帮助您维护问题的记录

    在代表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验证器可以使用,但我更喜欢使用,因为它很简单。如果您能够,请通过更新问题或如果您遇到问题,随时向我发送私人消息来分享您的发现。

    感谢Lukasz,我在检查JSON输出时发现它非常大(大约1MB)。我可以在首次使用
    SerializableFunction
    时,通过惰性地初始化它们的某些类成员来减小大小,而不是在函数的构造函数中进行初始化。当未压缩的大小约为100k时,我能够提交作业。很高兴知道您发现了问题并找到了解决方案。我们将调查进一步了解尝试序列化大型DoFn/SerializableFunction时会发生什么。
    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 ...