4

小さな (3KB) ランダムに生成されたサンプル データ セットに対して非常に単純な GROUP BY を実行しようとすると、Pig から OutOfMemory 例外が発生します。

豚のスクリプト:

$ cat example.pig
raw =
LOAD 'example-data'
    USING PigStorage()
    AS (thing1_id:int,
        thing2_id:int,
        name:chararray,
        timestamp:long);

grouped =
GROUP raw BY thing1_id;

DUMP grouped;

データ:

$ cat example-data
281906  13636091    hide    1334350350
174952  20148444    save    1334427826
1082780 16033108    hide    1334500374
2932953 14682185    save    1334501648
1908385 28928536    hide    1334367665
[snip]

$ wc example-data
 100  400 3239 example-data

どうぞ:

$ pig -x local example.pig

[snip]

java.lang.OutOfMemoryError: Java heap space
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:949)
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:674)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)

[snip]

そしていくつかの追加情報:

$ apt-cache show hadoop | grep Version
Version: 1.0.2

$ pig --version
Apache Pig version 0.9.2 (r1232772) 
compiled Jan 17 2012, 23:49:20

$ echo $PIG_HEAPSIZE
4096

この時点で、3 kB のテキストでヒープがいっぱいになる理由が見当たらないので、何か根本的に間違ったことをしているに違いないと感じています。

4

3 に答える 3

1

これを確認してください:[リンク] http://sumedha.blogspot.in/2012/01/solving-apache-pig-javalangoutofmemorye.html

ニール、その通りです。次のようなことを説明させてください: bin/pig スクリプト ファイルでは、ソース コードは次のとおりです。

JAVA_HEAP_MAX=-Xmx1000m

# デフォルトの引数を上書きするかもしれない環境変数をチェック

if [ "$PIG_HEAPSIZE" != "" ]; 次に JAVA_HEAP_MAX="-Xmx""$PIG_HEAPSIZE""m" fi

-Xmx スイッチのみを使用して Java_heap_size を最大値 (「x」) に設定していますが、このスクリプトのオーバーライドが機能しない理由がわかりませんでした。それが理由です。リンクで指定されています。この問題が発生する理由を確認する時間がありませんでした。アイデアがある場合は、ここに投稿してください。

于 2012-04-15T21:49:21.180 に答える
0

MapTask.javaの次のコードでジョブが失敗しています。

931   final float recper = job.getFloat("io.sort.record.percent",(float)0.05);
932   final int sortmb = job.getInt("io.sort.mb", 100);
...
945   // buffers and accounting
946   int maxMemUsage = sortmb << 20;
947   int recordCapacity = (int)(maxMemUsage * recper);
948   recordCapacity -= recordCapacity % RECSIZE;
949   kvbuffer = new byte[maxMemUsage - recordCapacity];

io.sort.mbしたがって、 andの構成値を確認しio.sort.record.percent、上記のロジックに従って、maxMemUsage - recordCapacityこれが構成済みの JVM ヒープ サイズ (4096 MB) に近いか大きいかを確認することをお勧めします。

于 2012-04-15T23:33:28.377 に答える
0

私はしばらくそれをいじり、hadoop/pig の debian パッケージから生の tarball に切り替えることになり、問題はなくなりました。それをどうすればいいのかわからない:)

于 2012-04-16T00:20:15.920 に答える