我在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来执行此操作?
答案 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