Big Data aplicado: Spark vs Flink
Las múltiples líneas del mismo color se deben al paralelismo, ya que hay cálculos que terminan a la vez.
Múltiples eventos en diferentes ventanas
Más de 50.000 eventos se insertan a lo largo de diferentes ventanas de tiempo de 3s. Aquí es donde surgen claramente las particularidades de cada motor. Si trazamos la misma gráfica de tiempos de procesamiento, ocurre lo siguiente:
- Tiempo total de Spark: 614,1s
- Tiempo total Flink: 869,3s
Observamos un aumento del tiempo de procesamiento para Flink. Esto se debe a la forma en que ingiere los eventos:
Como se ve en la última figura, Flink no utiliza microlotes y paraleliza la ventana de eventos (a diferencia de Spark, utiliza ventanas deslizantes superpuestas). Esto provoca un mayor tiempo de cálculo, pero un menor tiempo de ingesta. Es una de las particularidades que debemos tener en cuenta a la hora de definir nuestra arquitectura de procesamiento de Big Data en streaming.
¿Y qué pasa con el cálculo?
La distancia euclidiana de 10.000 eventos tiene la siguiente distribución:
Se supone que los eventos anómalos están en la «cola larga» del histograma. Pero, ¿tiene realmente sentido? Analicémoslo.
En este caso, ciertos parámetros categóricos (IP, puerto) están siendo considerados como numéricos para el cálculo. Decidimos hacerlo así para aumentar la dimensionalidad y acercarnos a un problema real. Pero esto es lo que obtenemos cuando mostramos todos los valores reales de las distancias:
Es decir, ruido, ya que estos valores (IP, puerto, origen y destino) distorsionan el cálculo. Sin embargo, cuando eliminamos estos campos y procesamos todo de nuevo, manteniendo:
- duración
- in_bytes
- in_paquetes
- out_bytes
- out_paquetes
Obtenemos la siguiente distribución:
La cola larga ya no está tan poblada y hay algún pico al final. Si mostramos los valores del cálculo de la distancia, podemos ver dónde están los valores anómalos.
Gracias a este sencillo refinamiento facilitamos el trabajo del analista, ofreciéndole una potente herramienta, ahorrando tiempo y señalando dónde encontrar los problemas de una red.
Conclusiones
Aunque se podrían discutir infinidad de posibilidades y conclusiones, el conocimiento más destacable obtenido a lo largo de este pequeño desarrollo es:
- Marco de procesamiento. No es trivial pasar de un framework a otro, por lo que es importante desde el principio decidir qué framework se va a utilizar y conocer muy bien sus particularidades. Por ejemplo, si necesitamos procesar un evento de forma instantánea y esto es crítico para el negocio, debemos seleccionar un motor de procesamiento que cumpla con este requisito.
- Visión de conjunto. Para ciertas características, un motor destacará sobre otros, pero ¿qué está dispuesto a sacrificar para obtener tal o cual característica?
- Uso de recursos. Gestión de memoria, CPU, disco… Es importante aplicar pruebas de estrés, benchmarks, etc. al sistema para saber cómo se comportará en su conjunto e identificar posibles puntos débiles y cuellos de botella
- Características y contexto. Es fundamental tener siempre en cuenta el contexto específico y saber qué características hay que introducir en el sistema. Hemos utilizado parámetros como los puertos o las IPs en el cálculo de las distancias para intentar detectar anomalías en una red. Estas características, a pesar de ser numéricas, no tienen un sentido espacial entre ellas. Sin embargo, hay formas de aprovechar este tipo de datos, pero lo dejamos para un futuro post.
Este post fue publicado originalmente en https://www.gradiant.org/noticia/big-data-aplicado-spark-vs-flink/
Gracias a Adrián Portabales ( adrianp )
Leave a Reply