为什么使用Python的Hadoop MapReduce失败,但命令行上的脚本却有效?

2024-05-19 22:46:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用Cloudera5.5.0实现一个简单的Hadoop map reduce示例 map&reduce步骤应该使用python2.6.6实现

问题:

  • 如果这些脚本是在unix命令行上执行的,那么它们运行得非常好,并产生了预期的输出。在

目录join2*.txt |./join3_映射器.py|排序|/join3_减速器.py在

  • 但是将脚本作为hadoop任务执行会非常失败:

hadoop jar/usr/lib/hadoop mapreduce/hadoop-流媒体.jar-input/user/cloudera/inputv/join2_gen*.txt-output/user/cloudera/output_tv-mapper/home/cloudera/join3_映射器.py-减速器/家庭/云端/接头3_减速器.py-数字任务1

16/01/06 12:32:32 INFO mapreduce.Job: Task Id : attempt_1452069211060_0026_r_000000_0, Status : FAILED Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1 at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:325) at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:538) at org.apache.hadoop.streaming.PipeReducer.close(PipeReducer.java:134) at org.apache.hadoop.io.IOUtils.cleanup(IOUtils.java:244) 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:163) 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:1671) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

  • 如果hadoop命令使用-numreduetasks 0执行, hadoop作业只执行map步骤,成功结束,输出目录包含map步骤的结果文件。

  • 我想减量步骤一定有问题吧?

  • 色调中的stderr日志没有显示任何相关内容:

日志上传时间:2016年1月6日星期三12:33:10-0800 原木长度:222 log4j:警告找不到记录器的附加程序(org.apache.hadoop.ipc服务器). log4j:警告请正确初始化log4j系统。 log4j:WARN有关更多信息,请参见http://logging.apache.org/log4j/1.2/faq.html#noconfig。在

脚本代码: 第一个文件:join3_映射器.py在

#!/usr/bin/env python

import sys

for line in sys.stdin:
   line       = line.strip()   #strip out carriage return
   tuple2  = line.split(",")   #split line, into key and value, returns a list

   if len(tuple2) == 2:
      key = tuple2[0]
      value = tuple2[1]
      if value == 'ABC':
         print('%s\t%s' % (key, value) )
      elif value.isdigit():
         print('%s\t%s' % (key, value) ) 

第二个文件:join3_减速器.py在

^{pr2}$

我尝试过各种不同的方法来声明hadoop命令的输入文件,没有区别,也没有成功。在

我做错什么了?很感谢你的建议,谢谢


Tags: pyorghadoopmapvalueapacheline步骤
2条回答

多幸运的一拳,和它搏斗了好几天,我知道我成功了:

从本地(unix)执行

cat join2_gen*.txt | ./join2_mapper.py | sort | ./join2_reducer.py

很好,我想到使用1个合并的输入文件,而不是提供的6个输入文件,因此:

^{pr2}$

然后再次执行相同的hadoop命令,将输入定向到输入文件夹中的mergedInputFile>;完美结果,没有问题,没有异常作业完成。在

对我来说,它提出了一个问题:

  • 为什么它使用一个合并的输入文件,但现在提供了较小的6个文件??还不知道

尝试将所有输入文本文件放在一个目录中,然后将该目录作为输入传递。这样你就不必合并所有的输入文件了

相关问题 更多 >