2013-01-15 47 views
1

我正在写一个hadoop作业,它处理许多文件并从每个文件创建多个文件。我正在使用“MultipleOutputs”来编写它们。它适用于较小数量的文件,但我得到大量文件的以下错误。 MultipleOutputs.write(key,value,outputPath)引发异常; 我曾尝试增加ulimit和-Xmx但无济于事。Hadoop - MultipleOutputs.write - OutofMemory - Java堆空间

2013-01-15 13:44:05,154 FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.OutOfMemoryError: Java heap space 
    at org.apache.hadoop.hdfs.DFSOutputStream$Packet.<init>(DFSOutputStream.java:201) 
    at org.apache.hadoop.hdfs.DFSOutputStream.writeChunk(DFSOutputStream.java:1423) 
    at org.apache.hadoop.fs.FSOutputSummer.writeChecksumChunk(FSOutputSummer.java:161) 
    at org.apache.hadoop.fs.FSOutputSummer.flushBuffer(FSOutputSummer.java:136) 
    at org.apache.hadoop.fs.FSOutputSummer.flushBuffer(FSOutputSummer.java:125) 
    at org.apache.hadoop.fs.FSOutputSummer.write1(FSOutputSummer.java:116) 
    at org.apache.hadoop.fs.FSOutputSummer.write(FSOutputSummer.java:90) 
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.write(FSDataOutputStream.java:54) 
    at java.io.DataOutputStream.write(DataOutputStream.java:90) 
    at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat$LineRecordWriter. writeObject(TextOutputFormat.java:78) 
    at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat$LineRecordWriter. write(TextOutputFormat.java:99) 
    **at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.write(MultipleOutputs.java:386) 
    at com.demoapp.collector.MPReducer.reduce(MPReducer.java:298) 
    at com.demoapp.collector.MPReducer.reduce(MPReducer.java:28)** 
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:164) 
    at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:595) 
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:433) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:268) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:396) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332) 
    at org.apache.hadoop.mapred.Child.main(Child.java:262) 

任何想法?

回答

0

如果它不适用于大量文件,可能是因为您已达到数据节点可以提供的最大文件数量。这可以通过hdfs-site.xml中名为dfs.datanode.max.xcievers的属性进行控制。

根据建议here,你应该它的价值碰撞的东西,可以让你的工作正常运行,他们建议4096:

<property> 
    <name>dfs.datanode.max.xcievers</name> 
    <value>4096</value> 
</property> 
+0

我试图使用来设置属性 - 配置CONF = job.getConfiguration(); conf.set(“dfs.datanode.max.xcievers”,“4096”);并且执行了这项工作,但没有任何区别。 – Harpreet

+0

@Harpreet这是一个datanode属性,您需要将它放在hdfs-site.xml中并重新启动群集才能生效。 –