微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Hadoop distcp从prem复制到gcp奇怪的行为

当我使用distcp命令时

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

如果gcp上已经存在文件夹c,则它将d(及其子文件夹)从HDFS复制到c内的gcp,但如果gcp上不存在c文件夹,则它将在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的子文件夹,而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

您的观察结果

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

完全正确,这种行为是可以预期的。

您可能会在Cloud Storage documentation

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。