- Al procesar aprox. 1.75 GB de datos de partidas de ajedrez con herramientas de línea de comandos en lugar de Hadoop, la tarea terminó en solo 12 segundos, mostrando un rendimiento más de 235 veces superior frente a los 26 minutos de Hadoop
- Combinando comandos básicos del shell como grep, sort, uniq, awk, xargs y mawk se construyó un pipeline de procesamiento en streaming, manteniendo el uso de memoria casi en 0
- Mediante procesamiento paralelo con xargs y optimización con mawk, se aumentó el aprovechamiento de los núcleos de CPU y se minimizó el cuello de botella de IO
- Frente a procesar el mismo dataset con un clúster de Hadoop (7 instancias c1.medium), el enfoque tiene una carga de costos y mantenimiento notablemente menor
- Muestra que incluso en una sola máquina es posible hacer análisis de datos de forma eficiente, y plantea una alerta sobre el uso innecesario de herramientas de Big Data
Introducción: procesamiento por línea de comandos más rápido que Hadoop
- Tras ver un caso donde se analizaron unos 2 millones de partidas de ajedrez con Amazon EMR y mrjob, se reprodujo el mismo procesamiento con un enfoque de streaming basado en línea de comandos
- En un clúster de Hadoop (7 nodos c1.medium) tomó 26 minutos, con una velocidad de procesamiento de 1.14 MB/s
- En una laptop local terminó en 12 segundos, con una velocidad de procesamiento de 270 MB/s
- Demuestra que para tareas simples de agregación de resultados, un pipeline de shell es mucho más eficiente que Hadoop
- Al combinar comandos de shell, es posible implementar en una sola máquina una estructura de procesamiento de streams en paralelo similar a Storm
Estructura y preparación de los datos
- Los datos están en formato PGN (Portable Game Notation), y el resultado de cada partida aparece en la línea
"Result"
"1-0" significa victoria de blancas, "0-1" victoria de negras y "1/2-1/2" empate
- Se obtuvo un dataset de aprox. 3.46 GB desde el repositorio rozim/ChessData en GitHub
- Casi el doble del conjunto usado en el experimento de Tom Hayden (1.75 GB)
Construcción del pipeline básico
Paralelización y optimización
Conclusión: la eficiencia de la simplicidad
- Salvo cuando se requiere procesamiento distribuido a gran escala, combinar herramientas de shell en una sola máquina es más rápido y económico
- Hadoop suele usarse en exceso incluso para tareas que podrían resolverse con una base de datos relacional o un script simple
- El análisis en streaming basado en línea de comandos es una alternativa superior en rendimiento, costo de implementación y mantenibilidad
2 comentarios
Hace tiempo existía la expresión de programación Taco Bell; parece una filosofía parecida.
Comentarios en Hacker News
Lo más triste es que este artículo es de 2014
Ahora hay todavía más capas de abstracción como Airflow, dbt y Snowflake, y se las terminan poniendo encima incluso a datasets que en realidad caben completos en RAM
Startups se gastan 5 mil dólares al mes en clústeres distribuidos para procesar menos de 10 GB de logs al día. La razón es que usar el ‘Modern Data Stack’ te ayuda a ascender, pero si lo resuelves con un script de bash te lo descartan por ‘no ser escalable’. La eficiencia y los incentivos están totalmente desalineados
Incluso hubo un caso que ingería 1 GB de JSON al día, y cuando expliqué que “una sola máquina bastaba”, me respondieron “técnicamente es correcto, pero no es la respuesta que queremos” y me rechazaron
Las máquinas actuales tienen RAM de varios TB y cientos de núcleos. Una sola máquina ya es enorme
Al contratar gente de DevOps se enfatiza la experiencia con frameworks vistosos, así que cuando llegan a la empresa repiten exactamente lo mismo
Como nadie se opone, terminan complicando trabajos que podrían resolverse con una sola desktop
Llevo más de un año buscando trabajo con un CV casi sin frameworks modernos, y eso me hace sentir como un tonto
En 2014 lo normal eran 4 GB, pero ahora también las velocidades de streaming desde SSD son tan altas que a veces leer desde un SSD local rinde mejor que usar un clúster
¡Soy el autor!
Me alegra que un artículo viejo siga siendo útil
Estoy de acuerdo con quienes dicen que la situación ha empeorado, aunque por otro lado me da gusto ver que también hay un movimiento para salir del culto a los microservicios
Ánimo para todos los que están trabajando en mejorar el rendimiento. Todavía hay esperanza
He releído tu artículo varias veces y, inspirado por él, porté Waters-Series a JavaScript para implementar pipeline de streams
Hoy en la industria está demasiado instalada la idea de que Spark o las herramientas distribuidas son la respuesta correcta para la ingeniería de datos
Es parecido a la tendencia de abusar de los frameworks SPA en desarrollo web
Mi consejo es este:
Lo que el manager quiere escuchar no es “todo escala infinitamente”, sino la certeza de que “esto funciona de forma estable”
El tamaño de los datos sigue una ley de potencia, así que los ingenieros que trabajan con datos a escala de petabytes son una minoría ínfima
Pero como muchos quieren poner esa experiencia en el CV para ganar más salario, aparece la sobreingeniería
Cuando le pregunté por qué, respondió “porque sí”. Probablemente era por el currículum o por razones políticas de alguien
Una historia histórica relacionada con el artículo
La herramienta mrjob también podía ejecutarse en modo local, sin Hadoop
Con datasets pequeños era muchísimo más rápida que un clúster, especialmente que clústeres efímeros como AWS EMR
Aun así, da la impresión de que el enfoque del autor habría sido todavía más eficiente
MapReduce facilitaba escalar a gran tamaño, pero para datos pequeños imponía muchas restricciones ineficientes
A inicios de la década de 2010 procesé datos a escala de petabytes con mrjob, pero hoy casi ya no se usa
Cuando trabajaba como ingeniero de datos, reescribí scripts de Bash/Python en C# y llevé la velocidad de procesamiento de JSON hasta 1 GB/s
Solo con optimizaciones como el parsing en streaming ya se lograban diferencias enormes
Así que me da curiosidad: ¿a partir de qué volumen de datos realmente empieza a tener sentido usar clústeres?
Para mí, si una tarea tarda más de un día, ya vale la pena considerar procesamiento distribuido
Cuando los datos eran grandes, hacía muestreo y analizaba la muestra en Excel. Hoy además, gracias a los LLM, es fácil escribir scripts simples en Python o Bash
Hoy se puede leer y escribir directamente en almacenamiento de objetos como S3, y ya es posible llegar a 100 GB/s
Cabe en disco, pero es demasiado grande para una laptop normal
El ‘tamaño’ de los datos depende de qué quieres hacer con ellos
Por ejemplo, con datos quirúrgicos, unas estadísticas simples bastan con bash, pero si quieres calcular la correlación entre la experiencia del médico y la tasa de éxito, la complejidad sube de golpe
Por eso, para una empresa es mucho más fácil decir “usamos Spark” que decir “creamos un motor a la medida para cada pregunta”
Todos los problemas mencionados pueden resolverse en un solo servidor con herramientas sencillas
Este artículo ya apareció varias veces en HN
La versión de 2018, la versión de 2022 y la versión de 2024 fueron enviadas por la misma persona
Me recordó el texto de presentación del antiguo sitio web de Shakti
“1K rows: Excel / 1M rows: Pandas / 1B rows: Shakti / 1T rows: Only Shakti”
Fuente
Muchos desarrolladores aprendieron en entornos Windows, así que no están familiarizados con las herramientas de CLI
Pero la CLI ofrece capacidades potentes como loops implícitos, separación automática de campos y aplicación paralela de expresiones regulares
Gracias a eso, permite crear rápido soluciones ad-hoc y sirve como muy buen punto de partida antes de pasar a sistemas grandes
Me pregunto qué pasaría si se ampliaran mucho más los datos de ajedrez y se repitiera el benchmark
Hoy el dataset de Lichess tiene unos 7B juegos, 2.34 TB comprimidos (14 TB sin comprimir)
Me da curiosidad si a esa escala Hadoop podría ganar
Aunque eso sí exige administrar un servidor dedicado
EMR está diseñado para un modelo en el que el acceso a los datos es poco frecuente (1 a 10 veces al día) y se busca paralelismo