wordcount que java python hadoop

java - que - python wordcount mapreduce



Java vs Python en Hadoop (3)

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

Google "benchmarksgame" si desea ver comparaciones de velocidad muy precisas entre todos los idiomas populares, pero si recuerdo correctamente, está hablando de 3-5 veces 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 al comentario (¿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 juego de puntos de referencia del idioma de la computadora, que suele 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 que los rangos de velocidad de aproximadamente igual a java son 3 veces más lentos (la primera columna está entre 1 y 3), ¡y Java usa mucha más memoria!

Ahora esta página muestra java vs python (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 desempeño significativamente mejor que Python en el tamaño de la 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) salió mucho peor.

Si realmente quería saber cómo es más rápido, 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 (creo que es 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 decodificadores de cable futuros. 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?

Estoy trabajando en un proyecto que utiliza Hadoop y parece incorporar Java de forma nativa y brindar 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 es menos dinámico que Python y se ha dedicado más esfuerzo a su VM, lo que lo convierte en 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 alguna diferencia significativa depende de lo que pretendas hacer. Sospecho que ambos idiomas funcionarán para ti.


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 patch se ha agregado un patch que ahora permite el uso de formatos binarios con transmisión de hadoop.

Si usa un "jar personalizado" (es decir, ha escrito su código mapreduce en Java o Scala usando las bibliotecas hadoop), tendrá acceso a funciones que le permiten ingresar y sacar binario (serializar en binario) de sus procesos de transmisión ( y guarda 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).

Entonces, si su trabajo de hadoop va a ser E / S enlazado, entonces el enfoque de "jar personalizado" será más rápido (ya que Java es más rápido que los anteriores y la lectura desde el disco también será más rápida).

Pero debes preguntarte qué valioso es tu 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 usar 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 python.