EOFException, созданный программой каналов Hadoop

Прежде всего, я новичок в Hadoop.

У меня есть небольшая программа каналов Hadoop, которая выдает java.io.EOFException. Программа принимает в качестве входных данных небольшой текстовый файл и использует файлы hadoop.pipes.java.recordreader и hadoop.pipes.java.recordwriter. Ввод очень простой, например:

1 262144 42.8084 15.9157 4.1324 0.06 0.1

Однако Hadoop выдает исключение EOFException, причину которого я не вижу. Ниже приведена трассировка стека:

10/12/08 23:04:04 INFO mapred.JobClient: Running job: job_201012081252_0016
10/12/08 23:04:05 INFO mapred.JobClient:  map 0% reduce 0%
10/12/08 23:04:16 INFO mapred.JobClient: Task Id : attempt_201012081252_0016_m_000000_0, Status : FAILED 
java.io.IOException: pipe child exception
    at org.apache.hadoop.mapred.pipes.Application.abort(Application.java:151)
    at org.apache.hadoop.mapred.pipes.PipesMapRunner.run(PipesMapRunner.java:101)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
    at org.apache.hadoop.mapred.Child.main(Child.java:170)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readByte(DataInputStream.java:267)
    at org.apache.hadoop.io.WritableUtils.readVLong(WritableUtils.java:298)
    at org.apache.hadoop.io.WritableUtils.readVInt(WritableUtils.java:319)
    at org.apache.hadoop.mapred.pipes.BinaryProtocol$UplinkReaderThread.run(BinaryProtocol.java:114)

Кстати, я запускал это в полностью распределенном режиме (кластер с 3 рабочими узлами).

Любая помощь приветствуется! Спасибо


person peng    schedule 09.12.2010    source источник


Ответы (2)


Извлеченные уроки: во что бы то ни стало постарайтесь убедиться, что в вашей собственной программе нет ошибок.

person peng    schedule 09.12.2010

Эта трассировка стека обычно свидетельствует об исчерпании доступных файловых дескрипторов на ваших рабочих машинах. Это чрезвычайно распространено, скудно задокументировано, и именно поэтому у меня есть два -0">связанные вопросы по теме.

Если у вас есть root-доступ на всех компьютерах, вам следует рассмотреть возможность увеличения лимита файловых дескрипторов для вашего пользователя Hadoop, отредактировав /etc/sysctl.conf:

(Add) fs.file-max = 4096

Или выдача:

ulimit -Sn 4096
ulimit -Hn 4096

До бесконечности. Общая информация о повышении этого ограничения доступна здесь. .

Однако с точки зрения долгосрочного планирования эта стратегия несколько ложна. Если вы обнаружите больше информации о проблеме, возможно, вы можете помоги мне помочь тебе помочь нам всем? [Спасибо, GLaDOS. -Эд]

(Редактировать: см. комментарий ниже.)

person MrGomez    schedule 09.12.2010
comment
Спасибо! К сожалению, увеличение лимита мне не помогло. Есть еще идеи? Между тем, я думаю, что попытаюсь опубликовать этот вопрос в списке рассылки Hadoop. - person peng; 09.12.2010
comment
Мне будет интересен ответ. Одна из причин, по которой эта стратегия является ложной, заключается в том, что среда Hadoop не делает предположений об использовании WRT файловых дескрипторов. Указание произвольно большого числа явно не сработает в тех случаях, когда система выходит за установленный лимит. Вы также можете рассмотреть возможность проверки ограничения дескриптора программного файла в вашей системе, поскольку Hadoop, похоже, соблюдает его. - person MrGomez; 09.12.2010
comment
Проблема была решена. Это было полностью мое плохо. В моей программе каналов произошла ошибка сегментации, которая вызвала исключение. Тем не менее, я думаю, что Exception выглядит загадочным для таких новичков, как я. Может быть, ребята из Hadoop могут немного доработать отчеты об ошибках? - person peng; 10.12.2010
comment
Я согласен. Сбои в преобразователе или редюсере обычно распространяют ошибку на верхний уровень. Общие EOFExceptions обрабатываются не так изящно, и в результате их гораздо сложнее отлаживать в распределенной среде. - person MrGomez; 10.12.2010