2016-04-06 6 views
0

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をどのように拡張できますか?distcpの宛先ファイル名/場所を変更してください

答えて

1

注:これは解決策ではなく、単なるヒントです。

正確な答えがわかりませんし、実際に試してみるためにS3インスタンスを持っていません。しかし、ここでAWKのファイル名の事前処理と特定のディレクトリ構造内のファイルのコピー方法があります。

初期ディレクトリの内容:特定のディレクトリ構造内のファイルをコピーするための

[email protected]:~/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 

コマンド:コマンド実行後

[email protected]:~/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); }' 

最終的なディレクトリの内容:以下のコマンドは、ローカルのLinuxファイルシステムを検討書かれています

./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 
0

あなたはちょうどmentioする必要がありますn目的の形式で目的のパスを指定します。

hadoop distcp filename.yyyy-mm-dd-hh.machinename.gz s3n://<bucket-name>/yyyy/mm/dd/hh/filename.yyyy-mm-dd-hh.machinename.gz 
関連する問題