2013-05-11 13 views
6

Korzystanie Apache Pig wersja 0.10.1.21 (zgłaszane), CentOS zwolnić 6,3 (Final), jdk1.6.0_31 (The Hortonworks Sandbox v1.2 na VirtualBox z 3,5 GB pamięci RAM)Pig tryb lokalny, grupy lub dołączyć = java.lang.OutOfMemoryError: Java sterty przestrzeń

$ 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 : [email protected] 
[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: przestrzeń sterty Java błąd występuje za każdym razem używam GRO UP lub JOIN w skrypcie świni wykonywanym w trybie lokalnym. Nie ma błędu, gdy skrypt jest wykonywany w trybie mapreduce na HDFS.

Pytanie 1: Dlaczego istnieje OutOfMemory błąd podczas próbka danych jest nikła i tryb lokalny powinien używać mniej zasobów niż tryb HDFS?

Pytanie 2: Czy istnieje rozwiązanie, aby pomyślnie uruchomić małe skrypty świni z GRUPĄ lub DOŁĄCZ w trybie lokalnym?

+0

nigdy nie miałem żadnych kłopotów robi grup lub dołącza w lokalnej mapie tryb zmniejszyć, nawet na bardzo dużych zbiorów danych. .. Wyobrażam sobie, że albo ustawienia twojego JVM są spieprzone, albo twoja lokalna świnia/maczuga ustawiła jakąś maksymalną dozwoloną pamięć na ustawienie 0. Jesteś pewien, że to tylko GRUPA i JOIN, które zawiodły lokalnie? Jeśli używasz dużej ilości pamięci dla programu java niezwiązanego ze świnką, co się dzieje? – DMulligan

+0

Cześć, to jest Sandbox Hortonwords. Kiedy łączę się za pomocą GUI (GUI Hortons HUE, który pozwala uruchomić Pig, Hive przez przeglądarkę internetową na HDFS tego samego piaskownicy). Wszystkie demo działa dobrze z dużo większym zbiorem danych (10 MB). Tak przypuszczam, że JVM obsługuje OK większy ładunek. Jest to oczywiście błąd w trybie lokalnym. Jak tylko pojawi się GROUP lub JOIN, Pig nie działa z błędem OutOfMemory Java. Bez względu na rozmiar próbki danych, powłokę Grunt lub Pig Script. – Polymerase

+0

Nie wiem nic o Hortonwords, ale jeśli robisz zapytanie z DISTINCT lokalnie, czy to działa dobrze? Jest kilka ustawień związanych z Hadoop/świnią dla maksymalnej pamięci dozwolonej dla tasowania, sortowania, łączenia itd. Przypuszczam, że 1 z nich to 0. – DMulligan

Odpowiedz

19

Rozwiązanie: wymuś, aby przydzielić mniej pamięci dla właściwości java io.sort.mb Ustawiłem tutaj na 10 MB i błąd zniknął. Nie wiem, co byłoby najlepsze wartości, ale przynajmniej to pozwalają ćwiczyć składni świnia w trybie lokalnym

$ cat GrpTest.pig 
--avoid java.lang.OutOfMemoryError: Java heap space (execmode: -x local) 
set io.sort.mb 10; 

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

Powodem jest to, że lokalnie przydzielono mniej pamięci do Java niż na maszynach klastra Hadoop. Jest to w rzeczywistości dość powszechny błąd w Hadoop. Dzieje się tak głównie wtedy, gdy w dowolnym momencie tworzysz naprawdę długą relację w Pig i dzieje się tak, ponieważ Pig zawsze chce załadować relację całą do pamięci i nie chce jej leniwie ładować w żaden sposób.

Kiedy robisz coś takiego, jak GROUP BY, gdzie krotka, z którą się grupujesz, nie jest rzadka w wielu rekordach, często kończysz tworzenie pojedynczych długich relacji przynajmniej tymczasowo, ponieważ w zasadzie bierzesz całą masę indywidualnych relacji i wbijając je wszystkie w jedną długą relację. Zmień kod tak, aby nie kończył się tworzenie pojedynczych bardzo długich relacji w dowolnym punkcie (tj. Grupy przez coś bardziej rzadkiego) lub zwiększyć pamięć dostępną dla Javy.

+1

Proszę spojrzeć na mój pierwszy wpis.Cały rozmiar danych użytych w przykładzie jest mniejszy niż 100 bajtów. Innymi słowy, mniej niż długość tego komentarza. Bez względu na sprytność leżących u podstaw instalacji hydraulicznych, nie ma usprawiedliwienia, że ​​nie powiodło się w OutOfMemory, gdy nie ma absolutnie żadnego problemu z pamięcią. Jest to oczywiście błąd. – Polymerase

Powiązane problemy