web-dev-qa-db-fra.com

Java vs Python sur Hadoop

Je travaille sur un projet utilisant Hadoop et il semble incorporer nativement Java et fournir un support de streaming pour Python. Y a-t-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 dans les deux sens s'il y a une différence de performance significative dans un sens ou dans l'autre.

53
jnoss

Java est moins dynamique que Python et plus d'efforts ont été mis dans sa machine virtuelle, ce qui en fait un langage plus rapide. Python est également retenu par son verrou d'interpréteur global) , ce qui signifie qu'il ne peut pas pousser les threads d'un processus unique sur un noyau différent.

Que cela fasse une différence importante dépend de ce que vous avez l'intention de faire. Je soupçonne que les deux langues fonctionneront pour vous.

15
David Crawshaw

Avec Python vous développerez probablement plus vite et avec Java fonctionnera certainement plus vite).

Google "benchmarksgame" si vous voulez voir des comparaisons de vitesse très précises entre toutes les langues populaires, mais si je me souviens bien, vous parlez de 3 à 5 fois plus vite.

Cela dit, peu de choses sont liées au processeur ces jours-ci, donc si vous avez envie de mieux évoluer avec Python, allez-y!


En réponse au commentaire (comment Java être plus rapide que Python):

Toutes les langues sont traitées différemment. Java est à peu près le plus rapide après C & C++ (qui peut être aussi rapide ou jusqu'à 5 fois plus rapide que Java, mais semble en moyenne environ 2 fois plus rapide). Le reste est de 2 à 5 + fois plus lent. Python est l'un des plus rapides après Java. Je suppose que C # est à peu près aussi rapide que Java ou peut-être plus rapide, mais le jeu de référence uniquement avait Mono (qui était un peu plus lent) parce qu'ils ne l'exécutent pas sur Windows.

La plupart de ces affirmations sont basées sur le jeu de benchmark du langage informatique qui a tendance à être assez juste car les partisans de/experts dans chaque langue peaufinent le test écrit dans leur langue spécifique pour s'assurer que le code est bien ciblé.

Par exemple, this montre tous les tests avec Java vs c ++ et vous pouvez voir les plages de vitesse à peu près égales à Java étant 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). Les vitesses vont donc de python étant 2x plus lent que Java à 174x plus lent, python bat généralement Java en taille de code) et l'utilisation de la mémoire cependant.

Un autre point intéressant ici - les tests qui ont alloué beaucoup de mémoire, Java a effectivement fait beaucoup mieux que Python en taille de mémoire également. Je suis presque sûr Java perd généralement de la mémoire à cause de la surcharge de la machine virtuelle, mais une fois cela pris en compte, Java est probablement plus efficace que la plupart (encore une fois, sauf les C)) .

C'est Python 3 d'ailleurs), l'autre python plate-forme testée (juste appelé Python) s'est bien comportée bien pire.

Si vous vouliez vraiment savoir comment il est plus rapide, le VM est incroyablement intelligent. Il compile en langage machine APRÈS en exécutant le code, afin qu'il sache quels sont les chemins de code les plus probables et les optimise. L'allocation de mémoire est un art - très utile dans un langage OO. Il peut effectuer un temps d'exécution incroyable optimisations qu'aucun langage non VM ne peut faire. Il peut s'exécuter dans une assez petite empreinte mémoire lorsqu'il est forcé de le faire, et est un langage de choix pour les périphériques intégrés avec C/C++.

J'ai travaillé sur un analyseur de signaux pour Agilent (pensez à un o-scope cher) où presque tout (à part l'échantillonnage) a été fait en Java. Cela comprend le dessin de l'écran, y compris la trace (AWT) et l'interaction avec les contrôles.

Actuellement, je travaille sur un projet pour tous les futurs câblosélecteurs. Le Guide ainsi que la plupart des autres applications seront écrits en Java.

Pourquoi ne serait-il pas plus rapide que Python?

24
Bill K

Vous pouvez écrire des transformations Hadoop mapreduce soit en "streaming", soit en "pot personnalisé". Si vous utilisez la diffusion en continu, vous pouvez écrire votre code dans la langue de votre choix, y compris Python ou C++. Votre code lira simplement à partir de STDIN et sortira à STDOUT. Cependant, sur les versions hadoop antérieures à 0.21, hadoop streaming utilisé pour diffuser uniquement du texte - pas binaire - vers vos processus. Par conséquent, vos fichiers devaient être des fichiers texte, à moins que vous ne fassiez vous-même des transformations d'encodage géniales. Mais maintenant, il semble qu'un patch a été ajouté qui permet désormais l'utilisation de formats binaires avec le streaming hadoop.

Si vous utilisez un "pot personnalisé" (c'est-à-dire que vous avez écrit votre code mapreduce en Java ou Scala utilisant les bibliothèques hadoop), alors vous aurez accès aux fonctions qui vous permettent d'entrer et de sortir du binaire (sérialiser en binaire) à partir de vos processus de streaming (et d'enregistrer les résultats sur le disque). Ainsi, les exécutions futures seront beaucoup plus rapides (selon la taille de votre format binaire plus petit que votre format texte).

Donc, si votre travail hadoop va être lié aux E/S, l'approche "pot personnalisé" sera plus rapide (car les deux Java est plus rapide que les affiches précédentes l'ont montré et la lecture à partir du disque sera également Être plus rapide).

Mais vous devez vous demander quelle est la valeur de votre temps. Je me trouve beaucoup plus productif avec python, et écrire une carte-réduire qui lit STDIN et écrit dans STDOUT est vraiment simple. Donc, personnellement, je recommanderais de suivre la route python - même si vous devez comprendre vous-même le codage binaire. Étant donné que hadoop 0.21 gère les tableaux d'octets non utf8 et qu'il existe un binaire (octet tableau) alternative à utiliser pour python ( http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/ ), qui montre que le code python étant seulement environ 25% plus lent que le "pot personnalisé" Java code, je choisirais certainement le python route.

14
John Prior