2012-12-28 5 views
1

Я разрабатываю код для чтения данных и записываю его в HDFS с использованием mapreduce. Однако, когда у меня есть несколько файлов, я не понимаю, как они обрабатываются. Входной путь к картографу является имя каталога, как видно из выводаКак MapReduce читает из нескольких входных файлов?

String filename = conf1.get("map.input.file"); 

Так как же он обрабатывает файлы в каталоге?

ответ

8

Для того, чтобы получить путь входного файла вы можете использовать context объект, например:

FileSplit fileSplit = (FileSplit) context.getInputSplit(); 
String inputFilePath = fileSplit.getPath().toString(); 

И, как за то, как он несколько файлов обрабатываются:

Несколько экземпляров картографа функции создаются на разных машинах в кластере. Каждый экземпляр получает другой входной файл. Если файлы больше, чем размер блока dfs по умолчанию (128 МБ), тогда файлы далее разделяются на более мелкие части и затем распределяются между собой.

Таким образом, вы можете настроить размер входа, принимаемый каждым картографом следующих 2 способов:

  • изменить размер блока HDFS (например dfs.block.size=1048576)
  • установить paramaeter mapred.min.split.size (это может быть установлено только больше, чем размер блока HDFS)

Примечание: Эти параметры будут действовать только если ваш входной формат поддерживает разделив входные файлы. Общие кодеки сжатия (такие как gzip) не поддерживают разделение файлов, поэтому они будут игнорироваться.

+2

Также следует упомянуть, что когда мы имеем дело с файлами gz, никакая конфигурация не будет работать, и каждый файл перейдет к одному картографу и не будет разделен. –

+0

Спасибо, Шилл, обновил ответ. – Amar

+0

@Amar: Спасибо за подробное объяснение. Тем не менее, я использую настраиваемый формат, и я сделал свой «isSplitable()» false для чтения целого файла в один файл. Итак, чтобы получить имя файла, я попытался использовать объект FileStatus. – RadAl

0

В ответ на ответ @Amar я использовал объект FileStatus в следующем коде, так как мой индивидуальный формат inoput не разбил бы входной файл.

FileSystem fs = file.getFileSystem(conf); 
       FileStatus status= fs.getFileStatus(file); 
       String fileName=status.getPath().toString(); 
Смежные вопросы