最近,我想解析网站,然后使用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):(key,value)=(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-size数据集
我不知道我的问题。我为此搜索了很多东西,但仍然无法正常工作。
我的环境是:
感谢您在这种情况下的帮助。
于2016/06/24编辑
首先,我检查了错误日志,发现问题在于无法解包的值太多。(也感谢@kynan的回答)
只是举个例子为什么会发生
<font color="#0000FF">
SomeText1
<font color="#0000FF">
SomeText2
</font>
</font>
如果内容的一部分与上面类似,我调用soup.find(“ font”,color =“#0000FF”)并分配给output。这将导致将两种字体分配给一个输出,因此这就是错误太多而无法解包的原因
解
只需更改output = soup.find()
为(Var1, Var2, ...) = soup.find_all("font", color="#0000FF", limit=AmountOfVar)
并正常工作:)
此错误通常意味着映射器进程已终止。要查明为什么要检查用户登录,请执行以下操作$HADOOP_PREFIX/logs/userlogs
:每个作业有一个目录,每个容器有一个目录。每个容器目录中都有一个文件,stderr
其中包含发送到stderr的输出,即错误消息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句