2012-03-28 27 views
14

Używam wasoop w konfiguracji pojedynczej maszyny, tylko lokalna, i szukam ładnego, bezbolesnego sposobu debugowania mappers i reduktorów w czasie zaćmienia. Eclipse nie ma problemu z uruchomieniem zadań mapreduce. Jednak po przejściu do debugowania pojawia się następujący błąd:Jak debugować hadoop mapreduce zadania od Eclipse?

12/03/28 14:03:23 WARN mapred.JobClient: Brak pliku JAR zadania. Klasy użytkowników nie można znaleźć. Zobacz JobConf (Class) lub JobConf # setJar (String).

Okej, więc robię badania. Najwyraźniej powinienem użyć zdalnego debugowania Eclipse siłownia, a dodać do moich hadoop-env.sh:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000 

to zrobić i mogę przejść przez mojego kodu w Eclipse. Jedynym problemem jest to, że z powodu "suspend = y", nie mogę użyć komendy "hadoop" z wiersza poleceń, aby zrobić coś w stylu kolejki zadań; wisi, wyobrażam sobie, ponieważ czeka na dołączenie debuggera. Ponadto, nie mogę uruchomić "powłoki hbase", gdy jestem w tym trybie, prawdopodobnie z tego samego powodu.

W zasadzie, jeśli chcę, aby przerzucał między trybem debugowania i "trybem normalnym", muszę zaktualizować hadoop-env.sh i ponownie uruchomić komputer. Poważny ból. Więc mam kilka pytań:

  1. Czy jest łatwiejszy sposób wykonywania zadań mapreduce debugowania w zaćmieniu?

  2. W jaki sposób środowisko Eclipse może uruchamiać zadania mapreduce, ale do debugowania potrzebuję zdalnego debugowania?

  3. Czy istnieje sposób, aby powiedzieć hadoop używać zdalnego debugowania dla zadań mapreduce, ale działać w trybie normalnym dla wszystkich innych zadań? (taki jak "kolejka hadoopów" lub "powłoka hbase").

  4. Czy istnieje łatwiejszy sposób przełączania konfiguracji hadoop-env.sh bez ponownego uruchamiania komputera? hadoop-env.sh nie jest domyślnie wykonywany.

  5. To jest bardziej ogólne pytanie: co dokładnie dzieje się, gdy uruchamiam Mule w trybie tylko lokalnym? Czy są jakieś procesy na moim komputerze, które są "zawsze włączone" i wykonują zlecenia typu hadoop? Czy też hadoop robi tylko rzeczy, gdy uruchamiam komendę "hadoop" z wiersza poleceń? Co robi zaćmienie, gdy uruchamiam zadanie mapreduce od Eclipse? Musiałem odwołać się do hadoop-core w moim pom.xml, aby mój projekt działał. Czy zadania Eclipse są przesyłane do mojej zainstalowanej instancji hadoop, czy w jakiś sposób działa to wszystko z poziomu hadoop-core-1.0.0.jar w moim maven cache?

Oto moje główne klasy:

public class Main { 
     public static void main(String[] args) throws Exception {  
     Job job = new Job(); 
     job.setJarByClass(Main.class); 
     job.setJobName("FirstStage"); 

     FileInputFormat.addInputPath(job, new Path("/home/sangfroid/project/in")); 
     FileOutputFormat.setOutputPath(job, new Path("/home/sangfroid/project/out")); 

     job.setMapperClass(FirstStageMapper.class); 
     job.setReducerClass(FirstStageReducer.class); 

     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(Text.class); 

     System.exit(job.waitForCompletion(true) ? 0 : 1); 
     } 
} 
+3

Jako poza tym, jeśli próbujesz debugować swoją logikę mapper/reduktor, powinieneś zajrzeć do używania MRUnit (http://www.cloudera.com/blog/2009/07/debugging-mapreduce-programs-with-mrunit/) –

+0

Jako że @Chris White sugeruje, aby zacząć od MRUnit, aby przetestować Map/Reduce, logika to dobry pomysł: http://incubator.apache.org/projects/mrunit.html –

Odpowiedz

1

Oprócz zalecanego MRUnit lubię debugowania z Eclipse, jak również. Mam główny program. Tworzy konfigurację i wykonuje bezpośrednio zadanie MapReduce. Właśnie debuguję za pomocą standardowych konfiguracji debugowania Eclipse. Ponieważ w mojej specyfikacji mvn umieściliśmy słoiki z półmiskami, mam całą ścieżkę per se w mojej ścieżce klasowej i nie muszę jej uruchamiać w stosunku do zainstalowanej wtyczki. Zawsze testuję z małymi zestawami danych w lokalnych katalogach, aby ułatwić.Wartości domyślne konfiguracji zachowują się jak samodzielny hadoop (system plików jest dostępny)

+0

Dziękuję za odpowiedź. Ja też mam rdzeń Monoop ustawiony jako zależność w moim POM. Ponieważ tak jest, dlaczego otrzymuję komunikat o błędzie "Brak pliku zestawu zadań"? Czy to dlatego, że dzwonię do pracy.setJarByClass()? Czy możesz przesłać jakiś przykładowy kod? – sangfroid

5

Jedynym sposobem na debugowanie hadoop w Eclipse jest uruchamianie hadoop w trybie lokalnym. Powodem jest to, że każda mapa redukuje zadanie uruchamiane w istniejacej JVM, a gdy nie masz miauczenia w trybie lokalnym, eclipse nie będzie w stanie debugować.

Po ustawieniu trybu lokalnego na tryb hadoop, zamiast używania interfejsu API hdfs (który jest domyślny), system plików hadoop zmienia się na file:///. Tak więc uruchomienie hadoop fs -ls nie będzie poleceniem hdfs, ale bardziej hadoop fs -ls file:///, ścieżką do katalogu lokalnego. Nie działa żaden program JobTracker ani NameNode.

Te blogposts może pomóc:

+0

Witam @Kapil, To co opisałeś jest możliwe w Hadoop 2.4 (z Przędzą itp.). Próbuję uruchomić lokalną pracę w środowisku Zaćmienie z nową wersją i "Nie mogę zainicjować klastra". Sprawdź konfigurację ... ' –

+0

@PedroDusso masz lokalne debugowanie do pracy z Hadoop 2.4+? – erichfw

+0

@erichfw Nigdy nie próbowałem ... Używałem 2.2 w czasie, gdy zadałem to pytanie. –

0

Lubię też debugować za pomocą testów jednostkowych w/MRUnit. Użyję tego w połączeniu z testami atestacyjnymi, co tworzy łatwą wizualizację procesu Zmniejszanie mapy i ułatwia przekazywanie scenariuszy, które się nie udają. Działa również płynnie od zaćmienia.

Na przykład:

HadoopApprovals.verifyMapReduce(new WordCountMapper(), 
         new WordCountReducer(), 0, "cat cat dog"); 

spowoduje wyjście:

[cat cat dog] 
-> maps via WordCountMapper to -> 
(cat, 1) 
(cat, 1) 
(dog, 1) 

-> reduces via WordCountReducer to -> 
(cat, 2) 
(dog, 1) 

tam film o procesie tutaj: http://t.co/leExFVrf

6

dokonać zmian w /bin/hadoop (hadoop-env.sh) skryptu. Sprawdź, jakie polecenie zostało uruchomione. Jeśli polecenie ma wartość jar, należy dodać konfigurację zdalnego debugowania.

if [ "$COMMAND" = "jar" ] ; then 
    exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8999 $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "[email protected]" 
else 
    exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "[email protected]" 
fi 
+0

Nie próbowałem dokładnie tego, ale zastąpiłem $ JAVA przez jdb (próbowałem debugować używając jdb). jdb nigdy nie rozpoznał punktu przerwania, który próbowałem umieścić w miejscu, w którym chciałbym zatrzymać program. Zakładam, że problem polegał na tym, że nie działałem w trybie lokalnym. Jeszcze tego nie próbowałem, ale zakładam, że sugestią Kapila jest to, co muszę przestrzegać. –

+4

Możesz dodać opcje debugowania do zmiennej $ HADOOP_OPTS powłoki i nie musisz modyfikować skryptu hadoop. eksport HADOOP_OPTS = "$ HADOOP_OPTS -Xdebug -Xrunjdwp: transport = dt_socket, serwer = y, adres = 8999" –

2

Debugger Jumbune zrobi to wszystko przy minimalnym wysiłku.

Debugger zapewnia statystykę kontroli przepływu na poziomie kodu dla zadania MapReduce.

Użytkownik może stosować sprawdzania poprawności wyrażeń regularnych lub własne zdefiniowane przez użytkownika klasy sprawdzania poprawności. Zgodnie z zatwierdzeniami, Flow Debugger sprawdza przepływ danych odpowiednio dla programu odwzorowującego i reduktora.

Zapewnia również kompleksowy widok tabeli/wykresu, w którym przepływ rekordów wejściowych jest wyświetlany na poziomie zadania, poziomu MR i poziomu instancji. Niedopasowane klucze/wartości oznaczają liczbę błędnych danych klucza/wartości w wyniku wykonania zadania. Debugger wiertarki dół do kodu, aby zbadać przepływ danych dla różnych liczników pętli i warunków, takich jak if, else-if itp

Jumbune jest open source i dostępne w www.jumbune.org i https://github.com/impetus-opensource/jumbune

Powiązane problemy