错误:还原器阶段中的Java堆空间 [英] Error: Java heap space in reducer phase
问题描述
我在减速器阶段遇到JAVA堆空间错误。我在我的应用程序中使用了41减速器,也使用了自定义分区器类。
下面是我的Reducer代码,它会抛出错误。
17/02/12 05:26:45信息mapreduce 。工作:地图98%减少0%
17/02/12 05:28:02信息mapreduce.Job:地图100%减少0%
17/02/12 05:28:09信息mapreduce 。工作:地图100%减少17%
17/02/12 05:28:10信息mapreduce.Job:地图100%减少39%
17/02/12 05:28:11信息mapreduce 。作业:地图100%减少46%
17/02/12 05:28:12信息mapreduce.Job:地图100%减少51%
17/02/12 05:28:13信息mapreduce 。作业:地图100%减少54%
17/02/12 05:28:14信息mapreduce.Job:地图100%减少56%
17/02/12 05:28:15信息mapreduce 。工作:地图100%减少88%
17/02/12 05:28:16信息mapreduce.Job:地图100%减少90%
17/02/12 05:28:18信息mapreduce .Job:map 100%减少93%
17/02/12 05:28:18信息mapreduce.Job:任务ID:attempt_1486663266028_2653_r_000020_0,状态:FAILED
错误:Java堆空间
17 / 02/12 05:28:19信息mapreduce.Job:地图100%减少91%
17/02/12 05:28:2 0信息mapreduce.Job:任务ID:attempt_1486663266028_2653_r_000021_0,状态:FAILED
错误:Java堆空间
17/02/12 05:28:22信息mapreduce.Job:任务ID:attempt_1486663266028_2653_r_000027_0,状态:FAILED
错误:Java堆空间
17/02/12 05:28:23信息mapreduce.Job:map 100%减少89%
17/02/12 05:28:24信息mapreduce .Job:map 100%减少90%
17/02/12 05:28:24信息mapreduce.Job:任务ID:attempt_1486663266028_2653_r_000029_0,状态:FAILED
错误:Java堆空间
以下是我的reducer代码..
public class MyReducer扩展了Reducer< NullWritable,Text,NullWritable,Text> {
private Logger logger = Logger.getLogger(MyReducer.class);
StringBuilder sb = new StringBuilder();
私有MultipleOutputs< NullWritable,Text> multipleOutputs;
public void setup(Context context){
logger.info(Inside Reducer。);
multipleOutputs = new MultipleOutputs< NullWritable,Text>(context);
$ b $覆盖
public void reduce(NullWritable Key,Iterable< Text> values,Context context)
throws IOException,InterruptedException {
for(Text value:values){
final String valueStr = value.toString();
if(valueStr.contains(Japan)){
sb.append(valueStr.substring(0,valueStr.length() - 20));
} else if(valueStr.contains(SelfSourcedPrivate)){
sb.append(valueStr.substring(0,valueStr.length() - 29));
} else if(valueStr.contains(SelfSourcedPublic)){
sb.append(value.toString()。substring(0,valueStr.length() - 29));
} else if(valueStr.contains(ThirdPartyPrivate)){
sb.append(valueStr.substring(0,valueStr.length() - 25));
$ b multipleOutputs.write(NullWritable.get(),new Text(sb.toString()),MyFileName);
}
public void cleanup(Context context)抛出IOException,InterruptedException {
multipleOutputs.close();
$ b你可以提出任何可以解决我的问题的改变。
如果我们使用combiner类,它会改善吗?解决方案最后我管理它来解决它。 b
$ b
我只用 multipleOutputs.write(NullWritable.get(),new Text(sb.toString()),strName);
里面for循环,并解决了我的问题。我用非常庞大的数据集19 GB文件测试了它,它对我来说工作得很好。
这是我的最终解决方案。最初我认为它可能会创建许多对象,但它对我来说工作得很好.Map缩减也正在非常快速地竞争。
<$ p
public void reduce(NullWritable Key,Iterable< Text> values,Context context)
throws IOException,InterruptedException {
for(Text value:values ){
final String valueStr = value.toString();
StringBuilder sb = new StringBuilder();
if(valueStr.contains(Japan)){
sb.append(valueStr.substring(0,valueStr.length() - 20));
} else if(valueStr.contains(SelfSourcedPrivate)){
sb.append(valueStr.substring(0,valueStr.length() - 24));
} else if(valueStr.contains(SelfSourcedPublic)){
sb.append(value.toString()。substring(0,valueStr.length() - 25));
} else if(valueStr.contains(ThirdPartyPrivate)){
sb.append(valueStr.substring(0,valueStr.length() - 25));
multipleOutputs.write(NullWritable.get(),new Text(sb.toString()),
strName);
}
}
I am getting JAVA Heap space error in my reducer phase .I have used 41 reducer in my application and also Custom Partitioner class . Below is my reducer code that throws below error .
17/02/12 05:26:45 INFO mapreduce.Job: map 98% reduce 0%
17/02/12 05:28:02 INFO mapreduce.Job: map 100% reduce 0%
17/02/12 05:28:09 INFO mapreduce.Job: map 100% reduce 17%
17/02/12 05:28:10 INFO mapreduce.Job: map 100% reduce 39%
17/02/12 05:28:11 INFO mapreduce.Job: map 100% reduce 46%
17/02/12 05:28:12 INFO mapreduce.Job: map 100% reduce 51%
17/02/12 05:28:13 INFO mapreduce.Job: map 100% reduce 54%
17/02/12 05:28:14 INFO mapreduce.Job: map 100% reduce 56%
17/02/12 05:28:15 INFO mapreduce.Job: map 100% reduce 88%
17/02/12 05:28:16 INFO mapreduce.Job: map 100% reduce 90%
17/02/12 05:28:18 INFO mapreduce.Job: map 100% reduce 93%
17/02/12 05:28:18 INFO mapreduce.Job: Task Id : attempt_1486663266028_2653_r_000020_0, Status : FAILED
Error: Java heap space
17/02/12 05:28:19 INFO mapreduce.Job: map 100% reduce 91%
17/02/12 05:28:20 INFO mapreduce.Job: Task Id : attempt_1486663266028_2653_r_000021_0, Status : FAILED
Error: Java heap space
17/02/12 05:28:22 INFO mapreduce.Job: Task Id : attempt_1486663266028_2653_r_000027_0, Status : FAILED
Error: Java heap space
17/02/12 05:28:23 INFO mapreduce.Job: map 100% reduce 89%
17/02/12 05:28:24 INFO mapreduce.Job: map 100% reduce 90%
17/02/12 05:28:24 INFO mapreduce.Job: Task Id : attempt_1486663266028_2653_r_000029_0, Status : FAILED
Error: Java heap space
Here is my reducer code..
public class MyReducer extends Reducer<NullWritable, Text, NullWritable, Text> {
private Logger logger = Logger.getLogger(MyReducer.class);
StringBuilder sb = new StringBuilder();
private MultipleOutputs<NullWritable, Text> multipleOutputs;
public void setup(Context context) {
logger.info("Inside Reducer.");
multipleOutputs = new MultipleOutputs<NullWritable, Text>(context);
}
@Override
public void reduce(NullWritable Key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
for (Text value : values) {
final String valueStr = value.toString();
if (valueStr.contains("Japan")) {
sb.append(valueStr.substring(0, valueStr.length() - 20));
} else if (valueStr.contains("SelfSourcedPrivate")) {
sb.append(valueStr.substring(0, valueStr.length() - 29));
} else if (valueStr.contains("SelfSourcedPublic")) {
sb.append(value.toString().substring(0, valueStr.length() - 29));
} else if (valueStr.contains("ThirdPartyPrivate")) {
sb.append(valueStr.substring(0, valueStr.length() - 25));
}
}
multipleOutputs.write(NullWritable.get(), new Text(sb.toString()), "MyFileName");
}
public void cleanup(Context context) throws IOException, InterruptedException {
multipleOutputs.close();
}
}
Can you suggest any change that will solve my problem. If we use combiner class will it improve?
Finally i manged to resolve it .
I just used multipleOutputs.write(NullWritable.get(), new Text(sb.toString()),strName);
inside the for loop and that solved my problem .I have tested it with very huge data set 19 gb file and it worked fine for me .
This is my final solution .Initially i thought it might create many objects but it is working fine for me .Map reduce is also getting competed very fast .
@Override
public void reduce(NullWritable Key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
for (Text value : values) {
final String valueStr = value.toString();
StringBuilder sb = new StringBuilder();
if (valueStr.contains("Japan")) {
sb.append(valueStr.substring(0, valueStr.length() - 20));
} else if (valueStr.contains("SelfSourcedPrivate")) {
sb.append(valueStr.substring(0, valueStr.length() - 24));
} else if (valueStr.contains("SelfSourcedPublic")) {
sb.append(value.toString().substring(0, valueStr.length() - 25));
} else if (valueStr.contains("ThirdPartyPrivate")) {
sb.append(valueStr.substring(0, valueStr.length() - 25));
}
multipleOutputs.write(NullWritable.get(), new Text(sb.toString()),
strName);
}
}
这篇关于错误:还原器阶段中的Java堆空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!