53 votes

Java vs Python sur Hadoop

Je suis en train de travailler sur un projet en utilisant Hadoop et il semble à intégrer nativement de Java et de fournir de la prise en charge du streaming pour Python. Est-il un impact significatif sur les performances de choisir l'un plutôt que l'autre? Je suis assez tôt dans le processus où je peux aller, de toute façon si il y a une importante différence de performances, d'une manière ou l'autre.

24voto

Bill K Points 32115

Avec Python, vous aurez probablement à se développer plus rapidement et avec Java va certainement courir plus vite.

Google "langue shootout jeu" si vous voulez voir quelques très précis de la vitesse des comparaisons entre toutes les langues populaires, mais si je me souviens bien, vous parlez de 3 à 5 fois plus rapide.

Cela dit, peu de choses sont processeur lié ces jours-ci, donc si vous vous sentez comme vous le feriez pour mieux développer avec Python!


En réponse à un commentaire (comment peut-java-être plus rapide que Python):

Toutes les langues sont traitées différemment. Java est à propos de la manière la plus rapide après C & C++ (qui peuvent être aussi rapide ou jusqu'à 5x plus rapide que java, mais il semble qu'en moyenne 2x plus rapide). Le reste sont de 2 à 5 fois plus lent. Python est l'un des plus rapides après Java. Je devine que C# est à peu près aussi rapide que Java ou peut-être plus vite, mais la fusillade avait uniquement Mono (qui était un peu plus lent), car ils ne fonctionnent pas sur windows.

La plupart de ces demandes sont basées sur le langage de l'ordinateur de référence de jeu (buts) qui a tendance à être assez juste parce que les défenseurs de la/des experts dans chaque langue tordre le test écrit dans leur langue afin de s'assurer que le code est bien ciblée.

Par exemple, cette montre tous les tests avec Java vs c++ et vous pouvez voir la vitesse varie d'environ égal à java 3x plus lent (la première colonne est entre 1 et 3), et java utilise beaucoup plus de mémoire!

Maintenant, cette page montre java vs python (du point de vue de Python). Si les vitesses sont comprises entre python 2x plus lent que Java pour 174x plus lent, python généralement beats java dans le code de la taille et de l'utilisation de la mémoire.

Un autre point intéressant ici--tests alloué beaucoup de mémoire, Java effectivement des résultats significativement meilleurs que Python dans la taille de la mémoire. Je suis sûr que java perd la mémoire à cause de la surcharge de la machine virtuelle, mais une fois que les facteurs, java est probablement plus efficace que la plupart (encore une fois, à l'exception de la C).

C'est Python 3 par la voie, l'autre python plate-forme testé (Juste appelé Python) s'en sortent bien pire.

Si vous avez vraiment envie de savoir comment il est plus rapide, la machine virtuelle est incroyablement intelligent. Il est compilé en langage machine APRÈS l'exécution du code, de sorte qu'il sait ce que le plus probable code chemins sont et les optimise pour eux. L'allocation de mémoire est un art--vraiment utile dans un langage OO. Il peut effectuer certains incroyable moment de l'exécution des optimisations qui ne non-VM langue. Il peut fonctionner dans une jolie petite empreinte mémoire lors de la contraints de, et de est un langage de choix pour les appareils embarqués avec C/C++.

J'ai travaillé sur un Analyseur de Signal pour Agilent (pensez cher o-scope) où près de la totalité de la chose (en dehors de l'échantillonnage) a été fait en Java. Cela comprend le dessin de l'écran, y compris la trace (AWT) et d'interagir avec les contrôles.

Actuellement je travaille sur un projet pour l'avenir toutes les boîtes de connexion. Le Guide ainsi que la plupart des autres applications sont écrites en Java.

Pourquoi ne serait-il pas plus rapide que Python?

15voto

David Crawshaw Points 4842

Java est moins dynamique que le Python et plus d'effort a été mis dans une machine virtuelle, le rendant plus rapide de la langue. Python est également freiné par ses Global Interprète de Verrouillage, le sens qu'il ne peut pas pousser les threads d'un même processus sur différents cœur.

Si cela fait une grande différence dépend de ce que vous comptez faire. Je soupçonne les deux langues de travail pour vous.

14voto

John Prior Points 325

Vous pouvez écrire Hadoop mapreduce transformations soit en "streaming" ou comme une "coutume jar". Si vous utilisez le streaming, vous pouvez écrire votre code dans la langue que vous souhaitez, y compris Python ou C++. Votre code viens de lire sur l'entrée standard et la sortie vers STDOUT. Cependant, sur hadoop versions avant de 0,21, hadoop streaming habitude de flux de texte - pas de binaires à vos processus. Donc vos fichiers nécessaires pour être des fichiers texte, sauf si vous faites un peu de funky encodage des transformations de vous-même. Mais maintenant, il semble qu'un patch a été ajoutée, qui permet désormais l'utilisation de formats binaires avec hadoop streaming.

Si vous utilisez un "custom jar" (c'est à dire que vous avez écrit votre mapreduce code en Java ou Scala à l'aide de l'hadoop bibliothèques), ensuite vous aurez accès à des fonctions qui vous permettent d'entrer et de sortie binaire (sérialiser en binaire) à partir de votre streaming processus (et enregistrer les résultats sur le disque). Aussi, les futures pistes vont être beaucoup plus rapide (en fonction de la façon dont beaucoup de votre binaire format est plus petit que votre format de texte).

Donc, si votre travail hadoop va être dépendant des e/S, puis la "coutume jar" approche sera plus rapide (depuis Java est plus rapide que les précédentes affiches ont montré et de la lecture à partir du disque sera aussi plus rapide).

Mais vous devez vous demander comment la valeur de votre temps. Je me retrouve beaucoup plus productif avec python, et l'écriture de réduire la carte qui lit l'entrée standard STDIN et écrit sur la sortie standard (STDOUT) est vraiment simple. Donc, personnellement, je vous recommande d'aller le python de route, même si vous avez à comprendre le codage binaire des choses à vous-même. Depuis hadoop 0.21 poignées non-utf8 tableaux d'octets, et depuis il est un binaire (tableau d'octets) alternative à l'utilisation de python (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/), ce qui montre le code python seulement environ 25% plus lente que la "coutume jar" code java, je serais certainement aller le python route.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X