2016-04-06 14 views
0

Ich habe eine Reihe von Dateien in einem Ordner in hdfs mit ihren Namen ein Format Dateiname.JJJJ-MM-TT-hh.Maschinenname.gz in hdfs. Ich muss diese auf s3 übertragen, aber ich möchte sie auf yyyy/mm/dd/hh/Dateiname.yyyy-mm-dd-hh.machinename.gz setzen (dies wäre der Objektname, da s3 eine flache Struktur hat) unter der Bucket, den ich spezifiziere. Der Befehl distcp kann Dateien von hdfs zu s3 übertragen, aber gibt es eine Möglichkeit, das oben genannte zu tun? Wenn nicht, wie kann ich distcp erweitern, um dies durchzuführen?Ändern Sie den Ziel-Dateinamen/Speicherort in distcp

Antwort

1

Beachten Sie: Dies ist keine Lösung, sondern nur ein Hinweis.

Ich weiß nicht die genaue Antwort und auch keine S3-Instanz, um es tatsächlich zu versuchen. Aber hier ist AWK Art der Vorverarbeitung der Dateinamen und Kopieren von Dateien in einer bestimmten Verzeichnisstruktur. Der folgende Befehl geschrieben lokales Linux-Dateisystem unter Berücksichtigung

Anfangsverzeichnisinhalt:

[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 

Befehl für Dateien innerhalb einer bestimmten Verzeichnisstruktur zu kopieren:

[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); }' 

Schlussverzeichnisinhalt nach Ausführung des Befehls:

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

Sie müssen nur Mentio n den Zielpfad im gewünschten Format.

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