Java vs Python auf Hadoop
Arbeite ich an einem Projekt mit Hadoop und es scheint nativ zu integrieren, Java und streaming-Unterstützung für Python. Ist, gibt es einen erheblichen performance-Einfluss auf die Wahl einen über den anderen? Ich bin früh genug in den Prozess, wo ich gehen kann oder so, wenn es eine erhebliche performance-Unterschied ein oder andere Weise.
InformationsquelleAutor der Frage jnoss | 2009-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java ist weniger dynamisch als Python und mehr Aufwand wurde in die VM, so dass es ein schneller Sprache. Python ist auch zurückgehalten durch seine Globale Interpreter-Sperre, d.h. es können keine push-threads eines einzelnen Prozesses auf verschiedenen Kern.
Ob diesem macht kein signifikanter Unterschied hängt davon ab, was Sie zu tun beabsichtigen. Ich vermute, dass beide Sprachen für Sie arbeiten.
InformationsquelleAutor der Antwort David Crawshaw
Mit Python wirst du wahrscheinlich schneller entwickeln und mit Java wird definitiv schneller laufen.
Google "benchmarksgame" wenn Sie wollen, um zu sehen, einige sehr genaue Geschwindigkeit Vergleiche zwischen allen gängigen Sprachen, aber wenn ich mich Recht erinnere, sprechen wir über 3-5x schneller.
Sagte, einige Dinge sind Prozessor gebunden in diesen Tagen, so dass, wenn Sie das Gefühl, Sie würde sich besser entwickeln, mit Python haben es!
Antwort zu Kommentar (wie kann java ist schneller als Python):
Alle Sprachen werden unterschiedlich verarbeitet. Java ist über die schnellsten nach C & C++ (kann als schnell oder bis zu 5x schneller als java, aber scheint durchschnittlich etwa 2x schneller). Der rest von 2-5+ mal langsamer. Python ist eine der schneller nach Java. Ich vermute, dass C# ist in etwa so schnell wie Java oder vielleicht schneller, aber die benchmarksgame hatte nur Mono (das war ein bisschen langsamer), weil Sie nicht führen Sie es auf windows.
Meisten dieser Forderungen basieren auf dem computer language benchmarks game die dazu neigt, ziemlich fair, weil die Befürworter/- Experten in jeder Sprache optimieren der test geschrieben in Ihrer spezifischen Sprache, um sicherzustellen, der code ist gut ausgerichtet.
Beispielsweise diese zeigt alle tests mit Java vs c++ und Sie können die Geschwindigkeit im Bereich von etwa gleich java als 3x langsamer (die erste Spalte ist zwischen 1 und 3), und java wesentlich mehr Speicher!
Nun auf dieser Seite zeigt java vs. python (aus der Sicht von Python). Also die Geschwindigkeiten reichen von python wird 2x langsamer als Java, 174 x langsamer, python in der Regel schlägt die java-code-Größe und Speicher-Auslastung, obwohl.
Ein weiterer interessanter Punkt hier--tests, die zugewiesenen viel Speicher, Java tatsächlich ausgeführt hat, deutlich besser als Python in der Speicher-Größe als auch. Ich bin mir ziemlich sicher, dass java in der Regel verliert Speicher, da der overhead der VM, aber sobald diese Faktoren aus, java ist wahrscheinlich effizienter als die meisten (wieder außer den C ' s).
Dies ist die Python-3, die durch die Art und Weise, die anderen python-Plattform getestet (Nur Python genannt) verkleideten viel schlimmer.
Wenn Sie es wirklich wissen wollten wie es ist schneller, die VM ist erstaunlich intelligent. Es kompiliert-zu-Maschine-Sprache, NACHDEM der code ausgeführt wird, so dass es weiß, was die meisten wahrscheinlich-code-Pfade sind und optimiert für Sie. Speicherzuweisung ist eine Kunst-wirklich nützlich in einer OO-Sprache. Es kann führen Sie einige erstaunliche Laufzeit-Optimierungen, die keine nicht-VM Sprache tun können. Es läuft in einen ziemlich kleinen Speicher-footprint, wenn gezwungen, und ist eine Sprache der Wahl für embedded-Geräte zusammen mit C/C++.
Arbeitete ich an einem signalanalysator Agilent (denke teuer o-scope), in dem fast die gesamte Sache (abgesehen von der sampling) erfolgte in Java. Dies umfasst den Entwurf der Bildschirm-einschließlich der trace (AWT) und die Interaktion mit den Steuerelementen.
Derzeit arbeite ich an einem Projekt für alle zukünftigen Kabel-Boxen. Die Anleitung, die zusammen mit den meisten anderen apps werden in Java geschrieben.
Warum wäre es nicht schneller als Python?
InformationsquelleAutor der Antwort Bill K
Schreiben Sie die Hadoop-mapreduce-Transformationen entweder als "streaming" oder als "custom jar". Wenn Sie die streaming verwenden, können Sie Ihren code schreiben, in jeder Sprache, die Sie möchten, wie Python oder C++. Ihr code wird nur von STDIN Lesen und Ausgabe nach STDOUT. Jedoch, auf hadoop-Versionen vor 0.21, hadoop streaming verwendet, um nur-stream - text, nicht Binär - auf Ihre Prozesse. Daher, Ihre benötigten Dateien zu text-Dateien, es sei denn, Sie haben einige funky Codierung Transformationen selbst. Aber jetzt scheint es ein patch Hinzugefügt wurde, erlaubt nun die Verwendung von Binär-Formate mit hadoop-streaming.
Wenn Sie eine "benutzerdefinierte jar" (d.h. Sie haben Ihre mapreduce-code in Java oder Scala mit dem hadoop-Bibliotheken), dann haben Sie Zugriff auf Funktionen, mit denen Sie input-und output-binary (Binär serialisieren) von Ihrem streaming-Prozesse (und die Ergebnisse speichern auf der Festplatte). So läuft zukünftig wird viel schneller sein (je nachdem, wie viel Ihre binären format ist kleiner als Ihre text-format).
Also, wenn Ihr hadoop-job sein wird, I/O-gebunden ist, dann die "custom-jar" - Ansatz wird schneller sein (da beide Java ist schneller als Vorherige Poster gezeigt haben und Lesen von der Festplatte wird auch schneller sein).
Aber man fragt sich, wie wertvoll ist Ihre Zeit. Ich finde mich weitaus produktiver mit python, und das schreiben von map-reduce, der liest von STDIN und schreibt auf STDOUT ist wirklich einfach. Also ich persönlich würde empfehlen, die python-route - auch wenn Sie zur Abbildung der binären Kodierung Sachen selbst heraus. Da hadoop 0.21 Griffe nicht-utf8-kodierten byte-arrays, und da ist ein binärer (byte-array) alternative für python (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/), was zeigt, das python-code, der nur etwa 25% langsamer als die "benutzerdefinierte jar" java-code, ich würde auf jeden Fall gehen die python-route.
InformationsquelleAutor der Antwort John Prior