Hadoop DistCp с использованием подстановочных знаков? - PullRequest
16 голосов
/ 19 апреля 2011

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

Ответы [ 2 ]

15 голосов
/ 06 января 2014

Я понимаю, что это старая тема.Но я был заинтересован в ответе на этот вопрос сам - и dk89 также спросил снова в 2013 году. Итак, мы идем:

distcp не поддерживает подстановочные знаки.Самое близкое, что вы можете сделать, это:

Найти файлы, которые вы хотите скопировать (источники), затем отфильтровать с помощью grep, отформатировать hdf с использованием 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 dir:

hadoop distcp -i -f input-files.txt hdfs://localhost:9000/path/to/target/  
2 голосов
/ 19 апреля 2011

DistCp на самом деле является обычным заданием сокращения карт: вы можете использовать тот же синтаксис глобализации, который вы использовали бы для ввода обычного задания уменьшения карт.Как правило, вы можете просто использовать foo/*.log, и этого должно быть достаточно.Вы можете поэкспериментировать с оператором hadoop fs -ls здесь - если глобализация работает с fs -ls, то если будет работать с DistCp (ну, почти, но различия довольно заметны, чтобы упомянуть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...