java - Streaming o tarro personalizado en Hadoop
python mapreduce (1)
¿Por qué considerar la implementación de tarros personalizados?
- Posibilidad de utilizar formatos de entrada personalizados más potentes. Para trabajos de transmisión, incluso si usa entrada / salida enchufable como se menciona aquí , está limitado a la clave y los valores a su asignador / reductor que es un texto / cadena. Necesitaría gastar una cierta cantidad de ciclos de CPU para convertir a su tipo requerido.
- También he escuchado que Hadoop puede ser inteligente sobre la reutilización de JVM en varios trabajos que no será posible cuando se esté transmitiendo (no se puede confirmar).
Cuándo usar el cerdo?
- Pig Latin es bastante bueno y es un lenguaje de flujo de datos de mucho más alto nivel que java / python o perl. Sus scripts Pig tenderán a ser mucho más pequeños que una tarea equivalente escrita en cualquiera de los otros idiomas
¿Cuándo NO usar cerdo?
- Aunque el cerdo es bastante bueno para descifrar cuántos mapas / reducir y cuándo generar un mapa o reducir y una miríada de tales cosas, si estás seguro de cuántos mapas / reducción necesitas y tienes algunos cálculos muy específicos necesita hacer dentro de sus funciones de Mapa / reducir y usted es muy específico sobre el rendimiento, entonces debería considerar desplegar sus propias jarras. Este enlace muestra que el cerdo puede retrasarse en el rendimiento del hadoop nativo M / R. También podría echar un vistazo a la escritura de sus propias UDF de cerdo que aíslan algunas funciones de cálculo intensivo (y posiblemente incluso utilizar 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 objetivo de reducir hadoop y map es paralelizar las funciones de cálculo intensivo, por lo que supongo que su mapa y reducir los trabajos son intensivos en cómputo. La única vez que el subsistema Hadoop está ocupado haciendo IO se encuentra entre el mapa y la fase de reducción cuando los datos se envían a través de la red. Además, si tiene una gran cantidad de datos y ha configurado muy pocos mapas y reduce los derrames en el disco (aunque demasiadas tareas resultarán en demasiado tiempo dedicado a iniciar / detener las JVM y demasiados archivos pequeños). Un trabajo en tiempo real también tendría la sobrecarga adicional de iniciar una máquina virtual Python / Perl y tener datos que se copian entre la JVM y la máquina virtual de scripting.
Estoy ejecutando un trabajo de transmisión en Hadoop (en el 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 asignador y reductor en Java (o use Pig).
En particular, estoy buscando las experiencias de las personas sobre la migración desde la transmisión a las implementaciones personalizadas de jar y / o Pig y también los 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 personalizada de jar 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 las medidas agregadas informáticas. Parece que la utilización de CPU en los nodos de cómputo es cercana al 100%. (Me gustaría escuchar sus opiniones sobre las diferencias entre tener un CPU o un trabajo vinculado a IO).
¡Gracias!
Amaç