Можно ли использовать DistCp для копирования только файлов, соответствующих определенному шаблону? Например. Для /foo я хочу только файлы *.log.
Hadoop DistCp с использованием подстановочных знаков?
Ответ 1
Я понимаю, что это старая нить. Но я сам был заинтересован в ответе на этот вопрос - и dk89 также снова спросил в 2013 году. Итак, мы идем:
distcp не поддерживает подстановочные знаки. Самое близкое, что вы можете сделать, это:
Найдите файлы, которые вы хотите скопировать (источники), затем фильтр, используя grep, формат для hdfs, используя awk, и выведите результат в список "входные файлы":
hadoop dfs -lsr hdfs://localhost:9000/path/to/source/dir/
| grep -e webapp.log.3. | awk '{print "hdfs\://localhost\:9000/" $8'} > input-files.txt
Поместите список входных файлов в hdfs
hadoop dfs -put input-files.txt .
Создать целевой каталог
hadoop dfs -mkdir hdfs://localhost:9000/path/to/target/
Запустите distcp, используя список входных файлов и указав целевой адрес hdfs:
hadoop distcp -i -f input-files.txt hdfs://localhost:9000/path/to/target/
Ответ 2
DistCp на самом деле является просто обычной работой по сокращению карты: вы можете использовать тот же синтаксис globbing, что и для ввода обычной работы по уменьшению количества карт. Как правило, вы можете просто использовать foo/*.log
, и этого достаточно. Вы можете поэкспериментировать с инструкцией hadoop fs -ls
здесь - если globbing работает с fs -ls
, тогда если будет работать с DistCp (ну, почти, но различия довольно тонкие, чтобы упомянуть).