2009-09-26 7 views
51

Ich arbeite an einem Projekt mit Hadoop und es scheint, Java nativ zu integrieren und Streaming-Unterstützung für Python bereitzustellen. Gibt es einen erheblichen Einfluss auf die Leistung, wenn es darum geht, eines auszuwählen? Ich bin früh genug in dem Prozess, in dem ich in beide Richtungen gehen kann, wenn es einen signifikanten Leistungsunterschied auf die eine oder andere Weise gibt.Java vs Python auf Hadoop

+0

Es gab dieses Jahr eine Sitzung auf Hadoop bei DEFCON. Sie zeigten Python überraschend gut, schienen aber eine E/A-gebundene Aufgabe zu erledigen. Mein Verständnis ist, dass die Integration mit Python einen separaten Prozess startet und Daten als Text streamt. Abhängig von der Aufgabe kann dies ein Problem sein oder auch nicht. –

+0

Wenn ein Map/Reduce-Prozess lange dauern kann, um einen Schlüssel zu verarbeiten, hat das Streaming möglicherweise andere Probleme. Ein systemeigener Java-Mapper/Reducer kann einen Heartbeat senden, um den Jobtracker zu benachrichtigen, aber ein Streaming-Mapper/Reducer verfügt nicht über diese Fähigkeit. – phsiao

+5

Dies hängt im Allgemeinen davon ab, ob Ihre Aufgabe IO- oder CPU-gebunden ist. IMO in IO gebundenen Aufgaben gibt es keinen großen Unterschied, welche Sprache Sie verwenden werden. Aber für CPU-gebundene Aufgaben, wenn Sie alle Macht wollen, können Sie für Java gehen, wenn Sie einige% Energie für schnellere Entwicklungszeit sparen können, gehen Sie für Python. – wlk

Antwort

13

Java ist weniger dynamisch als Python und es wurde mehr Aufwand in seine VM investiert, was es zu einer schnelleren Sprache macht. Python wird auch von seinem Global Interpreter Lock zurückgehalten, was bedeutet, dass es Threads eines einzelnen Prozesses nicht auf einen anderen Core schieben kann.

Ob dies einen signifikanten Unterschied macht, hängt davon ab, was Sie vorhaben. Ich vermute, dass beide Sprachen für Sie arbeiten werden.

+6

Python hat jedoch sehr schöne Multiprozess-Unterstützung für mehrere Kerne – cobbal

+0

Ich hörte, dass die globale Interpreter-Sperre die Multi-Core-Unterstützung fast eine Wäsche gemacht hat, aber ich erinnere mich nicht an den genauen Ort, den ich hörte, also nimm es mit einem Korn aus Salz. –

+2

Das Multi-Core-Prozess-Zeug kann mit dem parallelen Python-Modul verwendet werden, mit dem Sie auch Prozesse auf andere Maschinen in einem Cluster übertragen können. Sehr ordentlich und einfach. – whatnick

24

Mit Python werden Sie wahrscheinlich schneller entwickeln und mit Java wird definitiv schneller laufen.

Google "benchmarksgame" wenn Sie einige sehr genaue Geschwindigkeitsvergleiche zwischen allen populären Sprachen sehen wollen, aber wenn ich mich richtig erinnere, sprechen Sie 3-5x schneller.

Das heißt, dass heutzutage nur wenige Dinge Prozessorgebunden sind, also wenn du das Gefühl hast, dass du dich besser mit Python entwickeln würdest, dann mach es!


In Antwort auf einen Kommentar (wie java schneller als Python sein kann):

Alle Sprachen werden unterschiedlich verarbeitet. Java ist nach C & C++ das schnellste (das kann so schnell oder bis zu 5x schneller als Java sein, scheint aber durchschnittlich 2x schneller zu sein). Der Rest ist 2-5 + mal langsamer. Python ist eines der schnellsten nach Java. Ich nehme an, dass C# ungefähr so ​​schnell ist wie Java oder vielleicht schneller, aber das Benchmarkspiel hatte nur Mono (was etwas langsamer war), weil es nicht unter Windows läuft.

Die meisten dieser Behauptungen basieren auf der computer language benchmarks game, die tendenziell ziemlich fair ist, weil Befürworter von/Experten in jeder Sprache den Test in ihrer spezifischen Sprache zwicken, um sicherzustellen, dass der Code zielgerichtet ist. Zum Beispiel zeigt alle Tests mit Java vs C++ und Sie können sehen, die Geschwindigkeitsbereiche von etwa gleich zu Java ist 3x langsamer (erste Spalte ist zwischen 1 und 3), und Java verwendet viel mehr Speicher!

Jetzt this page zeigt Java vs Python (aus der Sicht von Python). So reichen die Geschwindigkeiten von Python, das 2x langsamer als Java ist, bis zu 174x langsamer, Python schlägt Java jedoch in der Regel in Code-Größe und Speicherauslastung.

Ein weiterer interessanter Punkt hier - Tests, die eine Menge Speicher zugewiesen, tatsächlich durchgeführt Java auch deutlich besser als Python in Speichergröße. Ich bin mir ziemlich sicher, dass Java normalerweise wegen des Overheads der VM Speicher verliert, aber sobald das ausfällt, ist Java wahrscheinlich effizienter als die meisten (wieder, außer den C's).

Dies ist Python 3 übrigens, die andere Python-Plattform getestet (nur Python genannt) verkleidet viel schlechter. Wenn Sie wirklich wissen wollten, wie es schneller ist, ist die VM erstaunlich intelligent. Es kompiliert die Sprache nach dem Ausführen des Codes maschinell, so dass es weiß, was die wahrscheinlichsten Codepfade sind und für sie optimiert. Speicherzuweisung ist eine Kunst - wirklich nützlich in einer OO-Sprache. Es kann einige erstaunliche Laufzeitoptimierungen durchführen, die keine Sprache ohne VM möglich ist.Wenn er dazu gezwungen wird, kann er in einem ziemlich kleinen Speicherbedarf ausgeführt werden und ist eine Sprache der Wahl für eingebettete Geräte zusammen mit C/C++.

Ich arbeitete an einem Signalanalysator für Agilent (denke teure O-Scope), wo fast das ganze Ding (abgesehen von der Stichprobe) in Java gemacht wurde. Dazu gehört das Zeichnen des Bildschirms einschließlich der Ablaufverfolgung (AWT) und die Interaktion mit den Steuerelementen.

Derzeit arbeite ich an einem Projekt für alle zukünftigen Kabelboxen. Der Guide wird zusammen mit den meisten anderen Apps in Java geschrieben.

Warum wäre es nicht schneller als Python?

+0

Wie kann Java schneller als Python sein? Gibt es dazu einen Auszug? Vielen Dank. –

+0

Denken Sie daran, dass mehr von den Java-Programmen konvertiert worden sein könnte, um Quadcore zu verwenden - also schauen Sie sich auch die Messungen mit einem Kern an - http://shootout.alioth.debian.org/u32/index. php – igouy

+0

Interessant. Ich hatte mir das schlechteste Java-Programm angesehen (das Tree-Programm) und festgestellt, dass es kein Multi-Threading-Programm war, aber Sie haben Recht - viele andere Sprachen machen eine überraschende Show im Singlethread-Modus. Kostenlos Pascal ??? Ada ??? Hmpf –

14

Sie können Hadoop mapreduce-Umwandlungen entweder als "Streaming" oder als "benutzerdefiniertes jar" schreiben. Wenn Sie Streaming verwenden, können Sie Ihren Code in jeder beliebigen Sprache schreiben, einschließlich Python oder C++. Ihr Code wird nur von STDIN lesen und an STDOUT ausgeben. Bei Hadoop-Versionen vor 0.21 wurde das Hadoop-Streaming jedoch dazu verwendet, nur Text - nicht binär - in Ihre Prozesse zu streamen. Daher müssen Ihre Dateien Textdateien sein, es sei denn, Sie führen selbst einige funkige Kodierungstransformationen durch. Aber jetzt scheint es eine patch wurde hinzugefügt, die jetzt die Verwendung von Binärformaten mit Hadoop-Streaming erlaubt.

Wenn Sie ein "benutzerdefiniertes jar" verwenden (dh Sie haben Ihren Mapreduce-Code in Java oder Scala mit Hilfe der hadoop-Bibliotheken geschrieben), haben Sie Zugriff auf Funktionen, mit denen Sie binär (binär serialisieren) eingeben und ausgeben können Ihre Streaming-Prozesse (und speichern Sie die Ergebnisse auf der Festplatte). So werden zukünftige Läufe viel schneller (abhängig davon, wie viel Ihr Binärformat kleiner als Ihr Textformat ist).

Wenn also Ihr Hadoop-Job E/A-gebunden ist, wird der "benutzerdefinierte Jar" -Ansatz schneller sein (da beide Java schneller sind als frühere Poster gezeigt haben und das Lesen von der Festplatte auch schneller ist).

Aber Sie müssen sich fragen, wie wertvoll Ihre Zeit ist. Ich finde mich mit python viel produktiver, und das Schreiben von map-reduce, das STDIN liest und in STDOUT schreibt, ist wirklich unkompliziert. Also würde ich persönlich empfehlen, die Python-Route zu gehen - selbst wenn Sie die binären Encoding-Sachen selbst herausfinden müssen. Da hadoop 0.21 nicht-utf8-Byte-Arrays behandelt, und da es eine binäre (Byte-Array) Alternative für Python (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/) gibt, die zeigt, dass der Python-Code nur etwa 25% langsamer ist als der Java-Code "custom jar", I würde definitiv die Python-Route gehen.