Чтение больших файлов с помощью mapreduce в Hadoop

У меня есть код, который читает файлы с FTP-сервера и записывает их в HDFS. Я реализовал настроенный InputFormatReader, который устанавливает свойство isSplitable ввода как false. Однако это дает мне следующую ошибку.

INFO mapred.MapTask: Record too large for in-memory buffer

Код, который я использую для чтения данных,

Path file = fileSplit.getPath();
                FileSystem fs = file.getFileSystem(conf);
                FSDataInputStream in = null;
                try {
                    in = fs.open(file);


                    IOUtils.readFully(in, contents, 0, contents.length);

                    value.set(contents, 0, contents.length);

                }

Любые идеи, как избежать java heap space error без разделения входного файла? Или, если я сделаю isSplitable true, как мне прочитать файл?


person RadAl    schedule 31.12.2012    source источник


Ответы (2)


Если я вас правильно понял - вы загружаете весь файл в память. Не имеет отношения к хаупу — вы не можете сделать это на Java и быть уверенным, что у вас достаточно памяти.
Я бы предложил определить какой-нибудь разумный фрагмент и сделать его "записью"

person David Gruzman    schedule 01.01.2013
comment
Я понимаю, о чем вы говорите. Я даже пробовал его кодировать. Но у меня начались проблемы с закрытием входного потока, который будет читаться из источника. Каждый раз, когда кусок ввода читался и записывался в преобразователь как запись, вернуться назад, чтобы прочитать оставшееся, было невозможно. Я бы прочитал кусок 1024 и установил его как значение для записи. while(totalBytes < len){ bytesRead =in.read(buf); } totalBytes+=1024; } value.set(buf); - person RadAl; 02.01.2013
comment
Хорошо .. в некоторой степени воспалились. Однако я столкнулся с новой проблемой. Найдите ее здесь: ссылка - person RadAl; 02.01.2013

Пока функция Map запущена, Hadoop собирает выходные записи в буфере в памяти, который называется MapOutputBuffer.

Общий размер этого буфера в памяти задается свойством io.sort.mb и по умолчанию равен 100 МБ.

Попробуйте увеличить значение этого свойства в mapred-site.xml.

person Ramana    schedule 31.12.2012
comment
Не работает. Я попытался установить его с помощью своего кода, используя 'conf.set'. Он установил значение, указанное мной, но, тем не менее, все еще сталкивается с ошибкой пространства кучи. - person RadAl; 01.01.2013
comment
Не работает. Я попытался установить его с помощью своего кода, используя «conf.set». - person RadAl; 01.01.2013