2011-10-31 4 views
0

У меня есть карта сократить работу, который работает отлично, пока я не начал видеть некоторые не смогли задания на карте, какhadoop-streaming: редуктор в состоянии ожидания, не запускается?

attempt_201110302152_0003_m_000010_0 task_201110302152_0003_m_000010 worker1 FAILED 
Task attempt_201110302152_0003_m_000010_0 failed to report status for 602 seconds. Killing! 
------- 
Task attempt_201110302152_0003_m_000010_0 failed to report status for 607 seconds. Killing! 
Last 4KB 
Last 8KB 
All 
attempt_201110302152_0003_m_000010_1 task_201110302152_0003_m_000010 master FAILED 
java.lang.RuntimeException: java.io.IOException: Spill failed 
    at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:325) 
    at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:545) 
    at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:132) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:261) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:396) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059) 
    at org.apache.hadoop.mapred.Child.main(Child.java:255) 
Caused by: java.io.IOException: Spill failed 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1029) 
    at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:592) 
    at org.apache.hadoop.streaming.PipeMapRed$MROutputThread.run(PipeMapRed.java:381) 
Caused by: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for output/spill11.out 
    at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:381) 
    at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:146) 
    at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:127) 
    at org.apache.hadoop.mapred.MapOutputFile.getSpillFileForWrite(MapOutputFile.java:121) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1392) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$1800(MapTask.java:853) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$SpillThread.run(MapTask.java:1344) 
Last 4KB 
Last 8KB 
All 

и теперь редуктор не начнет выполняться в то время как раньше редуктор используется для начала копирования данные, даже когда карта задача выполняется, все, что я вижу, это

11/10/31 03:35:12 INFO streaming.StreamJob: map 95% reduce 0% 
11/10/31 03:44:01 INFO streaming.StreamJob: map 96% reduce 0% 
11/10/31 03:51:56 INFO streaming.StreamJob: map 97% reduce 0% 
11/10/31 03:55:41 INFO streaming.StreamJob: map 98% reduce 0% 
11/10/31 04:04:18 INFO streaming.StreamJob: map 99% reduce 0% 
11/10/31 04:20:32 INFO streaming.StreamJob: map 100% reduce 0% 

Я новичок в hadoop и mapreduce и на самом деле не знаю, что может быть причиной того же код на провал whic ч успешно раньше работает

Пожалуйста, помогите

Спасибо

ответ

1

Вы должны взглянуть на mapred.task.timeout. Если у вас очень большой объем данных и несколько машин для его обработки, ваша задача может быть отключена. Вы можете установить это значение в 0, которое отключает этот таймаут.

В качестве альтернативы, если вы можете позвонить context.progress или какой-либо эквивалентной функции, чтобы сказать, что что-то происходит, чтобы задание не зависало.

+0

Там, кажется, 2 ошибки - один является тайм-аут, а другой «вызвано следующими причинами: java.io.IOException: Не удалось пролить " –

0

У меня была эта же проблема, и там были две вещи, которые я сделал, чтобы решить ее:

Первый сжать выход вашего картографа, используйте mapred.output.compress=true. По мере запуска вашего картографа вывод выдается на диск (записывается на диск), и иногда этот вывод необходимо отправить на редуктор на другой машине. Сжатие вывода уменьшит сетевой трафик, а также уменьшит объем требуемого диска на машине, на которой работает устройство отображения.

Вторая вещь, которую я сделал, - это увеличение ulimits для hdfs и отображаемых пользователей. Я добавил эти строки в /etc/security/limits.conf

mapred  soft nproc  16384 
mapred  soft nofile  16384 
hdfs  soft nproc  16384 
hdfs  soft nofile  16384 
hbase  soft nproc  16384 
hbase  soft nofile  16384 

Это сообщение имеет более полное объяснение: http://www.cloudera.com/blog/2009/03/configuration-parameters-what-can-you-just-ignore/