Изменить имя файла / местоположение в 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 
Другие вопросы по тегам