Объединение нескольких файлов в один в Hadoop - PullRequest
30 голосов
/ 23 августа 2010

Я получаю несколько маленьких файлов в свой входной каталог, которые я хочу объединить в один файл без использования локальной файловой системы или записи mapred. Есть ли способ, которым я мог бы сделать это с помощью команд hadoof fs или Pig?

Спасибо!

Ответы [ 8 ]

22 голосов
/ 25 ноября 2014

Чтобы сохранить все в сетке, используйте потоковую передачу hadoop с одним редуктором и cat в качестве маппера и редуктора (в основном noop) - добавьте сжатие, используя флаги MR.

hadoop jar \
    $HADOOP_PREFIX/share/hadoop/tools/lib/hadoop-streaming.jar \<br>
    -Dmapred.reduce.tasks=1 \
    -Dmapred.job.queue.name=$QUEUE \
    -input "$INPUT" \
    -output "$OUTPUT" \
    -mapper cat \
    -reducer cat

Если вы хотите сжатиеadd
-Dmapred.output.compress = true \ -Dmapred.output.compression.codec = org.apache.hadoop.io.compress.GzipCodec

15 голосов
/ 24 августа 2010
hadoop fs -getmerge <dir_of_input_files> <mergedsinglefile>
7 голосов
/ 25 августа 2010

ладно ... Я нашел способ, используя hadoop fs команды -

hadoop fs -cat [dir]/* | hadoop fs -put - [destination file]

Это сработало, когда я проверил ... какие-нибудь подводные камни, о которых можно подумать?

Спасибо!

2 голосов
/ 26 апреля 2011

Если вы установили плавкий предохранитель для монтирования вашей HDFS в локальный каталог, то ваш вывод может быть смонтированной файловой системой.

Например, я установил нашу HDFS на /mnt/hdfs локально. Я запускаю следующую команду, и она прекрасно работает:

hadoop fs -getmerge /reports/some_output /mnt/hdfs/reports/some_output.txt

Конечно, есть и другие причины использовать fuse для монтирования HDFS в локальный каталог, но это был хороший побочный эффект для нас.

1 голос
/ 23 января 2017

Если вы работаете в кластере Hortonworks и хотите объединить несколько файлов, представленных в папке HDFS, в один файл, вы можете запустить jad 'hadoop-streaming-2.7.1.2.3.2.0-2950.jar', который запускает один редуктори получите объединенный файл в выходной каталог HDFS.

$ hadoop jar /usr/hdp/2.3.2.0-2950/hadoop-mapreduce/hadoop-streaming-2.7.1.2.3.2.0-2950.jar \

-Dmapred.reduce.tasks=1 \
-input "/hdfs/input/dir" \
-output "/hdfs/output/dir" \
-mapper cat \
-reducer cat

Вы можете загрузить эту банку с Получить банку потоковой передачи hadoop

Если вы пишете искровые задания и хотите получить объединенный файл, чтобы избежать нескольких созданий RDD иузкие места в производительности используют этот кусок кода перед преобразованием вашего RDD

sc.textFile("hdfs://...../part*).coalesce(1).saveAsTextFile("hdfs://...../filename)

Это объединит все файлы деталей в один и сохранит их снова в папку hdfs

1 голос
/ 04 октября 2010

Вы можете использовать инструмент HDFSConcat , новый в HDFS 0.21, для выполнения этой операции без затрат на копирование.

0 голосов
/ 26 января 2017

Обращаясь к этому с точки зрения Apache Pig,

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

 A = load 'tmp/file1' Using PigStorage('\t') as ....(schema1)
 B = load 'tmp/file2' Using PigStorage('\t') as ....(schema1) 
 C = UNION A,B
 store C into 'tmp/fileoutput' Using PigStorage('\t')
0 голосов
/ 27 июня 2011

Все решения эквивалентны выполнению

hadoop fs -cat [dir]/* > tmp_local_file  
hadoop fs -copyFromLocal tmp_local_file 

, это только означает, что локальный ввод-вывод m / c находится на критическом пути передачи данных.

...