2009-09-26 9 views
51

Estoy trabajando en un proyecto que utiliza Hadoop y parece incorporar de forma nativa Java y proporcionar soporte de transmisión para Python. ¿Hay un impacto significativo en el rendimiento al elegir uno sobre el otro? Llego lo suficientemente temprano en el proceso en el que puedo ir de cualquier manera si hay una diferencia de rendimiento significativa de una manera u otra.Java vs Python en Hadoop

+0

Hubo una sesión en Hadoop en DEFCON este año. Mostraron algo de Python haciendo sorprendentemente bien, pero parecía estar haciendo una tarea de E/S. Según entiendo, la integración con Python implica comenzar un proceso separado y transmitir datos como texto. Dependiendo de la tarea, eso puede o no ser un problema. –

+0

Si un proceso de asignación/reducción puede llevar mucho tiempo procesar una clave, la transmisión puede tener otros problemas. Un mapper/reductor nativo de Java puede enviar un latido para notificar al rastreador de trabajos, pero un correlacionador/reductor de transmisión no tiene esa capacidad. – phsiao

+5

Esto generalmente depende de si su tarea está vinculada a IO o CPU. IMO en tareas vinculadas a IO no hay mucha diferencia en el lenguaje que usará. Pero para las tareas vinculadas a la CPU, si quiere todo el poder, puede obtener Java, si puede ahorrar un% de potencia para un tiempo de desarrollo más rápido, vaya a Python. – wlk

Respuesta

13

Java es menos dinámico que Python y se ha dedicado más esfuerzo a su máquina virtual, por lo que es un lenguaje más rápido. Python también se ve frenado por su bloqueo de intérprete global, lo que significa que no puede enviar subprocesos de un único proceso a un núcleo diferente.

Si esto hace una diferencia significativa depende de lo que tenga la intención de hacer. Sospecho que ambos idiomas funcionarán para ti.

+6

python tiene, sin embargo, muy buen soporte multiproceso para múltiples núcleos – cobbal

+0

Escuché que el bloqueo de intérprete global hizo que el soporte multi-núcleo casi un lavado, pero no recuerdo el lugar exacto en que escuché esto así que tómenlo con un grano de sal. –

+2

El proceso de múltiples núcleos se puede utilizar con el módulo python paralelo que también le permite enviar procesos a otras máquinas en un clúster. Muy limpio y fácil. – whatnick

24

Con Python probablemente se desarrolle más rápido y con Java definitivamente se ejecutará más rápido.

Google "benchmarksgame" si quieres ver algunas comparaciones de velocidad muy precisas entre todos los lenguajes populares, pero si no recuerdo mal que está hablando 3-5x más rápido.

Dicho esto, algunas cosas están sujetas a procesadores en estos días, así que si sientes que podrías desarrollar mejor con Python, ¡hazlo!


En respuesta a comentar (¿cómo puede java ser más rápido que Python):

Todos los idiomas se procesan de manera diferente. Java es el más rápido después de C & C++ (que puede ser tan rápido o hasta 5 veces más rápido que Java, pero parece promediar alrededor de 2 veces más rápido). El resto es de 2 a 5 veces más lento. Python es uno de los más rápidos después de Java. Supongo que C# es tan rápido como Java o quizás más rápido, pero el juego de pruebas solo tenía Mono (que era un poco más lento) porque no lo ejecutaban en Windows.

La mayoría de estos reclamos se basan en el computer language benchmarks game, que tiende a ser bastante justo porque los defensores/expertos en cada idioma modifican la prueba escrita en su idioma específico para garantizar que el código esté bien orientado.

Por ejemplo, this muestra todas las pruebas con Java vs C++ y puede ver los rangos de velocidad de aproximadamente igual a java siendo 3 veces más lento (la primera columna está entre 1 y 3) ¡y Java usa mucha más memoria!

Ahora this page muestra java vs pitón (desde el punto de vista de Python). Así que las velocidades van desde python que es 2 veces más lento que Java a 174x más lento, Python en general supera a Java en tamaño de código y uso de memoria.

Otro punto interesante aquí: pruebas que asignaron mucha memoria, Java en realidad también tuvo un rendimiento significativamente mejor que Python en tamaño de memoria. Estoy bastante seguro de que Java normalmente pierde memoria debido a la sobrecarga de la máquina virtual, pero una vez que los factores, java es probablemente más eficiente que la mayoría (de nuevo, excepto las C).

Esto es Python 3 por cierto, la otra plataforma de python probada (llamada simplemente Python) se deterioró mucho peor.

Si realmente quería saber cómo es más rápido el, la máquina virtual es increíblemente inteligente. Se compila en lenguaje de máquina DESPUÉS de ejecutar el código, por lo que sabe cuáles son las rutas de código más probables y las optimiza. La asignación de memoria es un arte, realmente útil en un lenguaje OO. Puede realizar sorprendentes optimizaciones de tiempo de ejecución que ningún lenguaje que no sea VM puede hacer.Se puede ejecutar en una huella de memoria bastante pequeña cuando se lo fuerza a hacerlo, y es un lenguaje de elección para dispositivos integrados junto con C/C++.

Trabajé en un analizador de señal para Agilent (piense en costoso o-scope) donde casi todo (aparte del muestreo) se realizó en Java. Esto incluye dibujar la pantalla incluyendo el seguimiento (AWT) e interactuar con los controles.

Actualmente estoy trabajando en un proyecto para todos los futuros decodificadores de cable. La guía junto con la mayoría de las otras aplicaciones se escribirán en Java.

¿Por qué no sería más rápido que Python?

+0

¿cómo puede Java ser más rápido que Python? ¿Hay algún extracto sobre eso? Gracias. –

+0

Sin quitar su resumen, tenga en cuenta que es posible que se hayan convertido más programas de Java para usar quadcore, así que también mire las mediciones de un núcleo: http://shootout.alioth.debian.org/u32/index. php – igouy

+0

Interesante. Miré el programa java con peor rendimiento (el árbol uno) y me di cuenta de que no era de subprocesos múltiples, pero tiene razón: muchos otros idiomas hacen un show sorprendente en el modo de un solo subproceso. ¿Pascal gratis? Ada ??? Hmph –

14

Puede escribir transformaciones Hadoop mapreduce como "transmisión" o como "jar personalizado". Si usa la transmisión, puede escribir su código en el idioma que desee, incluidos Python o C++. Su código solo se leerá en STDIN y se enviará a STDOUT. Sin embargo, en las versiones de hadoop anteriores a 0.21, la transmisión de hadoop solía transmitir solo texto, no binario, a sus procesos. Por lo tanto, sus archivos deben ser archivos de texto, a menos que realice usted mismo algunas transformaciones de codificación funky. Pero ahora parece que se ha agregado un patch que ahora permite el uso de formatos binarios con la transmisión de hadoop.

Si utiliza un "jar personalizado" (es decir, ha escrito su código mapreduce en Java o Scala utilizando las bibliotecas hadoop), tendrá acceso a funciones que le permiten ingresar y sacar datos binarios (serializar en binario) sus procesos de transmisión (y guarde los resultados en el disco). Por lo tanto, las ejecuciones futuras serán mucho más rápidas (dependiendo de cuánto su formato binario sea más pequeño que su formato de texto).

Así que si su trabajo hadoop va a ser E/S obligado, entonces el enfoque "jar personalizado" será más rápido (ya que Java es más rápido que los carteles anteriores y la lectura del disco también será más rápido).

Pero tiene que preguntarse qué tan valioso es su tiempo. Me resulta mucho más productivo con python, y escribir map-reduce que lee STDIN y escribe en STDOUT es muy sencillo. Así que personalmente recomendaría ir por la ruta de Python, incluso si tiene que descifrar la codificación binaria usted mismo. Dado que hadoop 0.21 maneja matrices de bytes no utf8, y dado que hay una alternativa binaria (matriz de bytes) para python (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/), que muestra que el código python solo es aproximadamente un 25% más lento que el código java "jar personalizado", Definitivamente iría por la ruta de Python.