2013-03-18 4 views
0

Я много файлов в HDFS и хочу скопировать их в файлы последовательности с помощью задания MR. Ключевым типом файла seq является TEXT (я использую SHA1), а тип значения - BytesWritable (содержимое файла). Я нахожу пример кода, который читает все содержимое файла в байтовый массив, скажем, буфер, а затем задает буфер для объекта ByteWritable. Пример:Запись двоичных данных из файлов HDFS в SequenceFile

byte[] buffer = new byte[(int)file.length()]; 
FileInputStream fis = new FileInputStream(fileEntry); 
int length = fis.read(buffer); 
fis.close(); 
key.set(sha1); 
value.set(buffer, 0, buffer.length); 
writer.append(key, value); 

Мой вопрос: если мой входной файл очень большой, размер буфера превышает предел памяти. Можно ли добавить объект ByteWritable к циклу, который записывает меньшее количество данных на каждой итерации? Или я могу просто назначить входной поток объекту BytesWritable и позволить ему справиться с этой проблемой?

Спасибо.

+0

Мой пример кода читает файл из локальной файловой системы. Я хочу читать из HDFS. – avhacker

+0

Я хочу сделать это в работе MR. Благодарю. – avhacker

ответ

-1

Вы можете просто использовать HDFS эквивалент команды Linux cat:

hadoop fs -cat '/path/to/files/*.' > oneBigSequenceFile.csv

будет конкатенировать все файлы в один файл последовательности.