5

2012 年 11 月 21 日更新:

プロパティ mapred.child.java.opts を -Xmx512m に設定することで問題が解決しました。これより前に、core-site.xml で HADOOP_HEAPSIZE を 2000 に設定していましたが、これは役に立ちませんでした。プログラムがローカルで動作する理由はまだわかりませんが、分散では動作しません。すべての答えをありがとう。

Hadoop 1.0.3 を使用しています。クラスターは 3 台のマシンで構成され、すべてのマシンで Ubuntu Linux 12.04 LTS が実行されています。2 台のマシンには 12 GB の RAM があり、3 台目のマシンには 4 GB の RAM があります。DistributedCache 経由で約 40 MB のローカル ファイルを読み込んでいます。私のプログラムは、ローカル環境 (ローカル/スタンドアロン モード) で完全に動作します。ただし、Hadoop クラスター (完全分散モード) で実行すると、同じ 40 MB のファイルで "OutOfMemoryError: Java heap space" が発生します。ファイルがそれほど大きくないので、なぜこれが起こるのかわかりません。これはコードです:

    public static class MapClass extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> {
    // ...
    private HashMap<String, String> urlTrad = new HashMap<String, String>();
    // ...
    @Override
    public void configure(JobConf job) {
        Path[] urlsFiles = new Path[0];
        BufferedReader fis;

        try {
            urlsFiles = DistributedCache.getLocalCacheFiles(job);
            fis = new BufferedReader(new FileReader(
                    urlsFiles[0].toString()));
            String pattern;
            while ((pattern = fis.readLine()) != null) {
                String[] parts = pattern.split("\t");
                urlTrad.put(parts[0], parts[1]);
            }
            fis.close();

        } catch (IOException ioe) {
            System.err
                    .println("Caught exception while parsing the cached file '"
                    + urlsFiles[0]
                    + "' : "
                    + StringUtils.stringifyException(ioe));
        }
    }
    // ...

事前に感謝します。

4

1 に答える 1

1

プロパティ mapred.child.java.opts を -Xmx512m に設定することで問題が解決しました。これより前に、core-site.xml で HADOOP_HEAPSIZE を 2000 に設定していましたが、これは役に立ちませんでした。プログラムがローカルで動作する理由はまだわかりませんが、分散では動作しません。

于 2014-02-17T12:10:48.980 に答える