Изменить имя файла / местоположение в distcp
У меня есть несколько файлов в папке в формате hdf, имена которых имеют формат filename.yyyy-mm-dd-hh.machinename.gz в формате hdf. Мне нужно перенести их в s3, но я хочу поместить их в yyyy/mm/dd/hh/filename.yyyy-mm-dd-hh.machinename.gz (это будет имя объекта, так как s3 имеет плоскую структуру) в ведро, которое я указываю. Команда distcp может передавать файлы из hdfs в s3, но есть ли возможность сделать выше? Если нет, то как я могу расширить distcp для этого?
2 ответа
Обратите внимание: это не решение, а просто подсказка.
Я не знаю точного ответа, а также у меня нет экземпляра 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
Вам нужно просто указать путь назначения в нужном вам формате.
hadoop distcp filename.yyyy-mm-dd-hh.machinename.gz s3n://<bucket-name>/yyyy/mm/dd/hh/filename.yyyy-mm-dd-hh.machinename.gz