【问题标题】:Error submitting a cloud dataflow job提交云数据流作业时出错
【发布时间】:2015-03-09 09:57:44
【问题描述】:

从几天前开始,我无法再提交我的数据流作业,它们失败并出现以下错误。

我尝试提交简单的 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) 在 sn-p.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” }

【问题讨论】:

    标签: google-cloud-dataflow


    【解决方案1】:

    要调试此问题,我们要验证发出的请求是否有效,并找到 JSON 有效负载的无效部分。为此,我们将:

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

    增加日志记录的详细程度

    通过在构建管道之前将以下行添加到您的 main 中,您将告诉 Java 记录器实现增加“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 ...
    }
    

    重新运行应用程序并捕获日志

    您需要重新运行 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/,因为它很简单。如果可以,请通过更新问题分享您的发现,或者如果您遇到困难,请随时给我发私信。

    【讨论】:

    • 感谢 Lukasz,我在检查 json 输出时发现它非常大(大约 1MB)。我可以通过在第一次使用 SerializableFunction 的一些类成员时延迟初始化它们来减小大小,而不是在函数的构造函数中这样做。当未压缩的大小在 100k 左右时,我能够提交作业。
    • 很高兴知道您发现了问题并能够找到解决方案。我们将进一步调查当您尝试序列化大型 DoFn/SerializableFunction 时会发生什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多