2017-02-12 6 views
1

내 감속기 단계에서 JAVA 힙 공간 오류가 발생합니다. 내 응용 프로그램 및 사용자 정의 분할 영역 클래스에 41 감속기를 사용했습니다. 아래에 오류가 발생하는 제 감속기 코드가 있습니다.오류 : 감속기 단계의 Java 힙 공간

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 

여기

 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(); 
    } 
} 

당신은 내 문제를 해결할 변경을 제안 할 수 있습니다 .. 내 감속기 코드입니다. 결합기 클래스를 사용하면 개선 될까요?

+1

일반적으로 몇 개의 값을 문자열에 추가하려고합니까? 가치가 많은 열쇠가 있습니까? –

답변

0

마지막으로 문제를 해결하기 위해 노력했습니다.

방금 ​​multipleOutputs.write(NullWritable.get(), new Text(sb.toString()),strName);을 for 루프 안에 넣었습니다. 내 문제를 해결했습니다. 19GB 파일을 매우 큰 데이터 세트로 테스트했는데 제대로 작동했습니다. 이것은 내 최종 솔루션입니다. 처음에는 많은 객체를 만들지 만 나에게 잘 작동하고 있다고 생각했습니다. 맵 축소도 매우 빠르게 진행되고 있습니다.

@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); 
     } 
    }