Исключение ввода-вывода задания Hadoop MapReduce из-за преждевременного EOF из inputStream

Я запустил программу MapReduce с помощью команды hadoop jar <jar> [mainClass] path/to/input path/to/output. Однако моя работа зависла на: INFO mapreduce.Job: map 100% reduce 29%.

Гораздо позже я остановился и проверил журнал узла данных (я работаю в псевдораспределенном режиме). Он содержал следующее исключение:

java.io.IOException: Premature EOF from inputStream
at org.apache.hadoop.io.IOUtils.readFully(IOUtils.java:201)
at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doReadFully(PacketReceiver.java:213)
at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doRead(PacketReceiver.java:134)
at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.receiveNextPacket(PacketReceiver.java:109)
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receivePacket(BlockReceiver.java:472)
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receiveBlock(BlockReceiver.java:849)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:804)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opWriteBlock(Receiver.java:137)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:74)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:251)
at java.lang.Thread.run(Thread.java:745)

Через 5 секунд в логе было ERROR DataXceiver error processing WRITE_BLOCK operation.

Какая проблема может быть причиной этого исключения и ошибки?

Мой NodeHealthReport сказал:

1/1 local-dirs are bad: /home/$USER/hadoop/nm-local-dir; 
1/1 log-dirs are bad: /home/$USER/hadoop-2.7.1/logs/userlogs

Я нашел это указывает на то, что dfs.datanode.max.xcievers может потребоваться увеличить. Однако оно устарело, и новое свойство называется dfs.datanode.max.transfer.threads со значением по умолчанию 4096. Если изменение этого параметра решит мою проблему, какое новое значение я должен установить для него?

Это указывает, что ulimit для узла данных может потребоваться увеличить. Мой ulimit -n (открытые файлы) равен 1024. Если увеличение этого значения решит мою проблему, на что мне его установить?


person AST    schedule 17.08.2015    source источник


Ответы (1)


Преждевременный EOF может возникать по нескольким причинам, одна из которых — создание огромного количества потоков для записи на диск на одном узле редуктора с использованием FileOutputCommitter. Класс MultipleOutputs позволяет вам записывать в файлы с произвольными именами, и для этого он создает один поток для каждого файла и привязывает к нему порт для записи на диск. Теперь это накладывает ограничение на количество файлов, которые могут быть записаны на одном узле редуктора. Я столкнулся с этой ошибкой, когда количество файлов превысило 12000 примерно на одном узле редуктора, поскольку потоки были убиты, а папка _temporary удалена, что привело к множеству этих сообщений об исключениях. Я предполагаю, что это не проблема переполнения памяти, и ее нельзя решить, разрешив движку Hadoop создавать больше потоков. Уменьшение количества файлов, записываемых одновременно на одном узле, решило мою проблему — либо за счет уменьшения фактического количества записываемых файлов, либо за счет увеличения узлов-редьюсеров.

person Ro__bust    schedule 28.11.2016
comment
Это была очень полезная информация, и это именно то, что происходило со мной. Как вы узнали, что темы были убиты? - person cozos; 29.12.2018