HadoopStreaming R作为reducer失败

时间:2014-11-29 20:54:42

标签: python r hadoop hadoop-streaming

我正在编写一个hadoop流工作,其中映射器是用Python编写的简单数据清理,在reducer部分我想用R运行某些时间序列分析。但是,调试mapreduce工作本身并不是那么容易我最终以一种识别键和值的方式编写我的reducer,然后将它们写入未修改的结果中。但是,它仍然无法工作,我的python代码完全相同的东西工作没有问题。

当使用R作为reducer的streaing作业时,错误消息如下所示:

Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1 
    at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:320) at     
org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:533) at 
org.apache.hadoop.streaming.PipeReducer.close(PipeReducer.java:134) at 
org.apache.hadoop.io.IOUtils.cleanup(IOUtils.java:237) at 
org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:459) at 
org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:392) at 
org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167) at 
java.security.AccessController.doPrivileged(Native Method) at
 javax.security.auth.Subject.doAs(Subject.java:415) at     
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1554) at  

org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)

我在4个数据节点(每个64GB内存)的集群上运行此流媒体作业,它总共产生了大约500个映射器和60个减少器。我发布了两种语言的reducer代码。任何建议或帮助都是适用的!

这是reducer.py

#!/usr/bin/python
import sys
delimiter = '\t'

for line in sys.stdin:
    line = line.strip()
    mykey, myvalue = line.split(delimiter)
    print delimiter.join([mykey, myvalue])

这是reducer.R

#!/usr/bin/Rscript
library(dplyr)
library(outliers)
library(zoo)
library(forecast)
#library(tsoutliers)

f <- file("stdin")
open(f, open="r")
options(warn=-1)

mydelimiter <- '\t'

sink('/dev/null')
while(length(line<-readLines(f, n=1)) > 0){
    tryCatch(
        {
            line <- gsub('\n', '', line)
            fields <- unlist(strsplit(line, split=mydelimiter))
            mykey_new <- fields[1]
            myvalue_new <- fields[2]
            sink()
            cat(mykey_new);cat(mydelimiter);cat(myvalue_new);cat('\n')
            sink('/dev/null')
        },
        error=function(e){}
    )
}

close(f)

1 个答案:

答案 0 :(得分:0)

您收到的java错误只是告诉您运行程序失败但它没有告诉您程序中的问题。要查看您需要从容器中获取stderr日志。

如果您转到jobtracker页面(类似http://myserver.com:50030/jobtracker.jsp)并找到失败的工作,您可以单击“失败的任务”列中的数字,然后从那里获取任务日志。你应该能够在那里找到问题。