Utilizando JAQL para analizar Big Data

Cómo analizar información semi-estructurada con lenguajes declarativos en Big Data

Las soluciones de "Big Data" representan un nuevo paradigma en la administración de información de alto volumen y gran variedad. Este artículo explica el uso de JAQL, un lenguaje declarativo, para explotar datos semi-estructurados en Big Data.

Alexander Ambriz Rivas, Client Technical Professional, IBM

Alexander Ambriz RivasAlexander Ambriz Rivas es especialista técnico para el área de Information Management de IBM Software Group México, desde enero de 2010. En este rol, Alexander se encarga de apoyar técnicamente en labores de preventa para soluciones de Master Data Management (MDM) y Big Data. Alexander cuenta con 12 años de experiencia en el desarrollo de sistemas de software empresariales. Antes de unirse a IBM, Alexander participó en proyectos de software basados en Java Enterprise Edition con Multipack, Banco Azteca, Metlife y Telcel entre otros. Además de las áreas de MDM y Big Data, Alexander está interesado en temas de Arquitectura Orientada a Servicios (SOA) y tecnologías Java. Alexander es Ingeniero en Computación por la Universidad Nacional Autónoma de México y Maestro en Ciencias con especialidad en Tecnología de Software, por la Hochschule für Technik Stuttgart, Alemania.



16-04-2012

¿Qué es Big Data?

Si bien el término Big Data es relativamente nuevo en el ámbito de la Tecnología de Información Empresarial, en realidad casi cualquier usuario de Internet utiliza frecuentemente aplicaciones basadas en el paradigma de Big Data. Durante la última década hemos sido testigos del estratosférico crecimiento en el uso de redes sociales y aplicaciones de Internet, como buscadores, aplicaciones de geo-referenciamiento y streaming de audio y video.

Hoy en día, algunos de los conjuntos de datos más grandes del mundo son mantenidos por empresas de Internet, como Google, Facebook, Yahoo, Twitter, entre otras. ¿Qué tienen en común los datos manejados por estas empresas? La respuesta puede resumirse en las siguientes características:

  • Volumen: en términos de Petabytes.
  • Variedad: información semi-estructurada o "no-estructurada" (texto, imágenes, video), además de la información "estructurada" (representada tradicionalmente de forma tabular).
  • Velocidad: Alta tasa de crecimiento en la información y necesidad de rápida respuesta por parte de las aplicaciones.

A principios de la década pasada, las compañías de Internet enfrentaron el reto de administrar y explotar un creciente volumen de información. Pronto se dieron cuenta de que los enfoques "tradicionales" como los manejadores de bases de datos relacionales y sistemas de administración de documentos existentes no serían capaces de satisfacer sus necesidades, por lo que se dieron a la tarea de desarrollar sus propias tecnologías. En 2003, Google dio a conocer el Google File System, un sistema de archivos distribuido escalable diseñado para soportar aplicaciones de procesamiento de datos intensivo. Como complemento, en 2006, Google presentó MapReduce, un modelo de programación para el procesamiento de grandes conjuntos de datos.

Con base en el trabajo de Google, el equipo de investigación de Yahoo creó Hadoop, un conjunto de librerías de software para el procesamiento de datos de forma distribuida, escalable y confiable. Eventualmente, Yahoo cedió Hadoop a Apache Software Foundation, organización que actualmente define los estándares de esta plataforma.

Hacia finales de la década pasada, empresas y organizaciones de industrias distintas a Internet se dieron cuenta que enfrentaban el mismo problema que las compañías de Internet enfrentaron años atrás: necesitaban extraer inteligencia del correo electrónico corporativo, de las interacciones con usuarios vía centros de atención, o bien analizar datos meteorológicos, geo-referenciados y de sensores. Algunos incluso necesitan extraer inteligencia de imágenes o videos. Fue entonces cuando el "mundo corporativo" volteó la vista hacia las soluciones de "Big Data".

Si bien Hadoop satisface los requerimientos para el procesamiento de "Big Data", su origen como proyecto "open-source" hace que la implementación de Apache no cumpla necesariamente con las características de facilidad de administración, seguridad e interfaz de usuario amigable que se esperan del software "empresarial". Así, algunas empresas líderes en el ámbito del software empresarial se han dado a la tarea de crear productos basados en Hadoop, como es el caso de IBM con InfoSphere BigInsights, parte del portafolios de "Big Data" y pieza importante de la estrategia de "Smarter Analytics" de la corporación.

Este artículo tiene como objetivo describir a alto nivel las características de Hadoop, para después presentar JAQL, un lenguaje declarativo diseñado para analizar información semi-estructurada utilizando las tecnologías de Hadoop. Con el fin de mostrar el potencial de JAQL, se desarrolla un ejemplo de su uso, aplicado al análisis de datos meteorológicos.


Introducción a Hadoop

En una sola frase, podría decirse que Hadoop se basa en el principio de "divide y vencerás": los datos a analizar se dividen en bloques que se distribuyen a nodos de un clúster. Para realizar el análisis, "los programas se llevan a los datos", es decir, en los nodos del clúster se ejecutan procesos para parsear, filtrar, transformar y agregar datos. Así se logra un alto paralelismo en el procesamiento de datos.

Esta fuera del alcance de esta sección explicar todos los detalles técnicos de Hadoop. El lector interesado puede consultar otras fuentes, como la página principal de Hadoop, así como la amplia literatura respecto al tema, por ejemplo "Hadoop. The Definitive Guide" de Tom White, Editorial O'Reilly.

Hadoop se basa en dos elementos: el Hadoop Distributed File System y MapReduce.

Hadoop Distributed File System (HDFS)

HDFS es el sistema de almacenamiento primario usado por las aplicaciones basadas en Hadoop. HDFS crea múltiples réplicas de bloques de datos y los distribuye en nodos a lo largo de un clúster para llevar a cabo cálculos extremadamente rápido.

La Figura 1 muestra como un archivo lógico se divide en múltiples bloques que se distribuyen en los nodos del clúster. Un mismo bloque se copia en varios nodos, para lograr así tolerancia a fallos.

Una característica importante de HDFS es que está hecho para ejecutarse en hardware "commodity" (equipos Intel x86 con sistema operativo Linux). De esta manera los costos de hardware asociados a una implementación de Hadoop se mantienen bajos, y es relativamente fácil crecer el clúster según las necesidades.

Figura 1: Distribución de un archivo lógico en un clúster HDFS
Figura 1: Distribución de un archivo lógico en un clúster HDFS

MapReduce

MapReduce complementa HDFS al proporcionar un modelo de programación orientado al procesamiento de grandes volúmenes de datos. MapReduce consta de tres fases, conocidas como "Map", "Shuffle" y "Reduce".

La fase "Map" consiste en distribuir y ejecutar en cada nodo del clúster pequeños programas conocidos como "mappers". Cada mapper procesa una porción de información conocida como "split". El mapper parsea, filtra y transforma los datos, para generar tuplas <llave, valor>.

Figura 2: Fase “Map”
Figura 2: Fase “Map”

La salida de cada mapper se agrupa por llave . Un nodo se escoge para procesar los datos de cada valor llave. MapReduce orquesta el movimiento de datos entre nodos. Dicho movimiento se conoce como "shuffle".

Figura 3: Fase “Shuffle”
Figura 3: Fase “Shuffle”

Finalmente, programas conocidos como "reducers" se encargan de agregar todos los valores para una llave dada. Cada reducer escribe el resultado a su propio archivo, que se escribe en el HDFS.

Figura 4: Fase “Reduce”
Figura 4: Fase “Reduce”

Si bien puede parecer un modelo simple, la combinación HDFS + MapReduce es capaz de resolver problemas muy complejos, por ejemplo:

  • Ebay utiliza un clúster de 532 nodos (4256 cores) para optimizar sus búsquedas.
  • Facebook mantiene dos grandes clústers, 1100 máquinas (8800 cores) y 300 máquinas (2400 cores) respectivamente, para fines analíticos, sobre un total de 15 Petabytes.
  • LinkedIn mantiene múltiples clústers (120 máquinas – 960 cores, 580 máquinas – 4640 cores y 1200 máquinas – 14400 cores), para funciones como "Gente que podría conocer" y "Dashboard".
  • The New York Times corre un clúster virtual para conversión de imágenes.
  • Twitter utiliza Hadoop para almacenar los "tweets" y procesamiento de la información.
  • Yahoo! Tiene más de 100,000 cores en más de 40,000 máquinas ejecutando Hadoop
  • Adobe tiene un clúster de 30 nodos, para procesamiento de datos interno.

Más referencias de uso de Hadoop pueden encontrarse en:
http://wiki.apache.org/hadoop/PoweredBy

Una vez explicados los principios de Hadoop, la pregunta natural es ¿cómo desarrollar una aplicación para Hadoop? Originalmente sólo estaba disponible una API de Java para el desarrollo de trabajos en MapReduce. Si bien la API de Java proporciona la mayor flexibilidad y poder en el desarrollo de aplicaciones de MapReduce, su uso tiene también las siguientes implicaciones:

  • Es necesario tener habilidades de programación en Java.
  • No siempre es fácil determinar la función de "Map" y la de "Reduce", ni decidir la llave que se utilizará para agrupar los valores.
  • Dependiendo del caso, pudiera ser necesario escribir mucho código para implementar un algoritmo en MapReduce.

Dadas las consideraciones anteriores, se han desarrollado lenguajes específicos para explotar las potencialidades de Hadoop limitando la complejidad. Como se mencionó al principio del artículo, uno de los problemas que más frecuentemente enfrentamos en el campo de "Big Data" es el procesamiento de información semi-estructurada. Para facilitar la solución de ese caso de uso, uno de los lenguajes que se han creado es JAQL, que se detalla en la siguiente sección.


JAQL para analizar información semi-estructurada

JAQL - Query Language for Javascript Object Notation (JSON) - es un lenguaje funcional y declarativo que facilita la explotación de información organizada en formato JSON, e incluso en archivos semi-estructurados de texto plano. El objetivo de JAQL es que el desarrollador de aplicaciones de Hadoop pueda concentrarse en qué quiere obtener, y no en cómo lo tenga que obtener.

JAQL analiza la lógica y la distribuye en "mappers" y "reducers" según sea necesario – solo dónde y cuándo sea necesario.

JAQL combina la facilidad de uso de un lenguaje declarativo de alto nivel con la capacidad de explotar el paralelismo y alto rendimiento de Hadoop.

Esta sección pretende ilustrar la facilidad de uso de JAQL mediante un ejemplo, sin entrar en detalles respecto a la sintaxis del lenguaje. Se recomienda al lector interesado acudir a la documentación de referencia de JAQL.

Tal como se mencionó al principio de este artículo, los datos meteorológicos son buenos candidatos para ser analizados mediante técnicas de "Big Data", dado el volumen de información que se genera, la velocidad con la que crece y la variedad en que se pueden presentar los datos.

El ejemplo a desarrollar consiste en calcular la temperatura máxima registrada en México, Distrito Federal, para un día dado. Los datos se obtienen del Sistema de Estaciones Meteorológicas Automáticas del Servicio Meteorológico Nacional (http://smn.cna.gob.mx/emas/), cuya página principal puede verse en la Figura 5. Dicho sistema publica información de variables como velocidad del viento, temperatura, presión, radiación solar y precipitación, entre otras. La información se actualiza cada 10 minutos.

Figura 5: Sistema de Estaciones Meteorológicas Automáticas (SMN)
Figura 5: Sistema de Estaciones Meteorológicas Automáticas (SMN)

La información se publica en forma de archivos de texto, organizados tabularmente, con tamaños de columna fijos. Los archivos constan de un encabezado con el nombre de la estación y su posición geo-referenciada. Luego aparece el título de cada columna, especificando cada variable meteorológica. Finalmente, aparecen las lecturas, indicando fecha y hora de las mismas. Un ejemplo del formato aparece en la Figura 6.

Figura 6: Información publicada por una Estación Meteorológica
Figura 6: Información publicada por una Estación Meteorológica

Para obtener la temperatura máxima registrada en el Distrito Federal, el script de JAQL hará lo siguiente:

  1. Obtener la lista de archivos con información meteorológica, que por simplicidad se habrán descargado a un directorio local.
  2. Leer los archivos leídos en el paso 1
  3. Eliminar el encabezado (las 5 primeras líneas, que describen el nombre de la estación, operador, ubicación, un salto de línea y los títulos de las columnas).
  4. Descartar aquellas con una longitud menor a 66 caracteres, es decir, aquellas líneas incompletas debido a errores al escribir el archivo por parte de la estación automática.
  5. Obtener la sub-cadena de caracteres entre las posiciones 62 y 66 (en donde se representa la temperatura) y transformar ese valor de cadena a número de doble precisión.
  6. Obtener la temperatura máxima de todos los registros procesados.

El Listado 1 muestra el script de JAQL que implementa la lógica descrita arriba.

Listado 1. Script JAQL para obtener temperatura máxima registrada por estaciones automáticas del Servicio Meteorológico Nacional
$archivos=ls('./weatherData/*.*');
$rawContent=$archivos -> transform read(lines($.path));
$cleanContent= $rawContent -> transform slice ($,5,count($)) -> expand 
-> filter strLen($) >= 66;
$temperature=$cleanContent -> transform substring($,62,66) -> transform 
double($);
max($temperature);

A continuación se detalla cómo JAQL ejecuta internamente cada uno de los pasos del script.

  1. $archivos=ls('./weatherData/*.*');

Esta línea obtiene los archivos que se encuentran en un directorio local (para fines de este artículo no se utiliza el clúster). El resultado se obtiene como un arreglo de registros en formato JSON, como lo muestra el siguiente ejemplo. El resultado se almacena en la variable $archivos. El nombre del archivo se almacena en la variable 'path'.

[
  {
    "accessTime": null,
    "blockSize": 33554432,
    "group": "None",
    "length": 14071,
    "modifyTime": date('2012-03-15T23:42:27.203Z'),
    "owner": "aambriz",
    "path": "file:/C:/cygwin/home/aambriz/jaql-0.5.1/weatherData/DF04_10M.TXT",
    "permission": "rw-r--r--",
    "replication": 1
  },
  {
    "accessTime": null,
    "blockSize": 33554432,
    "group": "None",
    "length": 14883,
    "modifyTime": date('2012-03-15T22:06:35.265Z'),
    "owner": "aambriz",
    "path": "file:/C:/cygwin/home/aambriz/jaql-0.5.1/weatherData/DF06_10M.TXT",
    "permission": "rw-r--r--",
    "replication": 1
  }
]
  1. $rawContent=$archivos -> transform read(lines($.path));

Para cada una de los elementos del arreglo obtenido en el paso (1), esta línea lee los archivos correspondientes y almacena el resultado en la variable $rawContent. El resultado es un arreglo bidimensional. Los elementos del arreglo son arreglos que contienen las líneas de los archivos leídos, tal como se muestra a continuación. Intencionalmente se ha recortado el contenido, mostrando únicamente algunos registros representativos del archivo original.

 [
  [
    "Estación:       TEZONTLE,  DF",
    "Operada por:    SMN EMAS",
    "Longitud:       99°05\'58\"  Latitud: 19!23\'05\"  Altitud: 2358",
    null,
    "DD/MM/AAAA HH:MM      DIRS      DIRR      VELS      VELR      TEMP        
HR        PB      PREC   RAD-SOL",
    "14/03/2012 21:10       346       315     12.10     22.90      24.7        
15     778.8       0.0     811.0",
    "14/03/2012 21:20       331       346      6.70     28.70      24.8        
15     778.6       0.0     774.0",
…
 ],
 [
    "Estación:       ECOGUARDAS,  DF",
    "Operada por:    SMN EMAS",
    "Longitud:       99°12\'14\"  Latitud: 19°16\'17\"  Altitud: 2200",
    null,
    "DD/MM/AAAA HH:MM      DIRS      DIRR      VELS      VELR      TEMP
 HR        PB      PREC   RAD-SOL",
    "14/03/2012 18:10",
    "14/03/2012 18:20",
    "14/03/2012 18:30",
    "14/03/2012 18:40",
    "14/03/2012 18:50",
    "14/03/2012 19:00",
    "14/03/2012 19:10        20       360     10.00     28.50      22.9        
19     757.1       0.0    1013.0",
    "14/03/2012 19:20       325       357      9.00     26.10      22.8       
 17     756.9       0.0     957.0",
…
 ],
…

]
  1. $cleanContent= $rawContent -> transform slice
    ($,5,count($)) -> expand -> filter strLen($) >= 66;

La línea 3 elimina de cada arreglo que representa un archivo los 5 primeros elementos (que corresponden a las líneas del encabezado). También elimina aquellas líneas con una longitud menor a 66 caracteres, es decir, aquéllas que fueron erróneas desde que fueron escritas por las estaciones automáticas. Además, esta línea convierte el arreglo bidimensional a unidimensional, de forma que se obtiene un arreglo cuyos elementos son las líneas de todos los archivos leídos, a excepción de los encabezados y las líneas incompletas. El resultado se almacena en la variable $cleanContent, que se ejemplifica a continuación:

[
  "14/03/2012 21:10       346       315     12.10     22.90      24.7        15     
778.8       0.0     811.0",
  "14/03/2012 21:20       331       346      6.70     28.70      24.8        15     
778.6       0.0     774.0",
  "14/03/2012 21:30       324       316     12.80     26.40      24.8        15     
778.5       0.0     710.0",
  "14/03/2012 21:40       347       316      0.00      0.00      25.0        14     
778.4       0.0     646.0",
  "14/03/2012 21:50       312       316      0.00      0.00      25.2        14     
778.4       0.0     527.0",
…
]

]

  1. $temperature=$cleanContent ->
    transform substring($,62,66) -> transform double($);

Esta línea obtiene la sub-cadena de la posición 62 a la 66, para cada uno de los elementos del arreglo obtenido en el paso (3). Dicha posición corresponde a los valores de temperatura. Los valores se convierten de cadenas de caracteres a números de doble precisión. El arreglo resultante se muestra en seguida:

[
  24.7,
  24.8,
  24.8,
  25.0,
  25.2,
…
]
  1. max($temperature);

Finalmente, esta línea obtiene el valor máximo del arreglo de temperaturas.


Conclusiones

Este artículo demostró la facilidad de uso de JAQL para el procesamiento de información semi-estructurada. Un lenguaje declarativo permite que los desarrolladores puedan explotar más rápidamente los beneficios de Hadoop.

Cabe preguntarse si, después de todo, es necesario aprender un nuevo lenguaje para realizar la tarea ejemplificada. Después de todo, sería posible obtener el mismo resultado con un script en UNIX utilizando awk. Pero es importante no perder de vista que el valor de Hadoop está en la escalabilidad masiva y el procesamiento paralelo. Utilizando Hadoop y JAQL, el desarrollador de aplicaciones para "Big Data" no debe preocuparse por particionar los datos para distribuirlos en múltiples nodos, por determinar cuándo se terminó el procesamiento, la consolidación de los resultados y el tratamiento de errores. Todo eso es manejado de forma transparente por Hadoop.

Pudiera también argumentarse que el problema resuelto en este artículo se resuelve también leyendo los archivos con un proceso de ETL, que escribiera los valores de las variables meteorológicas a una base de datos relacional. Si bien eso es cierto, hay que considerar que un problema real de meteorología muy probablemente involucra otro tipo de contenido, como imágenes geo-referenciadas. Ese contenido es manejado más eficientemente mediante técnicas de "Big Data", tal y como Google utiliza "Bigtable" para guardar información del servicio Google Earth (entre otros servicios).

Si bien el ejemplo desarrollado en esta artículo pudiera parecer trivial, en la vida real se ha aplicado "Big Data" para solucionar problemas complejos relacionados con variables meteorológicas. Vestas Wind Systems, compañía líder mundial en la generación de energía eólica basada en Dinamarca, utiliza IBM InfoSphere BigInsights para determinar la localización óptima de turbinas de viento, a partir de aproximadamente 15 Petabytes de información. Vestas redujo el tiempo de cálculo para la localización de las turbinas de tres semanas a quince minutos, gracias a InfoSphere BigInsights.


Recursos

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Information mgmt
ArticleID=810171
ArticleTitle=Utilizando JAQL para analizar Big Data
publish-date=04162012