2016-07-08 2 views
0

У меня есть вход, который состоит из многих файлов. Их размер больше, чем blockSize. Каждый файл после обработки вызывает по крайней мере один InputSplit для его обработки.Hadoop: можно ли поместить несколько файлов в один раскол?

Вопрос: возможно ли обрабатывать много файлов в одном разрезе?

Основываясь на FileInputFormat коде нет:

for (FileStatus file: files) { 
337  Path path = file.getPath(); 
338  long length = file.getLen(); 
339  if (length != 0) { 
340  BlockLocation[] blkLocations; 
341  if (file instanceof LocatedFileStatus) { 
342   blkLocations = ((LocatedFileStatus) file).getBlockLocations(); 
343  } else { 
344   FileSystem fs = path.getFileSystem(job.getConfiguration()); 
345   blkLocations = fs.getFileBlockLocations(file, 0, length); 
346  } 
347  if (isSplitable(job, path)) { 
348   long blockSize = file.getBlockSize(); 
349   long splitSize = computeSplitSize(blockSize, minSize, maxSize); 
350 
351   long bytesRemaining = length; 
352   while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) { 
353   int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining); 
354   splits.add(makeSplit(path, length-bytesRemaining, splitSize, 
355          blkLocations[blkIndex].getHosts())); 
356   bytesRemaining -= splitSize; 
357   } 

Так что, возможно, мы должны использовать другой InputFormat или создать нашу собственную. Любые решения?

ответ

2

Обработка нескольких больших файлов в одном разрезе не имеет смысла в Hadoop, где цель одновременно вычисляет данные разными расколами, а затем обрабатывает их последовательно, используя один и тот же контейнер. Но если вы все же хотите обрабатывать большие файлы в одном расколе, вы можете использовать CombineTextInputFormat и установить достаточно большое значение в mapreduce.input.fileinputformat.split.maxsize. Обычным использованием CombineTextInputFormat является обработка нескольких небольших файлов одним и тем же контейнером. Вот пример использования: https://github.com/lalosam/HadoopInExamples/blob/master/src/main/java/rojosam/hadoop/CombinedInputWordCount/DriverCIPWC.java

+0

RojoSam, спасибо большое! То, что я искал. Я не могу обрабатывать файлы параллельно, поскольку их число значительно больше, чем количество узлов. – MiamiBeach

+0

Это не имеет значения. Если вам требуется больше контейнеров, чем доступных слотов, Hadoop должен организовать его. Это то, что делает хаос. В конце он будет последовательным, но если в будущем вы сможете добавить больше узлов, то hasoop будет использовать его в автоматическом режиме. – RojoSam

+0

Администратор ресурсов hadoop (YARN) будет создавать экземпляры контейнеров и выполнять задачу map/reduce (или другого типа), как только будет доступно достаточно ресурсов. Сохранение оставшихся задач в очереди. – RojoSam

Смежные вопросы