0

子を減らすためのOOM例外(Javaヒープスペース)が発生します。レデューサーでは、レデューサープロセスの出力となるStringBuilderにすべての値を追加しています。値の数はそれほど多くありません。の値mapred.reduce.child.java.optsを512Mと1024Mに増やしようとしましたが、それは役に立ちません。レデューサーコードを以下に示します。

            StringBuilder adjVertexStr = new StringBuilder();
        long itcount= 0;
        while(values.hasNext()) {
            adjVertexStr.append(values.next().toString()).append(" ");
            itcount++;
        }
        log.info("Size of iterator: " + itcount);
        multipleOutputs.getCollector("vertex", reporter).collect(key, new Text(""));
        multipleOutputs.getCollector("adjvertex", reporter).collect(adjVertexStr, new Text(""));

上記のコードの3か所で例外が発生します。

  1. 例外スタックトレースでは、行番号は文字列を追加するwhileループステートメントを指しています。
  2. 最後の行-collect()ステートメント。
  3. 重複する値がないように、すべての値を累積するセットがありました。後で削除しました。

イテレータのいくつかのサンプルサイズは次のとおりです:238695、1、13、673、1、1など。これらはそれほど大きな値ではありません。なぜOOM例外が発生し続けるのですか?どんな助けでも私にとって価値があるでしょう。

スタックトレース

2012-10-10 21:15:03,929 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 238695                                                                                                   
2012-10-10 21:15:04,190 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 1                                                                                                        
2012-10-10 21:15:04,190 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 1                                                                                                        
2012-10-10 21:15:04,190 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 13                                                                                                       
2012-10-10 21:15:04,190 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 1                                                                                                        
2012-10-10 21:15:04,191 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 1                                                                                                        
2012-10-10 21:15:04,193 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 673                                                                                                       
2012-10-10 21:15:04,195 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 1                                                                                                        
2012-10-10 21:15:04,196 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 1                                                                                                        
2012-10-10 21:15:04,196 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 1                                                                                                        
2012-10-10 21:15:04,196 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 1                                                                                                        
2012-10-10 21:15:04,196 INFO partitioning.UndirectedGraphPartitioner: Size of iterator: 1                                                                                                        
2012-10-10 21:15:09,856 INFO org.apache.hadoop.mapred.TaskLogsTruncater: Initializing logs`    truncater with mapRetainSize=-1 and reduceRetainSize=-1                                                       
2012-10-10 21:15:09,916 INFO org.apache.hadoop.io.nativeio.NativeIO: Initialized cache for UID to  User mapping with a cache timeout of 14400 seconds.                                                     
2012-10-10 21:15:09,916 INFO org.apache.hadoop.io.nativeio.NativeIO: Got UserName hduser for UID         2006 from the native implementation                                                                      
2012-10-10 21:15:09,922 FATAL org.apache.hadoop.mapred.Child: Error running child :       java.lang.OutOfMemoryError: Java heap space                                                                           
    at java.util.Arrays.copyOf(Arrays.java:2882)                                                                                                                                                      
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)                                                                                                                 
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)                                                                                                                         
    at java.lang.StringBuilder.append(StringBuilder.java:119)                                                                                                                                         
    at partitioning.UndirectedGraphPartitioner$Reduce.reduce(UndirectedGraphPartitioner.java:106)                                                                                            
    at partitioning.UndirectedGraphPartitioner$Reduce.reduce(UndirectedGraphPartitioner.java:82)                                                                                             
    at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:519)                                                                                                                         
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:420)                                                                                                                                   
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)                                                                                                                                           
    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:1121)                                                                                                           
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 
4

1 に答える 1

2

したがって、この例では、特定のキーの値をスペースで区切られた値のリストとして(出力キーとして)出力し、空のテキストを出力値として出力する必要があります。

このための出力形式は、次のようにリデュースキー/値を消費します(これはレデューサーコードに含まれます)。

for (Text value : values) {
    multipleOutputs.getCollector("adjvertex", reporter)
       .collect(key, value);
}

実際のrecordWriterは、キーをロジックトリガーとして使用します。

以前に渡されたキーとは異なるキーが渡されると、書き込まれている前のレコードが閉じられます(たとえば、タブの後に改行を書き込みます)。以前のキーが更新され、新しい値が出力ストリームに書き出されます。

キーが前のキーと同じである場合は、スペースの後に値を出力ストリームに出力します。

レコードライターのcloseメソッドで、新しいキーが渡されている場合と同じロジックを実行します(タブを出力し、その後に改行を続けます)。

これが理にかなっていることを願っています。注意する必要があるのは、カスタムグループコンパレータがある場合だけです(これにより、レコードライターでの以前のキー比較が失敗します)。また、前のキー追跡変数を更新するときは、キーのディープコピーを作成することを忘れないでください。

于 2012-10-11T03:07:00.823 に答える