Hadoop Writable インターフェイスはメソッドに依存します"public void write(DataOutput out)"
。DataOutput インターフェイスの背後にあるように見えますが、Hadoop は DataOutputStream を使用します。これは、カバーの下で単純な配列を使用します。
レデューサーの DataOutput に大量のデータを書き込もうとすると、次のようになります。
原因: java.lang.OutOfMemoryError: 要求された配列サイズが、java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) の java.util.Arrays.copyOf(Arrays.java:3230) で VM 制限を超えています。 ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) で java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140) で java.io.DataOutputStream.write(DataOutputStream.java:107) で java.io.FilterOutputStream.write(FilterOutputStream) .java:97)
システムが要求されたサイズの連続配列を割り当てることができないようです。どうやら、リデューサーが使用できるヒープ サイズを増やしても効果はありません。すでに 84GB (-Xmx84G) になっています。
シリアル化する必要があるオブジェクトのサイズを縮小できない場合 (リデューサーはオブジェクト データを組み合わせてこのオブジェクトを構築するため)、この問題を回避するにはどうすればよいですか?