在distcp

时间:2016-04-06 09:18:57

标签: hadoop amazon-s3 distcp

我在hdfs的文件夹中有许多文件,其名称在hdfs中的格式为filename.yyyy-mm-dd-hh.machinename.gz。我需要将它们转移到s3但是我想将它们放在yyyy / mm / dd / hh / filename.yyyy-mm-dd-hh.machinename.gz(这将是对象名称,因为s3具有扁平结构)下我指定的桶。 distcp命令可以将文件从hdfs传输到s3,但有没有选项可以执行上述操作?如果不是,我如何扩展distcp来执行此操作?

2 个答案:

答案 0 :(得分:1)

请注意:这不是一个解决方案,只是一个提示。

我不知道确切的答案,也没有S3实例来实际尝试。但这里有AWK方式预处理文件名并在特定目录结构中复制文件。下面的命令是考虑本地Linux文件系统编写的:

初始目录内容:

user@machine:~/path/to/input$ find
 ./filename.yyyy-mm-dd-hh.machinename.gz
 ./filename.2016-12-10-08.machinename.gz
 ./filename.2015-12-10-08.machinename.gz
 ./filename.2015-10-10-08.machinename.gz
 ./filename.2015-10-11-08.machinename.gz

在特定目录结构中复制文件的命令:

user@machine:~/path/to/input$ ls | awk -F"." '{print $1" "$2" "$3" "$4}' | awk -F"-" '{print $1" "$2" "$3" "$4" "$5" "$6" "$7}' | awk -F" " '{PATH=$2"/"$3"/"$4"/"$5; FNAME=$1"."$2"-"$3"-"$4"-"$5"."$6"."$7; system("mkdir -p "PATH); system("cp "FNAME" "PATH); }'

命令执行后的最终目录内容:

 ./filename.yyyy-mm-dd-hh.machinename.gz
 ./yyyy
 ./yyyy/mm
 ./yyyy/mm/dd
 ./yyyy/mm/dd/hh
 ./yyyy/mm/dd/hh/filename.yyyy-mm-dd-hh.machinename.gz

 ./filename.2016-12-10-08.machinename.gz
 ./2016
 ./2016/12
 ./2016/12/10
 ./2016/12/10/08
 ./2016/12/10/08/filename.2016-12-10-08.machinename.gz

 ./filename.2015-12-10-08.machinename.gz
 ./2015
 ./2015/12
 ./2015/12/10
 ./2015/12/10/08
 ./2015/12/10/08/filename.2015-12-10-08.machinename.gz

 ./filename.2015-10-11-08.machinename.gz
 ./2015/10
 ./2015/10/11
 ./2015/10/11/08
 ./2015/10/11/08/filename.2015-10-11-08.machinename.gz

 ./filename.2015-10-10-08.machinename.gz
 ./2015/10/10
 ./2015/10/10/08
 ./2015/10/10/08/filename.2015-10-10-08.machinename.gz

答案 1 :(得分:0)

您只需要以您想要的格式提及目的地路径。

hadoop distcp filename.yyyy-mm-dd-hh.machinename.gz s3n://<bucket-name>/yyyy/mm/dd/hh/filename.yyyy-mm-dd-hh.machinename.gz