python - PipeMapRed.waitOutputThreads():子进程失败,代码为1

时间:2014-08-05 09:53:35

标签: mapreduce beautifulsoup hadoop-streaming

最近,我想解析网站,然后使用BeautifulSoup过滤我想要的内容并在hdfs中的csv文件中写入。

现在,我正在使用BeautifulSoup过滤网站代码。

我想用mapreduce方法执行它:

hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.3.0-mr1-cdh5.0.2.jar 
-mapper /pytemp/filter.py 
-input /user/root/py/input/ 
-output /user/root/py/output40/

输入文件类似于kvs(PER LINE):(键,值)=(url,content)

内容,我的意思是:

<html><head><title>...</title></head><body>...</body></html>

filter.py文件:

#!/usr/bin/env python
#!/usr/bin/python
#coding:utf-8
from bs4 import BeautifulSoup
import sys

for line in sys.stdin:
    line = line.strip()
    key, content = line.split(",")

    #if the following two lines do not exist, the program will execute successfully
    soup = BeautifulSoup(content)
    output = soup.find()         

    print("Start-----------------")
    print("End------------------")
顺便说一句,我认为我不需要reduce.py来完成我的工作。

但是,我收到了错误消息

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.PipeMapper.close(PipeMapper.java:130)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61)
at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:430)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:342)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
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:1548)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)

这是一个回复说它是内存问题,但我的输入文件只有3MB。 http://grokbase.com/t/gg/rhadoop/13924fs4as/972-getting-error-pipemapred-waitoutputthreads-while-running-mapreduce-program-for-40mb-of-sizedataset

我不知道我的问题。我为它搜索了很多东西,但仍然无效。

我的环境是:

  1. CentOS6
  2. Python2.7
  3. Cloudera CDH5
  4. 感谢您对这种情况的帮助。

    2016/06/24编辑

    首先,我检查了错误日志,发现问题是要解压的值太多。 (也感谢@kynan回答)

    举一个例子,为什么会发生

    <font color="#0000FF">
      SomeText1
      <font color="#0000FF">
        SomeText2
      </font>
    </font>
    

    如果 content 的一部分与上面类似,我会调用soup.find(“font”,color =“#0000FF”)并分配给输出。它会导致两个 font 分配给一个输出,这就是为什么错误要解压的值太多

    解决方案

    只需将output = soup.find()更改为(Var1, Var2, ...) = soup.find_all("font", color="#0000FF", limit=AmountOfVar)并运作良好:)

1 个答案:

答案 0 :(得分:2)

此错误通常意味着映射器进程已死亡。要找出检查用户登录$HADOOP_PREFIX/logs/userlogs的原因:每个作业有一个目录,每个容器在一个目录中。在每个容器目录中都有一个文件stderr,其中包含发送给stderr的输出,即错误消息。