我正在编写一个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)
答案 0 :(得分:0)
您收到的java错误只是告诉您运行程序失败但它没有告诉您程序中的问题。要查看您需要从容器中获取stderr日志。
如果您转到jobtracker页面(类似http://myserver.com:50030/jobtracker.jsp)并找到失败的工作,您可以单击“失败的任务”列中的数字,然后从那里获取任务日志。你应该能够在那里找到问题。