Skip to content

PIG. Filtrado en base al tamaño de cada tupla

20 enero 2014

Actualmente me estoy adentrando poco a poco en el mundo del BigData, con Hadoop y todo su ecosistema; especialmente mediante AWS y ElasticMapReduce.

El asunto es, que durante estas semanas he estado desarrollando unos scripts de PIG para analizar la gran cantidad de logs que generan las diferentes APIs REST que hemos desarrollado en mi trabajo. Estas APIs generan logs con la actividad que realizan los usuarios sobre ellas y esta información se analiza para obtener estadísticas y saber las invocaciones que realiza cada usuario y el uso general que se hace de cada API. (No hay información sensible 🙂 )

El formato en el que están almacenados los logs, ha ido variando conforme las APIs han ido creciendo y evolucionando, y por tanto, conviven diferentes versiones de entradas de logs.

Las diferentes versiones de las entradas de logs son casi idénticas entre sí; sólo varía la posición de los campos y la longitud de la entrada, es decir, el número de campos que tiene cada una. Un ejemplo de los logs de los que hablo podría ser el siguiente (La primera línea es meramente informativa, para poner nombre a los campos;  no se almacena):

Date | Id App | Id Num | User | IP | API Name | Method | ResponseCode | Timestamp
12:23:40,878 12-01-2014| myApp | 95 | developer | 10.0.51.67 | MiApi | POST | 201 | 1380536454505 |

Poco después se añadió a los logs información sobre el servicio que ha sido invocado dentro de cada API, por ejemplo:

Date | Id App | Id Num | User | IP | API Name | Service | Method | ResponseCode | Timestamp
12:23:40,878 12-01-2014| myApp | 95 | developer | 10.0.51.67 | MiApi | /test.json | POST | 201 | 1380536454505 |

Por tanto se hacía necesario poder diferenciar una tupla de otra y mi intención era lograrlo utilizando PIG.

Como sabéis, Apache PIG es una plataforma para analizar y procesar grandes cantidades de datos, que cuenta con su propio lenguaje conocido como PigLatin. Mi objetivo es diferenciar las tuplas directamente con PigLatin, sin recurrir al uso de UDF’s personalizadas.

Filtrar las tuplas en base a su tamaño es muy sencillo, pero me costó mucho lograrlo y buscando en internet no conseguía encontrar nada parecido que me pusiera tras la pista. Por eso lo publico aquí, por si a alguien más le puede servir de ayuda.

Vamos a meternos en harina. El objetivo es muy simple: Procesar todos los logs, pero saber identificar cuáles son los logs antiguos (no tienen información del servicio) y cuáles son los logs nuevos (con información del servicio). No voy a escribir un Script entero, simplemente la parte que nos interesa para saber diferenciar los logs en base al tamaño de las tuplas.

Snippet de PIG:

-- Cargamos los logs
raw_logs = LOAD 's3://bucket-rest/logs/' USING PigStorage('|');
-- Dividimos en función del tamaño de la tupla
SPLIT raw_logs INTO oldTuples IF SIZE(TOTUPLE(*)) == 9, newTuples IF SIZE(TOTUPLE(*)) == 10;

De este modo tan simple, ya tendríamos generados dos alias: oldTuples y newTuples, y podríamos procesarlos de manera independiente y aplicarles a cada uno las transformaciones que creamos necesarias.

Como os decía antes, es extremadamente sencillo hacer esto y, sin embargo, me ha costado varias semanas conseguir dar con la solución adecuada.

Sí que debo resaltar un detalle, para que este método funcione, debemos cargar las tuplas sin esquema, sin utilizar ‘AS’ junto con ‘LOAD’, ya que si no, cada tupla tendrá un tamaño ya prefijado.

¿Conocéis alguna manera mejor o más elegante de hacer esto mismo? Cualquier aporte, mejora o comentario será bienvenido 😉

Libros Recomendados:


Programming Pig

Hadoop The Definitive Guide

Anuncios
No comments yet

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: