【问题标题】:Google cloud storage gsutil tool with Java谷歌云存储 gsutil 工具与 Java
【发布时间】:2014-09-13 09:23:45
【问题描述】:

如果我们每天需要将大约 30G 文件(从 50MB 到 4GB)上传到 Google Cloud Storage,根据 google 文档,gsutil 可能是唯一合适的选择,不是吗?

我想通过 Java 调用 gsutil 命令,现在下面的代码可以工作了。但是如果我删除那个while循环,程序将在runtime.exec(command)之后立即停止,但是python进程已经启动但没有上传,它很快就会被杀死。我想知道为什么。

我从 sterr 流中阅读的原因是受到 Pipe gsutil output to file 的启发

我通过 read util 其状态输出的最后一行来决定 gsutil 是否完成执行,但这是一种可靠的方法吗?有没有更好的方法来检测 gsutil 执行是否在 Java 中结束?

String command="python c:/gsutil/gsutil.py cp C:/SFC_Data/gps.txt"
            + " gs://getest/gps.txt";
 try {
        Process process = Runtime.getRuntime().exec(command);
        System.out.println("the output stream is "+process.getErrorStream());
        BufferedReader reader=new BufferedReader(new InputStreamReader(process.getErrorStream())); 
        String s; 
        while ((s = reader.readLine()) != null){
            System.out.println("The inout stream is " + s);
        }                
    } catch (IOException e) {
        e.printStackTrace();
    }

【问题讨论】:

    标签: google-cloud-storage


    【解决方案1】:

    每天将价值 30G 的数据上传到 GCS 的方法肯定不止一种。由于您使用 Java,您是否考虑过使用 Cloud Storage API Java 客户端库? https://developers.google.com/api-client-library/java/apis/storage/v1

    关于Java中使用Runtime.exec()调用gsutil的具体问题,我怀疑在没有while循环的情况下,创建子进程后程序会立即退出,导致“进程”变量为GC 'ed,这可能会杀死子进程。

    我认为您应该等待子流程完成,这实际上是 while 循环正在做的事情。或者,如果您不关心输出,您可以调用 waitFor() 并检查 existsValue() : http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html

    【讨论】:

    • 哈,我很困惑。早些时候我发现了这个:developers.google.com/appengine/docs/java/googlestorage,也称为 GCS Java API,其中文件 API 功能将被放弃。因此,我按照该页面最终找到了“GCS 客户端库”并获得了示例代码,它是一个 Web 应用程序。我试过了,上传一个 4GB 的文件大约需要 20 分钟,而 gsutil 需要 5 分钟。您发送的这个用于 Java 应用程序而不是 Web 应用程序。现在,这是我现在想要的。非常感谢。我一定会试一试的。
    • 但是,仍然不明白这两个 Java 的“客户端库”之间的本质区别是什么......
    • 而且,您是否发现任何关于此 API 的可恢复上传的内容?我只在我认为的网络应用程序使用的 RESTful API 周围找到了
    • 我提到的“Cloud Storage API Client Library(for Java)”是“Google APIs Client Library”的一部分,提供了访问GCS的完整功能。您可以将其视为与 GCS REST API 并行,但符合与其他 Google API 相同的标准。
    • 您之前的评论中提到的“Google Cloud Storage Java API”(文件 API)和“Google Cloud Storage Java Client Library”都特定于 AppEngine。前者是已弃用的 AppEngine SDK 的一部分。后者是一个单独的客户端库,需要与您的应用一起下载和部署,它基本上封装了 GCS REST API,并提供了更简单的接口和一些性能调优。
    【解决方案2】:

    我根据姚志宏的解释画了下面这张图。希望它可以帮助任何与我有相同问题的人。

    【讨论】:

      猜你喜欢
      • 2020-09-10
      • 2016-04-30
      • 2015-04-20
      • 2022-12-03
      • 2014-07-17
      • 1970-01-01
      • 2015-07-17
      • 2017-05-11
      • 2015-06-29
      相关资源
      最近更新 更多