取数器1中的无序排列中出现Hadoop错误

取数器1中的无序排列中出现Hadoop错误,hadoop,mapreduce,Hadoop,Mapreduce,我在hadoop中运行一个解析作业,源代码是一个11GB的映射文件,其中大约900000个二进制记录,每个记录代表一个HTML文件,映射提取链接并将它们写入上下文。 我没有为这份工作写减速机 当我在较小的文件上运行它时,大约5GB,大约500000条记录,工作正常 这是一台单机集群 输出约有1亿条记录、文字 在计划的200项地图任务中,有11项地图任务失败 我正在运行Hadoop 0.22.0 我得到以下错误: org.apache.hadoop.mapreduce.task.reduce.

我在hadoop中运行一个解析作业,源代码是一个11GB的映射文件,其中大约900000个二进制记录,每个记录代表一个HTML文件,映射提取链接并将它们写入上下文。 我没有为这份工作写减速机

  • 当我在较小的文件上运行它时,大约5GB,大约500000条记录,工作正常
  • 这是一台单机集群
  • 输出约有1亿条记录、文字
  • 在计划的200项地图任务中,有11项地图任务失败
  • 我正在运行Hadoop 0.22.0
我得到以下错误:

org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError:error 在洗牌进站取数器中#1在 org.apache.hadoop.mapreduce.task.reduce.Shuffle.run(Shuffle.java:124) 位于org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:362) org.apache.hadoop.mapred.Child$4.run(Child.java:223)位于 java.security.AccessController.doPrivileged(本机方法)位于 javax.security.auth.Subject.doAs(Subject.java:396)位于 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1153) 在org.apache.hadoop.mapred.Child.main(Child.java:217)上,由以下原因引起: java.lang.OutOfMemoryError:位于的java堆空间 org.apache.hadoop.io.BoundedByteArrayOutputStream。(BoundedByteArrayOutputStream.java:58) 在 org.apache.hadoop.io.BoundedByteArrayOutputStream。(BoundedByteArrayOutputStream.java:45) 在 org.apache.hadoop.mapreduce.task.reduce.MapOutput.(MapOutput.java:104) 在 org.apache.hadoop.mapreduce.task.reduce.MergeManager.unconditionalReserve(MergeManager.java:267)

这是我的mapreduce-site.xml:

<configuration>
<property>
  <name>mapred.job.tracker</name>
  <value>Hadp01:8012</value>
  <description>The host and port that the MapReduce job tracker runs
  at.  If "local", then jobs are run in-process as a single map
  and reduce task.
  </description>
</property>
<property>
  <name>mapred.local.dir</name>
  <value>/BigData1/MapReduce,/BigData2/MapReduce</value>
</property>
<property>
  <name>mapred.child.java.opts</name>
  <value>-Xmx1536m</value>
</property>
<property>
        <name>dfs.datanode.max.xcievers</name>
        <value>2048</value>
</property>
<property>
    <name>mapreduce.task.io.sort.mb</name>
    <value>300</value>
</property>
<property>
    <name>io.sort.mb</name>
    <value>300</value>
</property>
<property>
    <name>mapreduce.task.io.sort.factor</name>
    <value>100</value>
</property>
<property>
    <name>io.sort.factor</name>
    <value>100</value>
</property>
<property>
    <name>tasktracker.http.threads</name>
    <value>80</value>
</property>
</configuration>

mapred.job.tracker
Hadp01:8012
MapReduce作业跟踪器运行的主机和端口
在如果为“本地”,则作业作为单个映射在进程中运行
并减少任务。
mapred.local.dir
/BigData1/MapReduce,/BigData2/MapReduce
mapred.child.java.opts
-Xmx1536m
dfs.datanode.max.xcievers
2048
mapreduce.task.io.sort.mb
300
io.sort.mb
300
mapreduce.task.io.sort.factor
100
排序因子
100
tasktracker.http.threads
80
有人知道怎么修吗?
谢谢大家!

默认情况下,此错误由mapreduce.reduce.shuffle.memory.limit.percent引起

mapreduce.reduce.shuffle.memory.limit.percent=0.25
为了解决此问题,我限制了reduce的洗牌内存使用: 蜂巢:

MapReduce:

job.getConfiguration().setStrings("mapreduce.reduce.shuffle.memory.limit.percent", "0.15");

你能分享你的地图程序代码吗?错误消息看起来像是内存问题,这可能意味着键或值对象可能很大。地图输出的键和值类型是什么?嗨,Chris,我知道有一个任务可能会消耗大量内存。我在java应用程序上运行了相同的任务,通过读取映射文件并运行函数,它完成了所有记录,没有任何内存问题。另外,异常是Reducer任务失败,而不是mapper任务失败。谢谢,这是一个在一定程度上很好的解决办法。即使在达到这些极限后,它也会出现。
job.getConfiguration().setStrings("mapreduce.reduce.shuffle.memory.limit.percent", "0.15");