Hadoop DistCp с использованием подстановочных знаков?

Можно ли использовать DistCp для копирования только файлов, соответствующих определенному шаблону? Например. Для /foo я хочу только файлы *.log.

Ответы

Ответ 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 (ну, почти, но различия довольно тонкие, чтобы упомянуть).