Hadoop distcp 从本地复制到 gcp 奇怪的行为

Hadoop distcp copy from on prem to gcp strange behavior

当我使用 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,但如果 gcp 上不存在 c 文件夹,则它会在 gcp 上创建 c 文件夹并复制 d 的子文件夹(但不是自己 ) 在 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中的子文件夹,gcp上不存在c文件夹,那么下面命令的输出

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

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

为什么第二个命令的输出与第一个命令的输出不一样?两个命令相同。

云存储上没有子目录。相反,有一个平面命名空间,其中托管所有对象。

人们看到的分层视图是由于 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

您的观察:

If folder c is already there on gcp then it copies d ( and its subfolders) from HDFS to gcp inside c but if c folder is not there on gcp then it creates c folder on gcp and copies subfolders of d (but not d it self ) inside of c folder of gcp.

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

您可能会在 Cloud Storage documentation

中找到有关所应用的规则以及子目录如何工作的更多详细信息