Объединить несколько файлов в один в hadoop

#hadoop #hadoop2

#hadoop #hadoop2

Вопрос:

Довольно глупый вопрос, но как мне объединить несколько файлов в папке в один файл, не копируя их на локальный компьютер?Меня не волнует порядок. Я думал, что hadoop fs -getmerge справится с этой задачей, но с тех пор я узнал, что он копирует данные на ваш локальный компьютер.

Я бы сделал это в своем оригинальном приложении spark, но добавление coalesce значительно увеличивает время выполнения. Я использую Hadoop 2.4, если это имеет значение.

Комментарии:

1. Какую выгоду даст объединение файлов?

2. @cricket_007 HDFS плохо обрабатывает небольшие файлы. Объединение небольших файлов с соответствующим размером блока определенно увеличивает скорость.

3. @waltersu Я в курсе проблемы с небольшим файлом. В вопросе не указаны размеры. И небольшие файлы не будут проблемой для объединения на локальный диск. Я просто говорю, что, подобно тому, как результаты операции приводят к одному выводу для каждого редуктора, весь каталог может быть прочитан как новый ввод для задания. Эти файлы не обязательно объединять

4. @cricket_007. Да, если это не маленькие файлы, объединение не принесет пользы.

5. @cricket_007 Мне нужно объединить файлы, чтобы вышестоящий пакетный процесс мог затем использовать это. Я не являюсь владельцем этого процесса, и от меня требуется вернуть один файл.

Ответ №1:

как мне объединить несколько файлов в папке в один файл, не копируя их на локальный компьютер?

Вам нужно либо скопировать файлы на локальный узел, либо на один из вычислительных узлов.

HDFS — это файловая система. Формат вашего файла не имеет значения. Если ваш файл является необработанным текстовым / двоичным файлом, вы можете попробовать API конкатенации, который управляет метаданными только в NameNode без копирования данных. Но если ваш файл — parquet / gzip / lzo или другой, эти файлы невозможно просто объединить, вы должны загрузить их из HDFS, объединить их в один и загрузить объединенный. coalesce(1) Spark делает то же самое, за исключением того, что это делается на узле исполнителя, а не на вашем локальном узле.

Если у вас много папок, в которых необходимо объединить файлы, spark / MR определенно является правильным выбором. Одной из причин является параллелизм. Другая причина в том, что если ваш файл, подобный gzip, не поддерживает разделение, один огромный файл gzip может замедлить вашу работу. С помощью некоторых математических вычислений вы можете объединить небольшие файлы в относительно большие файлы. (размер файла равен или немного меньше размера блока). Это очень просто с coalesce (n) API.


Я предлагаю вам объединить небольшие файлы. Но, как упоминал @cricket_007 в комментарии, слияние не всегда приносит пользу.