1

我在 HDFS 中有以下 2 个文件和 1 个目录。

-rw-r--r-- 1 hadoop hadoop 11194859 2017-05-05 19:53 hdfs:///outputfiles/abc_output.txt
drwxr-xr-x - hadoop hadoop 0 2017-05-05 19:28 hdfs: ///outputfiles/sample_directory
-rw-r--r-- 1 hadoop hadoop 68507436 2017-05-05 19:55 hdfs:///outputfiles/sample_output.txt

我想通过单个命令将 gzip 格式的 abc_output.txt 和 sample_directory 从 HDFS 复制到 S3 上。我不希望在 S3 上合并文件。

我的 S3 存储桶应包含以下内容:abc_output.txt.gzip sample_directory.gzip

我尝试了以下方法:

s3-dist-cp --s3Endpoint=s3.amazonaws.com --src=hdfs:///outputfiles/ --dest=s3://bucket-name/outputfiles/ --outputCodec=gzip

但这会将所有文件和文件夹从源复制到目标。

通过在 EMR 上引用 在运行时推断 HDFS 路径,我还尝试了以下命令:

s3-dist-cp --s3Endpoint=s3.amazonaws.com --src=hdfs:///outputfiles/ --dest=s3://bucket-name/outputfiles/ --srcPattern=.*abc_output.txt。样本目录。--outputCodec=gzip 但这失败了。

4

1 回答 1

5

S3DistCp 支持两种关于如何压缩从源到目标的复制数据的选项。--srcPattern --groupBy http://docs.aws.amazon.com/emr/latest/ReleaseGuide/UsingEMR_s3distcp.html

该文档在可以做什么方面是不言而喻的。其余的..无法完成。

使用 srcPattern ,您可以编写与源文件匹配的 RegEx。s3distcp 会简单地将那些匹配的文件单独复制到目标中。

例如:--srcPattern='.*(txt|sample_folder).*'将复制所有具有txt扩展名的文件&它将在目标中创建匹配的目录,以将具有名称的源文件夹中的文件复制sample_folder到目标

http://regexr.com/3ftn0 (您可以根据您的要求设计正则表达式。)

如果您应用--outputCodec=gzip 除 之外的选项,--srcPattern则将相应地压缩单个匹配的文件。它们不会作为一个整体被拉上拉链。如果您需要将所有匹配的文件 gzip 压缩到一个文件中(不连接其内容),那么您将分别在输出上运行 s3-dist-cp 和压缩命令。

如果要将文件 abc_output.txt 和 sample_directory 中的所有文件连接成一个文件并以 gzip 格式压缩,则需要使用 --groupBy。对于使用 groupby ,匹配的正则表达式模式应该是相似的,你需要在你的正则表达式中有一个括号来指示文件应该如何分组,所有与括号语句匹配的项目都被组合到一个输出文件中。

例如 :

--groupBy='.*(file|noname).*[0-9].*' --outputCodec=gz 

http://regexr.com/3ftn9 上将连接所有匹配的文件内容并创建一个 .gz 文件

于 2017-05-08T19:20:49.177 回答