我正在尝试在mapper中读取多行。为此,我开始使用nlineinputformat类。在使用这个时,我得到了gc限制错误。作为参考,错误代码为:
16/02/21 01:37:13 INFO mapreduce.Job: map 0% reduce 0%
16/02/21 01:37:38 WARN mapred.LocalJobRunner: job_local726191039_0001
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1019)
at java.util.concurrent.ConcurrentHashMap.putAll(ConcurrentHashMap.java:1084)
at java.util.concurrent.ConcurrentHashMap.<init>(ConcurrentHashMap.java:852)
at org.apache.hadoop.conf.Configuration.<init>(Configuration.java:713)
at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:442)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.<init>(LocalJobRunner.java:217)
at org.apache.hadoop.mapred.LocalJobRunner$Job.getMapTaskRunnables(LocalJobRunner.java:272)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:517)
16/02/21 01:37:39 INFO mapreduce.Job: Job job_local726191039_0001 failed with state FAILED due to: NA
请在下面找到代码片段以供参考。
public class JobLauncher {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "TestDemo");
job.setJarByClass(JobLauncher.class);
job.setMapperClass(CSVMapper.class);
job.setMapOutputKeyClass(NullWritable.class);
job.setMapOutputValueClass(NullWritable.class);
conf.setInt(NLineInputFormat.LINES_PER_MAP, 3);
job.setInputFormatClass(NLineInputFormat.class);
NLineInputFormat.addInputPath(job, new Path(args[0]));
job.setNumReduceTasks(0);
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
我只是有一个简单的csvmapperMap器。为什么我会犯这个错误?请帮我解决这个错误。
提前谢谢。
2条答案
按热度按时间2jcobegt1#
添加到stephen c answer中,列出了可能的解决方案
从oracle文档链接,
线程名称中出现异常:java.lang.outofmemoryerror:超出gc开销限制
原因:详细消息“gc overhead limit exceeded”表示垃圾收集器一直在运行,java程序进展非常缓慢。在垃圾收集之后,如果java进程花费大约98%以上的时间进行垃圾收集,并且恢复的堆不到2%,并且一直在进行最后5次(编译时常量)连续垃圾收集,则抛出java.lang.outofmemoryerror。
抛出此异常通常是因为活动数据量几乎无法放入java堆,而新分配的可用空间很小。
措施:增加堆大小。对于超出gc开销限制的java.lang.outofmemoryerror异常,可以使用命令行标志-xx:-usegcoverheadlimit关闭。
为了更好地处理此错误,请查看此se问题:
java.lang.outofmemoryerror:超出gc开销限制
jpfvwuh42#
为什么我会犯这个错误?
一般来说,oome最有可能的解释是你的内存不足,因为
你的代码有内存泄漏,或者
你没有足够的内存来做你想做的事情/你想做的方式。
(有了这种特殊的oome“味道”,你还没有完全耗尽记忆。但是,很可能您已经快用完了,这导致gc cpu利用率激增,超过了“gc开销”阈值。这个细节不会改变你解决问题的方式。)
在您的例子中,当您将文件中的输入加载到Map(或Map集合)中时,似乎发生了错误。因此,可以推断,您已经告诉hadoop加载的数据比一次装入内存的数据要多。
请帮我解决这个错误。
解决:
减少输入文件大小;e、 把你的问题分解成更小的问题
增加受影响jvm的内存大小(特别是java堆大小)。
更改您的应用程序,以便作业从文件(或hfs)本身流式传输数据。。。而不是将csv加载到Map中。
如果你需要一个更具体的答案,你需要提供更多的细节。