2009-09-26 10 views
51

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 à choisir l'un plutôt que l'autre? Je suis assez tôt dans le processus où je peux aller dans un sens ou dans l'autre s'il y a une différence significative de performance dans un sens ou dans l'autre.Java vs Python sur Hadoop

+0

Il y avait une session sur Hadoop au DEFCON cette année. Ils ont montré que certains Python se débrouillaient étonnamment bien, mais semblaient faire une tâche liée aux E/S. Ma compréhension est que l'intégration avec Python implique le démarrage d'un processus séparé et la diffusion de données sous forme de texte. Selon la tâche, cela peut ou peut ne pas être un problème. –

+0

Si un processus de mappage/réduction peut prendre beaucoup de temps pour traiter une clé, le streaming risque d'avoir d'autres problèmes. Un mappeur/réducteur Java natif peut envoyer un signal de présence pour notifier le jobtracker, mais un mappeur/réducteur de diffusion en continu n'a pas cette capacité. – phsiao

+5

Cela dépend généralement si votre tâche est liée à l'E/S ou à la CPU. OMI dans les tâches liées à l'E/S, la langue que vous utiliserez ne changera pas beaucoup. Mais pour les tâches liées à la CPU, si vous voulez avoir toute la puissance que vous pouvez obtenir pour Java, si vous pouvez économiser quelques% de puissance pour un temps de développement plus rapide, optez pour Python. – wlk

Répondre

13

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 Global Interpreter Lock, ce qui signifie qu'il ne peut pas pousser les threads d'un seul processus sur un noyau différent. Que cela fasse une différence significative dépend de ce que vous avez l'intention de faire. Je soupçonne que les deux langues vont travailler pour vous.

+6

python a, cependant, un très bon support multi-processus pour plusieurs cœurs – cobbal

+0

J'ai entendu dire que le verrou global de l'interpréteur faisait presque un lavage, mais je ne me souviens pas de l'endroit exact où j'ai entendu cela. de sel. –

+2

Le processus multi-core peut être utilisé avec le module python parallèle qui vous permet également de pousser des processus vers d'autres machines dans un cluster. Très propre et facile. – whatnick

24

Avec Python, vous vous développerez probablement plus rapidement et 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-5x plus rapide. Cela dit, peu de choses sont liées au processeur ces jours-ci, donc si vous vous sentez comme si vous développiez mieux avec Python, faites-le!


En réponse à un commentaire (comment peut 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 2x 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 benchmarksgame n'a que Mono (qui était un peu plus lent) parce qu'ils ne l'exécutent pas sur Windows.

La plupart de ces réclamations sont basées sur le computer language benchmarks game ce qui tend à être assez juste parce que les avocats/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 Par exemple, this montre tous les tests avec Java vs C++ et vous pouvez voir que les vitesses vont d'environ égal à java étant 3 fois plus lent (la première colonne est entre 1 et 3), et java utilise beaucoup plus de mémoire!

Maintenant, this page montre java vs python (du point de vue de Python). Donc, les vitesses vont 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 si.

Un autre point intéressant ici - les tests qui ont alloué beaucoup de mémoire, Java effectivement effectué significativement mieux que Python dans la taille de la mémoire. Je suis sûr que java perd généralement de la mémoire à cause de la surcharge de la machine virtuelle, mais une fois que ce facteur est éliminé, java est probablement plus efficace que la plupart des autres (à l'exception des C's).

C'est en fait Python 3, l'autre plate-forme python testée (Just Python) a été bien pire.

Si vous voulez vraiment savoir comment c'est c'est plus rapide, la VM est incroyablement intelligente. Il compile dans le langage machine APRÈS l'exécution du code, afin qu'il sache quels sont les chemins de code les plus probables et les optimise pour eux. L'allocation de mémoire est un art - vraiment utile dans un langage OO. Il peut effectuer des optimisations d'exécution étonnantes qu'aucun langage non-VM ne peut faire.Il peut s'exécuter dans une très petite empreinte de mémoire lorsqu'il est forcé de le faire, et est un langage de choix pour les périphériques embarqués avec C/C++.

J'ai travaillé sur un analyseur de signal pour Agilent (pensez o-scope cher) où presque tout le reste (en dehors de l'échantillonnage) a été fait en Java. Ceci inclut le dessin de l'écran incluant 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 cela ne serait-il pas plus rapide que Python?

+0

comment Java peut-il être plus rapide que Python? Y a-t-il un extrait à ce sujet? Merci. –

+0

Sans enlever de votre résumé, gardez à l'esprit que plus de programmes Java peuvent avoir été convertis pour utiliser le quadcore - alors regardez aussi les mesures de base - http://shootout.alioth.debian.org/u32/index. php – igouy

+0

Intéressant. J'ai regardé le programme java le moins performant (celui de l'arbre) et j'ai remarqué qu'il n'était pas multi-threadé, mais vous avez raison - beaucoup d'autres langages font un show surprenant en mode mono-thread. Free Pascal ??? Ada ??? Hmph –

14

Vous pouvez écrire des transformations Hadoop mapreduce en "streaming" ou en "pot personnalisé". Si vous utilisez le streaming, vous pouvez écrire votre code dans n'importe quelle langue, y compris Python ou C++. Votre code va juste lire depuis STDIN et sortir vers STDOUT. Cependant, sur les versions de hadoop antérieures à 0.21, le streaming hadoop ne faisait que diffuser du texte - et non du binaire - à vos processus. Par conséquent, vos fichiers doivent ê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 maintenant 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 en utilisant les bibliothèques hadoop), vous aurez accès aux fonctions qui vous permettent d'entrer et de sortir binaire (sérialiser en binaire) vos processus de streaming (et enregistrer les résultats sur le disque). Ainsi, les futures versions seront beaucoup plus rapides (en fonction de la taille de votre format binaire par rapport à votre format texte). Donc, si votre travail hadoop va être lié aux E/S, alors l'approche du "pot personnalisé" sera plus rapide (puisque les deux Java sont plus rapides que les affiches précédentes et la lecture depuis le disque sera aussi plus rapide).

Mais vous devez vous demander à quel point votre temps est précieux. Je me trouve beaucoup plus productif avec python, et écrire map-reduce qui lit STDIN et écrit sur STDOUT est vraiment simple. Donc, personnellement, je recommanderais d'aller sur la route python - même si vous devez vous-même comprendre l'encodage binaire. Puisque hadoop 0.21 gère les tableaux d'octets non-utf8, et qu'il existe une alternative binaire (tableau d'octets) à utiliser pour python (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/), ce qui montre que le code python est seulement 25% plus lent que le code java "custom jar", irait certainement la route de python.