Hadoop distcp从on-prem复制到gcp的奇怪行为



当我使用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本身(复制到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下复制

您的观察结果:

如果文件夹c已经在gcp上,那么它将复制d(及其子文件夹(从HDFS到c中的gcp,但如果c文件夹不在然后它在gcp上创建c文件夹,并复制d的子文件夹(但是而不是自己(。

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

您可以在云存储文档中找到有关应用的规则以及子目录如何工作的更多详细信息

最新更新