Use lenguajes semejantes a SQL para la estructura de MapReduce

Use interfaces declarativas de alto nivel para que Hadoop sea más accesible

Seleccione la implementación MapReduce más adecuada para trabajos de análisis de datos a gran escala con base en sus habilidades, preferencias y requisitos. MapReduce es un modelo de programación sencillo y poderoso que facilita el desarrollo de aplicaciones paralelas escalables para procesar muchos datos en conjuntos grandes de máquinas para procesar materias primas. Aisla la aplicación de los detalles de ejecutar un programa distribuido. No obstante, muchos programadores no están familiarizados con el estilo de programación MapReduce y prefieren usar lenguajes del estilo de SQL para realizar sus tareas. En este artículo, lea las generalidades de los lenguajes de alto nivel y los sistemas diseñados para enfrentar estos problemas y agregue interfaces declarativas además de la estructura MapReduce.

Sherif Sakr, Research Scientist, National ICT Australia

Photo of Sherif SakrEl doctor Sherif Sakr es un Research Scientist de Software Systems Group en National ICT Australia (NICTA), Sydney, Australia. También es profesor adscrito a The School of Computer Science and Engineering (CSE) de la Universidad de Nueva Gales del Sur (University of New South Wales, UNSW). En 2007, la universidad Konstanz de Alemania le otorgó su Doctorado en Ciencias de la Computación. Recibió su Licenciatura y Maestría en Ciencias de la Computación, del departamento de Sistemas de Información de la facultad de Computación e Información de la universidad del Cairo, Egipto, en 2000 y 2003 respectivamente. En 2011, el doctor Sakr se desempeño como científico investigativo en eXtreme Computing Group (XCG) en Microsoft Research, Redmond, EE.UU. El doctor Sakr es un programador con la certificación Cloudera para Apache Hadoop.



14-08-2012

Introducción

En las últimas dos décadas, el aumento estable del poder computacional ha producido un flujo de datos impresionante, el cual a su vez, ha generado a un cambio de paradigma en la arquitectura de computación y mecanismos de procesamiento de datos a gran escala. Por ejemplo, los poderosos telescopios en astronomía, los aceleradores de partículas en física y los secuenciadores de genomas en biología, han puesto volúmenes masivos de datos en las manos de los científicos. Facebook recoge 15 TeraBytes de datos cada día en un repositorio de datos a escala de PetaBytes. La demanda de aplicaciones de análisis de datos y minería de datos (data mining) a gran escala está creciendo tanto en la industria (por ejemplo, análisis de datos web, análisis de flujos por clic y análisis de registros de monitorización de redes) como en la ciencia (por ejemplo, análisis de datos producidos por simulaciones de escala masiva, implementación de sensores y equipos de laboratorios de alto rendimiento). Aunque los sistemas de bases de datos paralelos ayudan a estas aplicaciones de análisis de datos, ellos son costosos, difíciles de administrar y carecen de tolerancia a las fallas para solicitudes de ejecuciones largas.

MapReduce es una estructura presentada por Google para la programación de conjuntos de computadoras usadas en el procesamiento de materias primas para llevar a cabo procesamiento de datos a gran escala en un solo paso. La estructura está diseñada de tal forma que un conjunto MapReduce puede escalarse a miles de nodos de una manera tolerante a las fallas. Pero el modelo de programación MapReduce tiene sus propias limitaciones. Su flujo de datos de una entrada y dos estados es extremadamente rígido, además del hecho de que funciona a nivel muy bajo. Por ejemplo: usted debe escribir código personalizado incluso para la mayoría de las operaciones comunes. Por lo tanto, muchos programadores no se sienten cómodos con la estructura MapReduce y prefieren usar SQL como lenguaje declarativo de alto nivel. Se han desarrollado varios proyectos (Apache Pig, Apache Hive, and HadoopDB) para facilitar la tarea de los programadores y suministrar interfaces declarativas de alto nivel además de la estructura MapReduce.

Primero, analice la estructura MapReduce y luego las capacidades de diferentes sistemas que suministren interfaces de alto nivel a la estructura MapReduce.


La estructura MapReduce

Una ventaja importante del método de la estructura MapReduce es que aísla la aplicación de los detalles de la ejecución de un programa distribuido, tales como los problemas de distribución de datos, planificación y tolerancia a las fallas. En este modelo, la computación toma una serie de pares de valores/claves de entrada y produce una serie de pares de valores/claves de salida. El usuario de la estructura MapReduce expresa la computación usando dos funciones: Map y Reduce. La función Map toma un par de entradas y procesa una serie de pares de valores/claves intermedios. La estructura MapReduce agrupa todos los valores intermedios asociados con la misma clave intermedia I (barajando) y los pasa a la función Reduce La función reduce recibe la clave intermedia I con su serie de valores y los combina juntos. Típicamente, solamente cero o un valor de salida se produce por invocación de reduce La principal ventaja de este modelo es que permite cálculos grandes para expresarlos fácilmente en paralelo y volverlos a ejecutar para usarlos como mecanismo primario para la tolerancia a las fallas.

El proyecto Apache Hadoop es un software Java de código abierto ™ que admite aplicaciones distribuidas de gran cantidad de datos al realizar la implementación de la estructura MapReduce. ¡Fue originalmente desarrollado por Yahoo! como clon de la infraestructura Google MapReduce, pero finalmente se convirtió en código abierto. Hadoop se encarga de ejecutar su código en un conjunto de máquinas. En general, cuando un conjunto de datos supera la capacidad de almacenamiento de una sola máquina física, se hace necesario particionarlo en varias máquinas independientes. Los sistema de archivos que manejan el almacenamiento en una red de equipos se conocen como sistema de archivos distribuidos. Hadoop trae un sistema de archivos distribuidos conocido como HDFS (Hadoop Distributed Filesystem). En particular, HDFS es un sistema de archivos distribuido que almacena archivos en todos los nodos de un conjunto Hadoop. Divide los archivos en grandes bloques y los distribuye en varias máquinas diferentes, además de hacer varias copias de cada bloque, de tal manera que si una máquina falla, los datos no se pierden.

El programa MapReduce en Listado 1 se expresa en seudocódigo para contar el número de ocurrencias de cada palabra en una secuencia de líneas de texto. En Listado 1 La función Map emite cada palabra más una marca asociada de ocurrencias, mientras que la función reduce suma todas las marcas emitidas para una palabra particular.

Listado 1. Programa MapReduce
  map(String key, String value):
     //key: line number, value: line text
     for each word w in value:
          EmitIntermediate(w, ?1?);

     reduce(String key, Iterator values):
          //key: a word, values: a list of counts
     int wordCount = 0;
     for each v in values:
          wordCount += ParseInt(v);
     Emit(AsString(wordCount));

Ahora asuma la secuencia de entrada de las líneas de texto en Listado 2.

Listado 2. Secuencia de entrada
1, This is Code Example
2, Example Color is Red
3, Car Color is Green

Listado 3 muestra la salida de la función Map de esta entrada.

Listado 3. La salida de la función Map
('This', 1), ('is', 1). ('Code', 1), ('Example', 1)
('Example', 1), ('Color', 1), ('is', 1), ('Red', 1)
('Car', 1), ('Color', 1), ('is', 1), ('Green', 1)

Listado 4 muestra la salida de la función reduce function (the result).

Listado 4. La salida de la función reduce
('Car', 1), ('Code', 1), ('Color', 2), ('Example', 2), ('Green', 1), ('Red', 1)
 , ('This', 1), ('is', 3)

Para los programadores, una característica importante de la estructura MapReduce framework es que existen solamente dos primitivas declarativas de alto nivel (Map y reduce) que se pueden escribir en cualquier lenguaje de programación sin preocuparse por los detalles de su ejecución en paralelo. Por otra parte, el modelo de programación MapReduce tiene sus propias limitaciones.

  1. Su flujo de datos de una entrada y dos estados es extremadamente rígido. Para realizar tareas que tengan un flujo de datos diferente (por ejemplo, relaciones n estados), tiene que concebir alternativas inelegantes.
  2. El código personalizado se escribe incluso para la mayoría de las operaciones comunes (Por ejemplo, proyección y filtrado), lo cual genera código difícil de reutilizar y mantener.
  3. La naturaleza opaca de las funciones Map y reduce impiden la capacidad del sistema para realizar optimizaciones.

Además, muchos programadores no están familiarizados con la estructura MapReduce y prefieren usar SQL (porque lo dominan más) como lenguaje declarativo de alto nivel para expresar sus tareas dejan todos los detalles de optimización de ejecución al motor backend. Además, también es cierto que las abstracciones de los lenguajes de alto nivel, permiten al sistema subyacente realizar mejor las optimizaciones automáticas.

Examinemos los lenguajes y sistemas diseñados para enfrentar estos problemas y agregue las ventajas de SQL además de la estructura MapReduce.


Pig

El proyecto Apache Pig está diseñado como un motor para ejecutar flujos de datos en paralelo en Hadoop. Usa un lenguaje llamado Pig Latin para expresar estos flujos de datos. Con Pig Latin, puede describir como se deben leer y procesar los datos de una o más entradas y luego almacenar en una o más salidas en paralelo. El lenguaje toma una posición media entre expresar las tareas usando un modelo de consultas declarativo de alto nivel como SQL y programación de bajo nivel/procedimental usando MapReduce. Los flujos de datos en Pig Latin, pueden ser flujos lineales simples aunque también pueden ser flujos de trabajo complejos que incluyen puntos donde se relacionan varias entradas y donde los datos se dividen en varios flujos para procesarlos usando diferentes operadores.

Un programa Pig Latin consta de una serie de operaciones o transformaciones aplicadas a los datos de entrada para producir salidas. Desde el punto de vista integral, las operaciones describen un flujo de datos que el entorno de ejecución Pig traduce en una representación ejecutable y luego se ejecuta. En el trasfondo, Pig cambia las transformaciones en una serie de trabajos de MapReduce.

Con Pig, las estructuras de datos son más ricas, típicamente con múltiples valores y anidadas; además, el conjunto de transformaciones que puede aplicar a los datos es mucho más poderoso. En particular, el modelo de datos Pig Latin consta de los siguientes cuatro tipos:

  1. Atom es un valor atómico simple, tale como una cadena o número; por ejemplo: "John".
  2. Tuple es una secuencia de campos, cado uno de los cuales puede ser cualquiera de los tipos de datos; por ejemplo: ("John", "Melbourne").
  3. Bag es una colección de tuples con posibles duplicados. El esquema de tuples constituyentes es flexible donde no todas las tuples en un bag necesitan tener el mismo número y tipos de campos. Bag en Figura 1 muestra dos tuples: ("John","Melbourne") y "Alice",("UNSW" "Sydney").
    Figura 1. Un Bag
    Un Bag
  4. Map es una colección de elementos de datos, donde cada elemento tiene una clave asociada a través de la cual se puede buscar. Como sucede con bags, el esquema de los elementos de datos constituyentes es flexible; sin embargo, las claves son necesarias para los datos atoms> El Map en Figura 2) muestra elementos de datos: K1-->("John","Melbourne") y K2-->30.
    Figura 2. Un Map
    Un Map

Pig Latin incluye operadores para muchas de las operaciones de datos tradicionales (join (relacionar), sort (ordenar), filter , group by , union, etc), así como también la capacidad de los usuarios para desarrollar sus propias funciones para leer, procesar y escribir datos.

MapReduce hace el agrupamiento por medio de operación directa (del cual la mezcla plus reduce las fases que son esenciales), y suministra el orden por medio de operación indirecta por medio de la forma en que implemente el agrupamiento. El filtrado y la proyección se pueden implementar trivialmente en la fase de map. Pero otros operadores, particularmente join, no se suministran y los debe escribir el usuario. Pig suministra algunas implementaciones complejas y no triviales de estas operaciones de datos estándar. Por ejemplo, debido a que el número de registros por clave en el conjunto de datos raramente se distribuyen uniformemente, los datos enviados a los reductores a menudo se desvían. Es decir, un reductor 10 o más veces los datos que otros reductores. Pig tiene los operadores join y order by que manejarán este caso y (en algunos casos) vuelven a equilibrar los reductores. Tabla 1 describe los operadores principales del lenguaje Pig Latin.

En MapReduce, el procesamiento de datos dentro de las fases map y reduce es opaco para el sistema. Este significa que MapReduce no tiene oportunidad de optimizar o comprobar el código de los usuarios. Pig, por otra parte, puede analizar un script de Pig Latin y entiende el flujo de datos que el usuario esté describiendo. MapReduce no tiene un sistema de tipos. Esto es intencional y les da a los usuarios la flexibilidad de usar sus propios tipos de datos y estructuras de serialización. Pero la desventaja es que esto limita posteriormente la capacidad de l sistema para comprobar el código del usuario para ver si tiene errores antes y durante el tiempo de ejecución. Todos estos puntos significan que Pig Latin implica menor costo de escribir y mantener que el código Java para MapReduce.

Tabla 1. Los operadores principales del lenguaje Pig Latin.
OperadorDescripción
LOADCarga datos del sistema de archivos u otro almacenamiento de en una relación
DUMPImprime una relación a la consola del sistema FILTER
DISTINCTquita las filas duplicadas de una relación
FOREACH ... GENERATEAñade o quita campos de una relación
JOINUne dos o más relaciones
ORDEROrdenar una relación por uno o más campos
LIMITLimita el tamaño de una relación a un número máximo de tuples
STOREGuarda una relación en el sistema de archivos u otro almacenamiento
FILTERquita las filas no deseadas de una relación
GROUPAgrupa los datos de una relación simple
CROSSCrear productos cruzados de dos o más relaciones
UNIONCombina dos o más relaciones en una sola
SPLITDivide una relaciones en dos o más relaciones

Listado 5 muestra un programa simple en Pig Latin para encontrar todos los empleados con salario alto.

Listado 5. Encuentra todos los empleados con salario alto
employees = LOAD 'employee.txt' AS (id, name, salary);
highSalary = FILTER employees BY salary > 100000;
sortedList = ORDER highSalary BY salary DESC;
STORE sortedList INTO ' highSalary _Emp';
DUMP sortedList;

En este ejemplo, primero se carga el archivo de entrada en una bag llamada empleados. Luego, crear una bag llamada Salarioalto, que contiene solamente aquellos registros donde el campo salario sea mayor a 100000. La bag sortedList ordena los registros filtrados con base en el valor del salario en orden descendente. Finalmente, escribe los contenidos de la bag Listaordenada en HDFS e imprime los contenidos de bag en la pantalla.

Listado 6 muestra como describirjoin (relacionar) operaciones fácilmente usando Pig Latin.

Listado 6. join (relacionar) las operaciones se pueden describir fácilmente usando Pig Latin
employees = LOAD 'employee.txt' AS (id, name, salary, dept);
departments = LOAD 'dept.txt' AS (deptID, deptName);
joinList = JOIN employees BY dept, departments BY deptID; 
STORE joinList INTO ' joinFile';

Tradicionalmente las consultas ad-hoc se hacen en lenguajes como SQL, que facilitan la creación de preguntas para que los datos las respondan. Para buscar en datos sin procesar, algunos usuarios prefieren Pig Latin. Debido a que Pig puede operar en situaciones donde se el esquema se conoce, es incompleto o inconsistente y debido a que puede manejar fácilmente los datos anidados, los investigadores que quieran trabajar con los datos antes de se hayan limpiado y cargado en el repositorio, a menudo prefieren Pig. Los investigadores que trabajen con grandes conjuntos de datos, a menudo usan lenguajes basados en scripts, tales como Perl o Python para hacer el procesamiento. Los usuarios con estas características, a menudo prefieren paradigmas de flujos de datos de Pig sobre los paradigmas de consultas declarativas de SQL.


Hive

El proyecto Apache Hive es una solución de almacenamiento de datos de código abierto construida por el equipo de infraestructura de datos de Facebook además del entorno Hadoop. El principal objetivo de este proyecto es traer los conceptos de bases de datos relacionales familiares (por ejemplo, tablas, columnas, particiones) y un subconjunto de de SQL al mundo no estructurado de Hadoop, mientras que aún se mantiene la extensibilidad y flexibilidad que Hadoop tiene. Por consiguiente, admite todos los tipos primitivos principales (por ejemplo, integers, floats, strings) así como también tipos complejos (por ejemplo, maps, lists, structs). Hive admite consultas expresadas en un lenguaje declarativo como SQL, HiveQL (Hive Query Language) y por lo tanto cualquiera que esté familiarizado con SQL lo podrá entender. Estas consultas se compilan automáticamente en trabajos MapReduce que se ejecutan usando Hadoop. Además, HiveQL permite a los usuarios convertir scripts MapReduce personalizados en consultas.

HiveQL admite instrucciones Data Definition Language (DDL), que usted puede usar para crear, eliminar y alterar tablas de una base de datos. Permite a los usuarios cargar datos desde fuentes externas e insertar los resultados de las consultas en tablas Hive a través de la carga e insertar instrucciones del Data Manipulation Language (DML) respectivamente. Sin embargo, HiveQL actualmente no admite la actualización ni borrado de filas de las tablas existentes(en particular, las instrucciones INSERT INTO, UPDATE y DELETE ), las cuales permiten el uso de mecanismos muy simples para manejar operaciones de lecturas y escrituras simultáneas sin implementar protocolos de bloqueo complejos. El componente metastore es el catálogo del sistema Hive, el cual almacena metadatos sobre la tabla subyacente. Estos metadatos se especifican durante la creación de la tabla y se reutilizan cada vez que se referencia la tabla en HiveQL. Metastore distingue Hive como una solución de almacenamiento cuando se compara con sistemas de procesamiento de datos similares que están construidos en arquitecturas parecidas a MapReduce como Pig Latin.

Listado 7 muestra ejemplos de instrucciones HiveQL que describen las operaciones para crear una tabla, cargar un dato y hacer consultas en la tabla.

Listado 7. HiveQL statements describing the operations for creating a table, loading a data, and querying the table contents
CREATE TABLE employee (empID INT, name STRING, salary BIGINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
LOAD DATA INPATH "employee_data" INTO TABLE employee;
SELECT * FROM employee WHERE salary > 100000 SORT BY salary DESC;

Hive también admite la manipulación de datos a través de funciones creadas por el usuario (consulte Listado 8).

Listado 8. Hive admite la manipulación de datos a través de funciones creadas por el usuario
INSERT OVERWRITE TABLE employee
SELECT
TRANSFORM (empID, name, salary, address, department)
USING 'python employee_mapper.py'
AS (empID, name, salary, city)
FROM employee_data;

En general, Hive es una interfaz excelente para cualquiera que trabaje con bases de datos relacionales, aunque los detalles de la implementación subyacente no están completamente ocultos. Aunque debe preocuparse por algunas diferencias en cosas como la forma más óptima para especificar joins para obtener el mejor rendimiento y la falta de algunas características del lenguaje. Hive permite agregar código personalizado para situaciones que no concuerdan con SQL, así como también muchas herramientas para manejar entradas y salidas. Hive tiene limitaciones como la falta de compatibilidad con instrucciones UPDATE o DELETE , INSERTfilas simples y tipos de datos de fecha y hora, puesto que se tratan como cadenas.


HadoopDB

El proyecto HadoopDB, comercializado por la compañía Hadapt, es un sistema híbrido que trata de combinar las ventajas de escalabilidad de MapReduce con las ventajas del rendimiento y eficiencia de las bases de datos en paralelo. La idea básica detrás de HadoopDB es conectar varios sistemas de bases de datos de nodos simples (PostgreSQL) usando Hadoop como coordinador de tareas y la capa de comunicación de red. Las consultas se expresan en SQL pero sus ejecuciones se paralelizan a través de nodos usando la estructura MapReduce, puesto que dicho trabajo único se incluye, lo máximo posible, en la base de datos del nodo correspondiente.

En general, los sistemas de bases de datos en paralelo han estado disponibles por cerca de dos décadas y actualmente existen cerca de una docena de diferentes implementaciones en el mercado (por ejemplo, Teradata, Aster Data, Greenplum). El principal objetivo de estos sistemas es mejorar el rendimiento a través de la paralelización de varias operaciones, tales como carga de datos, construcción de índices y evaluación de consultas. En general, algunas razones principales convierten a MapReduce en un método preferido sobre los sistemas a RDBMS en paralelo en algunos escenarios:

  • Formatear y cargar grandes cantidades de datos en un sistema RDBMS en paralelo de manera oportuna es un desafío y consume mucho tiempo.
  • Los registros de datos de entrada podrían no siempre seguir el mismo esquema. Los programadores a menudo desean la flexibilidad para agregar y quitar atributos y la interpretación de los registros de datos de entrada también pueden cambiar con el tiempo.
  • El procesamiento de datos a gran escala puede consumir mucho tiempo y por lo tanto es importante mantener trabajos de análisis vigentes incluso en el evento de fallas. Aunque la mayoría de los sistemas RDBMS en paralelo admiten tolerancia a las fallas, una consulta usualmente tiene que reiniciarse desde cero, incluso si solamente un solo nodo del conjunto falla. En contraste, MapReduce maneja mejor las fallas y puede rehacer solamente la parte de la computación perdida debido a la falla.

La comparación entre la estructura MapReduce y los sistemas de bases de datos en paralelo es un debate desde hace mucho tiempo. Se ha realizado una comparación a gran escala entre la implementación Hadoop de la estructura MapReduce y los sistemas de administración de bases de datos SQL en paralelo, en términos de rendimiento y complejidad de desarrollo. Los resultados de esta comparación muestra que los sistemas de bases de datos en paralelo, mostraron una ventaja significativa de rendimiento sobre MapReduce al ejecutar una variedad de tareas de análisis intensos de datos. Por otra parte, la implementación Hadoop fue más fácil y sencilla de configurar y usar, en comparación con los sistemas de bases de datos en paralelo. MapReduce también ha mostrado tener un rendimiento superior en minimizar la cantidad de trabajo que se pierde cuando se presente una falla de hardware. Además, MapReduce (con sus implementaciones de código abierto) representa una solución muy barata en comparación con las soluciones DBMS en paralelo que son muy costosas.

Originalmente, las aplicaciones principales de la estructura MapReduce se enfocaba en el análisis de conjuntos de datos no estructurados muy grandes, tales como: indexación web, analítica de textos y minería de datos gráficos. Recientemente, debido a que MapReduce se está desarrollando establemente en el estándar de análisis de datos de facto, se usa con frecuencia en las consultas de datos estructurados. Durante mucho tiempo, las bases de datos relacionales dominaron los desarrollos de los sistemas de almacenamiento de datos y el rendimiento de los trabajos analíticos de los datos estructurados. El interés está aumentando por combinar MapReduce y sistemas de bases de datos relacionales para mantener los beneficios de ambas tecnologías. En particular, HadoopDB trata de alcanzar tolerancia a las fallas y la capacidad de operar en entornos heterogéneos al heredar la implementación de planificación y seguimiento de trabajos de Hadoop. Trata de obtener los beneficios de rendimiento de las bases de datos en paralelo al realizar la mayoría del procesamiento de consultas dentro del motor de bases de datos.

Figura 3 ilustra la arquitectura de HadoopDB la cual consta de dos capas: 1) Una capa de almacenamiento de datos o el HDFS y 2) una capa de almacenamiento de datos o la estructura MapReduce.

Figura 3. La arquitectura de HadoopDB
La arquitectura de HadoopDB

En esta arquitectura, HDFS es un sistema de archivos estructurado por bloques manejado por un nodo de nombres central. Los archivos individuales se descomponen en bloques de tamaño fijo y distribuidos en varios nodos de datos del conjunto. El nodo de nombres mantiene los metadatos sobre el tamaño y ubicación de los bloques, así como también sus réplicas. La estructura MapReduce sigue una arquitectura simple maestro-esclavo. El maestro es un rastreador de trabajos simple y el esclavo o los nodos de trabajo son rastreadores de tareas. El rastreador de trabajos maneja la planificación del tiempo de ejecución de los trabajos MapReduce y mantiene información de cada carga del rastreador de tareas y los recursos disponibles. El conector de bases de datos es la interfaz entre los sistemas de bases de datos independientes que residen en los nodos del conjunto y de los rastreadores de tareas. El conector se conecta a la base de datos, ejecuta la consulta de SQL y devuelve los resultados como pares de valores claves. El componente Catálogo, mantiene los metadatos sobre las bases de datos, sus ubicaciones, ubicaciones de réplicas y propiedades de particiones de datos. El componente Cargador de datos se encarga de reparticionar globalmente los datos en una clave de partición dada después de cargar y descomponer los datos de nodos simples en varias particiones más pequeñas o fragmentos. El planificador SMS extiende el traductor HiveQL y transforma SQL en trabajos MapReduce que conectan las tablas almacenadas como archivos en HDFS.


Jaql

Jaql es un lenguaje de consultas diseñado para la JavaScript Object Notation (JSON), un formato de datos popular debido a su simplicidad y flexibilidad de modelado. JSON es sencillo, aunque es flexible para representar datos que oscilan entre datos planos a datos XML semiestructurados. Jaql se usa principalmente para analizar datos semiestructurados a gran escala. Es un lenguaje de consultas funcional, declarativo que reescribe consultas de alto nivel, cuando sea apropiado, en consultas de bajo nivel que constan de trabajos MapReduce que son evaluados usando el proyecto Apache Hadoop. Las características principales son la extensibilidad y el paralelismo. Jaql consta de un lenguaje para scripts y un compilador, así como también un componente en tiempo de ejecución. Puede procesar ya sea que no tenga esquemas o que tenga solamente un esquema parcial. Sin embargo, Jaql también puede explotar la información de esquema rígidos cuando esté disponible, tanto para la comprobación de tipos como el rendimiento mejorado. El siguiente fragmento en Listado 9 presenta una muestra de un documento JSON.

Listado 9. Una muestra de un documento JSON.
[
  { id: 10,
    name: "Joe Smith",
    email: "JSmith@email.com",
    zip: 85150
  },
  { id: 20,
    name: "Alice Jones",
    email: "AJones@email.com",
    zip: 82116
  }
]

Jaql usa un modelo de datos muy sencillo, un valor JDM (Jaql Data Model) que puede ser un atom, array o record. Se admiten la mayoría de los tipos atómicos comunes como strings, numbers, nulls y dates (cadenas, números, nulos y fechas). Los Arrays y records son tipos compuestos que se pueden anidar arbitrariamente. Más detalladamente, un array es una colección ordenada de valores y se puede usar para modelar estructuras de datos, tales como vectores, listas, conjuntos o bags. Un record es una colección no ordenada de pares de valores de nombres y permite modelar estructuras, diccionarios y mapas. A pesar de su simplicidad, JDM es muy flexible. Permite a Jaql operar con una variedad de representaciones de datos diferentes para entradas y salidas, como archivos de texto delimitados, archivos JSON, archivos binarios, archivos de secuencias de Hardtop, bases de datos relacionales, almacenamientos de valores claves o documentos XML. Las funciones son los valores de primera clase en Jaql. Se pueden asignar a una variable y son de alto orden en el sentido de que se pueden pasar como parámetros o usar como valor devuelto. Las funciones son el ingrediente primordial para la reutilización, debido a que cualquier expresión Jaql se puede encapsular como una función y una función se puede parametrizar de formas poderosas. Listado 10 es un ejemplo de un script Jaql que consta de una secuencia de operadores.

Listado 10. Script Jaql que consta de una secuencia de operadores.
import myrecord;
countFields = fn(records) (
records
-> transform myrecord::names($)
-> expand
-> group by fName = $ as occurrences
into { name: fName, num: count(occurrences) } 
);
read(hdfs("docs.dat"))
-> countFields()
-> write(hdfs("fields.dat"));

El operador read carga los datos sin procesar, en este caso del Hadoop Distributed File System (HDFS) y los convierte en valores Jaql. El subflujo countFields procesa estos valores, el cual extrae los nombres de los campos y calcula sus frecuencias. Finalmente, el operador write almacena los resultados de nuevo en HDFS. Tabla 2 describe expresiones importantes del lenguaje basado en scripts Jaql

Tabla 2. Expresiones importantes del lenguaje basado en scripts Jaql
ExpresiónDescripción
transformLa expresión transform aplica una función (o proyección) a cada elemento de un array para producir un nuevo array.
expandLa expresión expand se usa a menudo para desanidar su array de entrada.
group by Similar a GROUP BY en SQL, la expresión group by en Jaql particiona su entrada en expresiones de grupos y aplica una expresión de agregación a cada grupo.
Filter La expresión filter retiene los valores de entrada para los cuales un predicado específico se evalúa como verdadero.
JoinLa expresión join admite equijoin de 2 o más entradas. Todas las opciones de inner y outer joins también se admiten.
UnionLa expresión union es una función de Jaql que combina varios arrays en un solo array de salida.
Control-flowLas dos expresiones control-flow más usadas en Jaql son: if-then-else y las expresiones block. La expresión if-then-else es similar a las expresiones condicionales de la mayoría de los lenguajes de programación y de scripts. Un block establece un alcance local donde cero o más variables locales se pueden declarar y la última instrucción suministrar un valor devuelto del block.

A alto nivel, la arquitectura Jaql descrita en Figura 4 es similar a la de la mayoría de los sistemas de bases de datos.

Figura 4. La arquitectura del sistema Jaql
La arquitectura del sistema Jaql

Los scripts se pasan al sistema desde el intérprete o una aplicación, compilados por el analizador sintáctico y el motor de reescritura y explicado o evaluado posteriormente sobre los datos de la capa de E/S. La capa de almacenamiento es similar a una base de datos federada. Suministra una API para acceder a los datos de sistemas diferentes incluidos los sistemas de archivos locales o distribuido (tales como HDFS de Hadoop), sistemas de bases de datos (tales como DB2, Netezza, HBase) o desde fuentes de transferencias como la web. A diferencia de las bases de datos federadas, sin embargo, la mayoría de los datos accedidos se almacenan dentro del mismo conjunto y la API de E/S describe el particionamiento de datos, lo cual permite el paralelismo con afinidad de datos durante la evaluación. Jaql debe la mayor parte de su flexibilidad a la API de E/S de Hadoop. Lee y escribe muchos formatos de archivos comunes (tales como archivos delimitados, texto JSON y archivos de secuencias Hadoop). Los adaptadores personalizados se escriben fácilmente para asignar un conjunto de datos a o desde el modelo de datos Jaql. La entrada simplemente pueden ser valores construidos en el mismo script. El intérprete Jaql evalúa el script localmente en la computadora que compiló el script, pero que inicia los intérpretes en los modos remotos usando MapReduce. El compilador Jaql automáticamente detecta las oportunidades de paralelización en un script Jaql y las traduce en un conjunto de trabajos MapReduce.


Conclusión

MapReduce ha surgido como una forma popular para manejar el poder de grandes conjuntos de computadoras. Actualmente, MapReduce actúa como una plataforma para el análisis de una cantidad considerable de datos masivos. Permite a los programadores pensar de una manera centrada en los datos, en donde se pueden enfocar en la aplicación de transformaciones a conjuntos de registros de datos, mientras que los detalles de la ejecución distribuida y la tolerancia a las fallas los manejan transparentemente la estructura MapReduce. En la práctica, muchos programadores prefieren usar lenguajes declarativos (o similares a SQL) de alto nivel para implementar sus trabajos de análisis de datos paralelizados a gran escala, mientras que dejan todo los detalles de optimización de la ejecución al motor en backend. En este artículo, a visto generalidades modernas de las interfaces declarativas de alto nivel para la estructura MapReduce. Minimizar su carga de programación con abstracciones de lenguajes de alto nivel que permitan a los sistemas subyacentes realizar las optimizaciones automáticas a nivel de ejecución y mejorar el rendimiento de las tareas de usuarios.

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

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 se registra en developerWorks, se crea un perfil para usted. Información sobre su perfil (nombre, país/región y compañia) estará disponible al público y acompañará cualquiera de sus publicaciones. Puede actualizar su cuenta 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, tecnologia Java
ArticleID=830025
ArticleTitle=Use lenguajes semejantes a SQL para la estructura de MapReduce
publish-date=08142012