使用 S3DistCp 从 HDFS 传输到 S3 时删除目录级别

Remove directory level when transferring from HDFS to S3 using S3DistCp

我有一个 Pig 脚本(使用稍微修改过的 MultiStorage)来转换一些数据。脚本运行后,我在 HDFS 上有以下格式的数据:

/tmp/data/identifier1/indentifier1-0,0001  
/tmp/data/identifier1/indentifier1-0,0002  
/tmp/data/identifier2/indentifier2-0,0001  
/tmp/data/identifier3/indentifier3-0,0001

我正在尝试使用 S3DistCp 将这些文件复制到 S3。我正在使用 --groupBy .*(identifier[0-9]).* 选项根据标识符合并文件。该组合有效,但在复制到 S3 时,文件夹也会被复制。最终输出为:

/s3bucket/identifier1/identifier1
/s3bucket/identifier2/identifier2
/s3bucket/identifier3/identifier3

有没有办法在没有第一个文件夹的情况下复制这些文件?理想情况下,我在 S3 中的输出如下所示:

/s3bucket/identifier1
/s3bucket/identifier2
/s3bucket/identifier3

我考虑过的另一个解决方案是在复制到 S3 之前使用 HDFS 命令将这些文件从它们的目录中拉出。这是一个合理的解决方案吗?

谢谢!

我找到的解决方案是在使用 s3distcp:

之前使用 distcp 将这些文件从目录中取出
hadoop distcp -update /tmp/data/** /tmp/grouped

然后,我更改了 s3distcp 脚本以将数据从 /tmp/grouped 移动到我的 S3 存储桶中。

s3distcp之前使用distcp真的很贵。另一种选择是创建一个包含所有文件的清单文件,并将其路径提供给 s3distcp。在此清单中,您可以定义每个文件的 "base name"。如果您需要一个清单文件的示例,只需 运行 s3distcp 在任何带有参数 --outputManifest 的文件夹上。 可以找到更多信息 here