1

FTP サーバーからファイルを読み取って に書き込むコードがありますHDFS。入力のプロパティを としてInputFormatReader設定するカスタマイズを実装しましたが、これにより次のエラーが発生します。isSplitablefalse

INFO mapred.MapTask: Record too large for in-memory buffer

データの読み取りに使用するコードは

Path file = fileSplit.getPath();
                FileSystem fs = file.getFileSystem(conf);
                FSDataInputStream in = null;
                try {
                    in = fs.open(file);


                    IOUtils.readFully(in, contents, 0, contents.length);

                    value.set(contents, 0, contents.length);

                }

java heap space error入力ファイルを分割せずに回避する方法はありますか? またはisSplitable true、ファイルを読み取るにはどうすればよいですか?

4

2 に答える 2

2

私が正しければ、ファイル全体をメモリにロードします。Hadoopとは関係ありません-Javaでそれを行うことはできず、十分なメモリがあることを確認してください。
いくつかの合理的なチャンクを定義し、それを「レコード」にすることをお勧めします

于 2013-01-01T18:24:38.747 に答える
1

Map 関数が実行されている間、hadoop は MapOutputBuffer と呼ばれるメモリ内バッファーに出力レコードを収集します。

このメモリー内バッファーの合計サイズは io.sort.mb プロパティによって設定され、デフォルトは 100 MB です。

mapred-site.xml でこのプロパティ値を増やしてみてください

于 2012-12-31T16:12:00.790 に答える