Streaming o tarro personalizado en Hadoop

Estoy ejecutando un trabajo de transmisión en Hadoop (en la EMR de Amazon) con el asignador y el reductor escritos en Python. Quiero saber sobre las ganancias de velocidad que experimentaría si implementara el mismo mapeador y reductor en Java (o uso Pig).

En particular, estoy buscando las experiencias de las personas en la migración de transmisiones a implementaciones de archivos personalizados y / o Pig y también documentos que contienen comparaciones de referencia de estas opciones. Encontré esta pregunta , pero las respuestas no son lo suficientemente específicas para mí. No estoy buscando comparaciones entre Java y Python, sino comparaciones entre la implementación de archivos jar personalizados en Hadoop y la transmisión basada en Python.

Mi trabajo es leer los recuentos de NGram del conjunto de datos NGgram de Google Books y calcular las medidas agregadas. Parece que la utilización de la CPU en los nodos de cómputo está cerca del 100%. (Me gustaría escuchar sus opiniones acerca de las diferencias de tener un trabajo vinculado a la CPU o también a un IO).

¡Gracias!

Amaç

¿Por qué considerar el despliegue de tarros personalizados?

  • Posibilidad de utilizar formatos de entrada personalizados más potentes. Para los trabajos de transmisión por secuencias, incluso si utiliza la entrada / salida conectable como se menciona aquí , está limitado a que la clave y los valores para su asignador / reductor sean un texto / cadena. Necesitará gastar una cierta cantidad de ciclos de CPU para convertir a su tipo requerido.
  • También escuché que Hadoop puede ser inteligente en cuanto a reutilizar JVM en múltiples trabajos, lo cual no será posible cuando se transmita (no puedo confirmar esto)

¿Cuándo usar cerdo?

  • Pig Latin es bastante bueno y es un lenguaje de flujo de datos de nivel mucho más alto que java / python o perl. Tus scripts de Pig tienden a ser mucho más pequeños que una tarea equivalente escrita en cualquiera de los otros idiomas

¿Cuándo NO usar cerdo?

  • A pesar de que el cerdo es bastante bueno para calcular por sí mismo cuántos mapas / reducir y cuándo generar un mapa o reducir y una miríada de estas cosas, si está seguro de cuántos mapas / reducción necesita y tiene algunos cálculos muy específicos. Debes hacerlo dentro de tus funciones Map / reduce y si eres muy específico en cuanto al rendimiento, entonces deberías considerar implementar tus propios archivos jar. Este enlace muestra que el cerdo puede demorar el rendimiento de Hadoop M / R nativo. También puede echar un vistazo a la escritura de sus propias UDF de Pig que aíslan algunas funciones de cálculo intensivo (y posiblemente incluso usar JNI para llamar a algún código C / C ++ nativo dentro de la UDF)

Una nota sobre trabajos enlazados de IO y CPU:

  • Técnicamente hablando, el punto central de hadoop y map map es paralelizar las funciones de cómputo intensivo, por lo que supongo que su mapa y reducir los trabajos son intensivos en computación. La única vez que el subsistema Hadoop está ocupado haciendo IO está entre el mapa y reduce la fase cuando los datos se envían a través de la red. Además, si tiene una gran cantidad de datos y ha configurado manualmente muy pocos mapas y reduce los derrames en el disco (aunque demasiadas tareas resultarán en demasiado tiempo para iniciar / detener JVM y demasiados archivos pequeños). Un trabajo de transmisión en tiempo real también tendría la sobrecarga adicional de iniciar una máquina virtual Python / Perl y los datos se copiarían entre la JVM y la máquina virtual de scripting.