6

Apache Pig バージョン 0.10.1.21 (報告済み)、CentOS リリース 6.3 (最終版)、jdk1.6.0_31 (Virtualbox 上の Hortonworks Sandbox v1.2、3.5 GB RAM) を使用

$ cat data.txt
11,11,22
33,34,35
47,0,21
33,6,51
56,6,11
11,25,67

$ cat GrpTest.pig
A = LOAD 'data.txt' USING PigStorage(',') AS (f1:int,f2:int,f3:int);
B = GROUP A BY f1;
DESCRIBE B;
DUMP B;

pig -x local GrpTest.pig

[Thread-12] WARN  org.apache.hadoop.mapred.JobClient - No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
[Thread-12] INFO  org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1
[Thread-13] INFO  org.apache.hadoop.mapred.Task -  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@19a9bea3
[Thread-13] INFO  org.apache.hadoop.mapred.MapTask - io.sort.mb = 100
[Thread-13] WARN  org.apache.hadoop.mapred.LocalJobRunner - job_local_0002
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)
[main] ERROR org.apache.pig.tools.pigstats.PigStatsUtil - 1 map reduce job(s) failed!
[main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias B

java.lang.OutOfMemoryError: Java heap spaceエラーは、ローカル モードで実行される pig スクリプトで GROUP または JOIN を使用するたびに発生します。HDFS で mapreduce モードでスクリプトを実行すると、エラーは発生しません。

質問 1 : データ サンプルが非常に小さく、ローカル モードが HDFS モードよりも少ないリソースを使用するはずなのに、OutOfMemory エラーが発生するのはなぜですか?

質問 2 : ローカル モードで GROUP または JOIN を使用して小さな豚のスクリプトを正常に実行するためのソリューションはありますか?

4

2 に答える 2

0

その理由は、ローカルで Java に割り当てられるメモリが Hadoop クラスタ マシンよりも少ないためです。これは実際、Hadoop ではかなり一般的なエラーです。これは通常、Pig で非常に長いリレーションを作成したときに発生します。これは、Pig が常にリレーション全体をメモリにロードする必要があり、いかなる方法でも遅延ロードしたくないために発生します。

GROUP BYグループ化するタプルが多くのレコードにわたって非スパースであるようなことをすると、基本的に個々のリレーションをまとめて 1 つに詰め込んでいるため、少なくとも一時的に単一の長いリレーションを作成することになります。単一の長い関係。いずれかの時点で単一の非常に長いリレーションを作成しないようにコードを変更する (つまり、よりまばらなものでグループ化する) か、Java で使用できるメモリを増やします。

于 2013-05-15T03:29:33.677 に答える