2009-09-26 30 views
51

Pracuję nad projektem wykorzystującym Hadoop i wydaje się on natywnie zawierać Java i zapewnia obsługę przesyłania strumieniowego dla Pythona. Czy wybór jednego z nich ma wpływ na wydajność? Jestem wystarczająco wcześnie w procesie, w którym mogę iść w obie strony, jeśli istnieje znacząca różnica w wydajności w taki czy inny sposób.Java vs Python na Hadoop

+0

W tym roku odbyła się sesja na temat Hadoop w DEFCON. Pokazali, że jakiś Python działa zaskakująco dobrze, ale wydaje się, że wykonuje zadanie związane z I/O. Rozumiem, że integracja z Pythonem polega na uruchomieniu osobnego procesu i przesyłaniu danych strumieniowych w postaci tekstu. W zależności od zadania może to być problem, ale nie musi. –

+0

Jeśli proces mapowania/zmniejszania może zająć dużo czasu w celu przetworzenia klucza, przesyłanie strumieniowe może mieć inne problemy. Natywny program odwzorowujący/reduktor Java może wysłać bicie serca, aby powiadomić jobtracker, ale program odwzorowujący/reduktor transmisji strumieniowej nie ma takiej możliwości. – phsiao

+5

Zasadniczo zależy to od tego, czy twoje zadanie jest ograniczone do IO czy CPU. IMO w zadaniach związanych z IO nie ma dużej różnicy w używanym języku. Ale jeśli chodzi o zadania związane z CPU, jeśli chcesz, aby cała moc była dostępna dla Javy, jeśli możesz zaoszczędzić trochę mocy, aby szybciej się rozwijać, przejdź do Pythona. – wlk

Odpowiedz

13

Java jest mniej dynamiczna niż Python i więcej wysiłku włożono w jej VM, dzięki czemu jest szybszym językiem. Python jest również powstrzymywany przez Globalną Blokadę Interpretera, co oznacza, że ​​nie może przepchnąć nici jednego procesu na inny rdzeń.

To, czy powoduje jakąkolwiek istotną różnicę, zależy od tego, co zamierzasz zrobić. Podejrzewam, że oba języki będą działać dla ciebie.

+6

Python ma jednak bardzo dobrą obsługę wieloprocesową dla wielu rdzeni – cobbal

+0

Słyszałem, że globalna blokada interpretera sprawiła, że ​​wielordzeniowe wsparcie prawie stało się praniem, ale nie pamiętam dokładnego miejsca, w którym to usłyszałem, więc weź to z ziarnem z soli. –

+2

Wielordzeniowe procesy mogą być używane z modułem Pythona równoległego, który umożliwia również przekazywanie procesów do innych komputerów w klastrze. Bardzo schludny i łatwy. – whatnick

24

Z Pythonem zapewne rozwiniesz się szybciej, a Java będzie działać zdecydowanie szybciej.

Google "benchmarksgame", jeśli chcesz zobaczyć bardzo dokładne porównanie prędkości pomiędzy wszystkimi popularnymi językami, ale jeśli dobrze pamiętam, mówisz o 3-5x szybciej.

To powiedziawszy, obecnie wiele rzeczy jest związanych z procesorem, więc jeśli masz wrażenie, że lepiej poradzisz sobie z Pythonem, musisz to zrobić!


W odpowiedzi na komentarz (jak można java być szybszy niż Python):

Wszystkie języki są przetwarzane w inny sposób. Java jest najszybsza po C & C++ (która może być tak szybka lub do 5 razy szybsza niż java, ale wydaje się przeciętnie około 2x szybciej). Reszta trwa od 2 do 5 razy wolniej. Python jest jednym z szybszych po Javie. Zgaduję, że C# jest tak szybki jak Java lub może szybszy, ale benchmarki miały tylko Mono (który był odrobinę wolniejszy), ponieważ nie uruchamiały go w systemie Windows.

Większość z tych roszczeń jest oparta na computer language benchmarks game, która wydaje się być całkiem sprawiedliwa, ponieważ zwolennicy/eksperci w każdym języku dostosowują test napisany w ich języku, aby mieć pewność, że kod jest dobrze ukierunkowany.

Na przykład, this pokazuje wszystkie testy z Javą kontra C++ i można zauważyć, że zakresy prędkości od około równej java są 3 razy wolniejsze (pierwsza kolumna zawiera się między 1 a 3), a java zużywa znacznie więcej pamięci!

Teraz this page pokazuje Javę kontra Pythona (z punktu widzenia Pythona). Więc prędkości wahają się od python jest 2 razy wolniejsze niż Java do 174x wolniej, python generalnie bije java w wielkości kodu i wykorzystania pamięci chociaż.

Innym interesującym punktem tutaj - testy, które przydzieliły dużo pamięci, Java faktycznie wykonała znacznie lepiej niż Python w wielkości pamięci. Jestem prawie pewien, że java zwykle traci pamięć ze względu na obciążenie VM, ale kiedy to powoduje, java jest prawdopodobnie bardziej wydajna niż większość (ponownie, z wyjątkiem C).

To jest Python 3 przy okazji, inne testowane platformy Pythona (zwane po prostu Pythonem) znacznie gorsze.

Jeśli naprawdę chcesz wiedzieć, jak , jak jest szybszy, VM jest niezwykle inteligentny. Kompiluje się do języka maszyny PO uruchomieniu kodu, więc wie, jakie są najbardziej prawdopodobne ścieżki kodu i optymalizuje je. Alokacja pamięci jest sztuką - naprawdę przydatna w języku OO. Może wykonywać niesamowite optymalizacje w czasie wykonywania, których nie potrafi żaden język inny niż VM.Po wymuszeniu może działać na dość małym śladzie pamięci i jest językiem z wyboru dla urządzeń wbudowanych wraz z C/C++.

Pracowałem nad Signal Analyzer dla Agilent (pomyśl o drogim o-scope), w którym prawie wszystko (poza próbkowaniem) zostało wykonane w Javie. Obejmuje to rysowanie ekranu zawierającego ślad (AWT) i interakcję z kontrolkami.

Obecnie pracuję nad projektem dla wszystkich przyszłych skrzynek kablowych. Przewodnik wraz z większością innych aplikacji będzie napisany w Javie.

Dlaczego nie byłaby szybsza niż Python?

+0

Jak Java może być szybsza od Pythona? czy jest w tym jakiś fragment? dzięki. –

+0

Nie odbierając podsumowania, należy pamiętać, że większa liczba programów Java mogła zostać przekonwertowana na quadcore - więc spójrz również na jeden podstawowy pomiar - http://shootout.alioth.debian.org/u32/index. php – igouy

+0

Interesujące. Spojrzałem na najgorszy program java (ten na drzewie) i zauważyłem, że nie jest on wielowątkowy, ale masz rację - wiele innych języków tworzy zaskakujący program w trybie jednowątkowym. Darmowy Pascal ??? Ada ??? Hmph –

14

Możesz zapisać transformacje mapy Hadoop jako "streaming" lub jako "niestandardowy jar". Jeśli korzystasz z przesyłania strumieniowego, możesz napisać swój kod w dowolnym języku, w tym w języku Python lub C++. Twój kod odczyta tylko ze STDIN i wyświetli STDOUT. Jednak w wersjach hadoopów przed 0.21, streaming hadoopu był używany tylko do przesyłania tekstu - nie binarnego - do procesów. Dlatego twoje pliki musiały być plikami tekstowymi, chyba że sam wykonasz jakieś funkcyjne transformacje kodowania. Ale teraz wydaje się, że dodano patch, który teraz pozwala na użycie formatów binarnych z streamingiem hadoopów.

Jeśli używasz "niestandardowego słoika" (tj. Zapisałeś swój kod mapreduce w Javie lub Scali przy użyciu bibliotek hadoop), będziesz miał dostęp do funkcji, które pozwalają na wprowadzanie i wyprowadzanie binarnych (serializacja w binarnym) z Twoje procesy strumieniowania (i zapisać wyniki na dysku). Tak więc przyszłe przebiegi będą znacznie szybsze (w zależności od tego, jak bardzo twój format binarny jest mniejszy niż format tekstu).

Jeśli twoja robota ma być połączona z I/O, wówczas metoda "niestandardowego słoika" będzie szybsza (ponieważ obie Java jest szybsza, jak pokazały poprzednie plakaty, a odczyt z dysku będzie również szybszy).

Ale musisz zadać sobie pytanie, jak cenny jest Twój czas. Z Pythonem jestem znacznie bardziej produktywny, a pisanie na mapach - zmniejszenie, które czyta STDIN i zapisywanie do STDOUT jest naprawdę proste. Tak więc osobiście polecam pójście na trasę Pythona - nawet jeśli sam musisz wymyślić kodowanie binarne. Ponieważ hadoop 0.21 obsługuje tablice bajtów innych niż utf8, a ponieważ istnieje binarna (tablica bajtowa) alternatywa dla Pythona (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/), która pokazuje, że kod Pythona jest tylko o około 25% wolniejszy niż kod Javy "niestandardowego słoika", na pewno pójdę drogą Pythona.