【问题标题】:Hadoop distcp copy from on prem to gcp strange behaviorHadoop distcp 从本地复制到 gcp 奇怪的行为
【发布时间】:2021-02-05 05:26:09
【问题描述】:

当我使用 distcp 命令时

hadoop distcp /a/b/c/d  gs:/gcp-bucket/a/b/c/ , where d is a folder on HDFS containing subfolders.

如果文件夹 c 已经在 gcp 上,那么它将 d(及其子文件夹)从 HDFS 复制到 c 内的 gcp 但如果 c 文件夹不在 gcp 上,则它在 gcp 上创建 c 文件夹并复制 d 的子文件夹(但不是d it self ) 在 gcp 的 c 文件夹内。

因此,如果 e 是 HDFS 上 d 中的子文件夹并且文件夹 c 存在于 gcp 上,则输出以下命令:

hadoop distcp /a/b/c/d  gs:/gcp-bucket/a/b/c/ 

将会

gs://a/b/c/d

如果 e 是 HDFS 上 d 中的子文件夹,并且文件夹 c 在 gcp 上不存在,则以下命令的输出

hadoop distcp /a/b/c/d  gs:/gcp-bucket/a/b/c/ 

将是
gs://a/b/c/e

为什么第二个命令的输出和第一个命令的输出不一样?两个命令都是一样的。

【问题讨论】:

    标签: hadoop google-cloud-platform hdfs gsutil distcp


    【解决方案1】:

    Cloud Storage 上没有子目录。取而代之的是一个平面命名空间,所有对象都在其中托管。

    人们看到的分层视图是由于gsutil 工具使命名按照用户期望的方式工作。因此,当将文件名 your-file 复制到目标 gs://[BUCKET]/path/to/target/ 时,云存储服务会将其解释为名为 gs://[BUCKET]/path/to/target/your-file 的文件。

    在您的情况下,当“文件夹 c”不存在并且您尝试在此“子目录”下复制时,第一次运行此命令时,将创建以下对象:

    gs://a/b/c/e
    

    如果“文件夹c”存在,则“文件夹d”及其所有内容(包括d本身)将被复制到subdirectory c

    你的观察:

    如果文件夹 c 已经在 gcp 上,那么它会复制 d ( 及其 子文件夹)从 HDFS 到 c 内的 gcp 但如果 c 文件夹不存在 gcp 然后它在 gcp 上创建 c 文件夹并复制 d 的子文件夹(但是 不是 d it self ) 在 gcp 的 c 文件夹内。

    完全正确,这种行为是意料之中的。

    您可以在Cloud Storage documentation 中找到有关应用规则以及子目录如何工作的更多详细信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 2017-07-10
      • 2011-05-23
      • 2020-08-23
      相关资源
      最近更新 更多