2012-02-17 6 views
6

Zaczynam bawić się z hadoop (ale nie mam dostępu do klastra, więc po prostu bawię się w trybie niezależnym). Moje pytanie brzmi: kiedy są ustawione klastry, w jaki sposób zadania są dystrybuowane i czy baza kodów może zostać przeniesiona do nowych węzłów?Czy Hadoop może dystrybuować zadania i bazę kodów?

Idealnie chciałbym uruchomić duże zadania wsadowe i jeśli potrzebuję więcej mocy, dodać nowe węzły do ​​klastra, ale nie jestem pewien, czy będę musiał skopiować ten sam kod, który działa lokalnie, czy zrobić coś specjalnego, więc podczas pracy wsadowej mogę dodać pojemność. Pomyślałem, że mogę przechowywać mój codebase na HDFS i mieć go uruchomione lokalnie, aby uruchomić za każdym razem, gdy go potrzebuję, ale to nadal oznacza, że ​​potrzebuję jakiegoś początkowego skryptu na serwerze i muszę najpierw uruchomić go ręcznie.

Wszelkie sugestie lub porady dotyczące tego, czy jest to możliwe, byłyby wspaniałe!

Dziękuję.

Odpowiedz

7

Po zaplanowaniu zadania mapreduce przy użyciu polecenia hadoop jar, jobtracker ustali, ilu wykonawców map jest potrzebnych do wykonania zadania. Zwykle zależy to od liczby bloków w pliku wejściowym, a liczba ta jest stała, bez względu na to, ile masz węzłów roboczych. Następnie zwerbuje jednego lub więcej tasktrackerów do wykonania swojej pracy.

Słoik aplikacji (wraz z innymi słojami, które są określone za pomocą argumentu -libjars), jest automatycznie kopiowany na wszystkie komputery z tasktrackerami, które są używane do wykonania twoich słoików. Wszystko to jest obsługiwane przez infrastrukturę Hadoop.

Dodanie dodatkowych tasktacków zwiększy równoległość pracy przy założeniu, że istnieją jeszcze nieplanowane zadania mapowe. To, czego nie zrobi, to automatyczne ponowne podzielenie danych wejściowych na równoległość całej dodatkowej pojemności mapy. Więc jeśli masz pojemność mapy równą 24 (przy założeniu 6 maperów na każdym z 4 węzłów danych) i masz 100 zadań mapowania z pierwszym 24 wykonaniem, a dodasz inny węzeł danych, uzyskasz dodatkową prędkość. Jeśli masz tylko 12 zadań mapowania, dodanie maszyn nie pomoże.

Wreszcie należy pamiętać o lokalizacji danych. Ponieważ dane powinny być idealnie przetwarzane na tych samych maszynach, które przechowują je początkowo, dodanie nowych modułów śledzenia zadań niekoniecznie zwiększy proporcjonalną szybkość przetwarzania, ponieważ dane nie będą początkowo lokalne na tych węzłach i będą musiały być kopiowane w sieci.

+0

Dziękuję, świetna odpowiedź. Ma to sens w przypadku języka Java, ale czy jest tak również w przypadku przesyłania strumieni Pythona? – Lostsoul

+2

Z http://hadoop.apache.org/common/docs/r0.15.2/streaming.html#Package+Files+ With+Job+Submissions: "Możesz określić dowolny plik wykonywalny jako element odwzorowujący i/lub reduktor. pliki wykonywalne nie muszą wcześniej istnieć na komputerach w klastrze, ale jeśli nie, musisz użyć opcji "-file", aby powiedzieć frameworkowi, aby spakowała pliki wykonywalne w ramach przesyłania zadań. " Wszystko powyżej dotyczące dodawania tasktrackerów ma również zastosowanie do przesyłania strumieniowego. –

0

Przed przystąpieniem do budowy klastra Hadoop sugerowałbym grę z Hadoopem przy użyciu Amazon's Elastic MapReduce.

W odniesieniu do problemu, który próbujesz rozwiązać, nie jestem pewien, czy Hadoop jest odpowiednim rozwiązaniem. Hadoop jest przydatny w przypadku prostych zadań równoległych, które można przetwarzać równolegle: parsować tysiące (lub więcej) dokumentów, sortować, ponownie gromadzić dane). Hadoop Streaming pozwoli ci stworzyć mappers i reduktor za pomocą dowolnego języka, który chcesz, ale wejścia i wyjścia muszą mieć stały format. Istnieje wiele zastosowań, ale moim zdaniem kontrola procesu nie była jednym z celów projektowych.

[EDYTOWANIE] Być może ZooKeeper jest bliżej tego, czego szukasz.

+0

Mam zamiar. Chcę tylko zrozumieć ten proces, zanim zapłacę Amazonowi. – Lostsoul

+0

Ceny Amazon mogą być nieco mylące. Uruchomiłem małą mapę zmniejszającą liczbę miejsc pracy (mały zestaw danych, kilka węzłów), a każdy z nich wynosił 0,25 USD. – Frank

0

Możesz dodać pojemność do zadania wsadowego, jeśli chcesz, ale musi być prezentowana jako możliwość w twojej bazie kodów. Na przykład, jeśli masz program odwzorowujący, który zawiera zestaw danych wejściowych, które chcesz przypisać wiele węzłów, aby wziąć nacisk, możesz. Wszystko to można zrobić, ale nie z domyślną instalacją Hadoop.

Obecnie pracuję nad zagnieżdżoną mapą redukującą strukturę, która rozszerza kod bazowy Hadoop i pozwala odradzać więcej węzłów na podstawie danych wejściowych, które otrzymuje mapper lub reduktor. Jeśli jesteś zainteresowany, napisz do mnie, a ja wytłumaczę więcej.

Ponadto, jeśli chodzi o opcję -libjars, działa to tylko dla węzłów przypisanych przez jobtracker zgodnie z instrukcją tworzonego zadania. Jeśli więc podasz 10 mapperów, -libjar skopiuje tam twój kod. Jeśli chcesz zacząć od 10, ale udaj się w górę, dodane węzły nie będą miały kodu.

Najprostszym sposobem obejścia tego jest dodanie słownika do ścieżki klasy skryptu hadoop-env.sh. To będzie zawsze, gdy rozpocznie się kopiowanie zadania do wszystkich węzłów, które są rozpoznawane przez klaster.

1

Nie zgadzam się z odpowiedzią Daniela. Przede wszystkim dlatego, że jeśli "przy rozpoczęciu zadania, kod JAR zostanie skopiowany do wszystkich węzłów, o których klaster wie" jest prawdziwe, to nawet jeśli użyjesz 100 mapperów i istnieje 1000 węzłów, kod dla wszystkich zadań będzie zawsze kopiowany do wszystkie węzły. Nie ma sensu.

Zamiast tego, odpowiedź Chrisa Shaina ma więcej sensu, gdy za każdym razem, gdy JobScheduler na JobTracker wybiera zadanie do wykonania i identyfikuje zadanie, które ma być wykonane przez dany datanod, wtedy w jakiś sposób przekazuje on tasktracker skąd kopiować bazę kodów.

Początkowo (przed rozpoczęciem zadania mapreduce) baza kodowa została skopiowana do wielu lokalizacji zgodnie z parametrem mapred.submit.replication. Dlatego tasktracker może kopiować bazę kodów z kilku lokalizacji, z których lista może być wysłana do niego przez jobtracker.