Procese sus datos con Apache Pig

Obtenga la información que necesita de grandes conjuntos de datos con Apache Pig

Apache Pig es un lenguaje de procedimientos de alto nivel para consultar grandes conjuntos de datos semiestructurados utilizando Hadoop y la plataforma MapReduce. Pig simplifica el uso de Hadoop al permitir consultas similares a SQL en un conjunto de datos distribuidos. Explore el lenguaje detrás de Pig y descubra su uso en un clúster Hadoop simple.

M. Tim Jones, Independent author, Consultant

M.Tim JonesM. Tim Jones es arquitecto de firmware integrado y autor de Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (actualmente en su segunda edición), AI Application Programming (en su segunda edición) y BSD Sockets Programming from a Multilanguage Perspective. Su experiencia en ingeniería va desde el desarrollo de kernels para vehículos espaciales geosincronizados hasta arquitectura de sistemas incorporados y desarrollo de protocolos de redes. M. Tim Jones es arquitecto de plataforma en Intel y autor en Longmont, Colorado, EE.UU.



25-09-2012

Conéctese con Tim

Tim es uno de nuestros más populares y prolíficos autores. Navegue por sus artículos en all of Tim's articles en developerWorks. Visite su perfil en Tim's profile y conéctese con él, con otros autores y con colegas desarrolladores en developerWorks community.

No es de extrañar que el ecosistema de Hadoop, debido a su popularidad, se encuentre en crecimiento. Un área en particular que avanza es la programación de aplicaciones Hadoop. Aunque la programación de aplicaciones Map y Reduce no es excesivamente compleja, hacerla requiere cierta experiencia en desarrollo de software. Apache Pig modifica esto al crear una abstracción de lenguaje de procedimiento más simple sobre MapReduce para exponer una interfaz más parecida con Structured Query Language (SQL) para aplicaciones Hadoop. Entonces, en vez de escribir una aplicación de MapReduce separada, se puede escribir un único script en Pig Latin que es automáticamente paralelizado y distribuido a través de un clúster.

Ejemplo de Pig Latin

Comencemos con un ejemplo sencillo de Pig y analicémoslo en detalle. Un uso interesante de Hadoop es buscar un conjunto grande de datos para registros que cumplan un determinado criterio de búsqueda (también conocido en Linux® como grep). Listado 1 muestra la simplicidad de este proceso en Pig. Dadas las tres líneas que se muestran, solo una es la búsqueda real. La primera línea simplemente lee el conjunto de datos de prueba (el registro de mensajes) en una bolsa (bag) que representa una colección de tuplas. Estos datos se filtran (la única entrada en la tupla, representada por $0o campo 1) con una expresión regular, buscando la secuencia de caracteres WARN. Por último, usted guarda la bolsa, que ahora representa las tuplas de los mensajes que contienen WARN en un nuevo archivo denominado warnings en el sistema de archivos de host.

Listado 1. Un script simple de Pig Latin
messages = LOAD 'messages';
warns = FILTER messages BY $0 MATCHES '.*WARN+.*';
STORE warns INTO 'warnings';

Como usted puede ver, este sencillo script implementa un flujo simple pero es necesario bastante más código para implementarlo directamente en el modelo tradicional de MapReduce. Esto facilita considerablemente aprender Hadoop y comenzar a trabajar con los datos, en comparación con el desarrollo bruto.

Ahora vamos a profundizar un poco más en el lenguaje Pig y luego ver otros ejemplos de las capacidades del lenguaje.


Los fundamentos de Pig Latin

Pig Latin es un lenguaje relativamente sencillo que ejecuta instrucciones (statements). Un statement es una operación que toma una entrada (como una bolsa, que representa un conjunto de tuplas) y emite otra bolsa como su salida. Un bag es una relación, semejante a una tabla, que usted encuentra en una base de datos relacionales (donde las tuplas representan las filas y las tuplas individuales se componen de campos).

Un script en Pig Latin a menudo sigue un formato específico en el cual los datos se leen desde el sistema de archivos, una cantidad de operaciones se realizan en los datos (transformándolos en una o más formas) y, entonces, la relación resultante se escribe de vuelta en el sistema de archivos. Usted puede ver este patrón en su forma más simple (con una transformación) en el Listado 1.

Pig cuenta con un amplio conjunto de tipos de datos, dando soporte no sólo a conceptos de alto nivel, como bolsas, tuplas y mapas, sino también a tipos de datos simples como ints, longs, floats, doubles, chararrays y bytearrays. Con los tipos simples, encontrará una gama de operadores aritméticos (como add, subtract, multiply, dividey module) además de un operador condicional denominado bincond que opera de manera semejante al operador C ternary . Y como era de esperar, un conjunto completo de operadores de comparación, incluyendo coincidencia de patrones ricos utilizando expresiones regulares.

Todos las instrucciones de Pig Latin operan en relaciones (y se denominan operadores relacionales). Como usted ha visto en el Listado 1, hay un operador para cargar datos desde el sistema de archivos y para almacenar datos en el mismo. Existe una manera de filtrar datos, mediante el operador FILTER , iterando las filas de una relación. Esta funcionalidad normalmente se utiliza para eliminar de la relación datos que no son necesarios para las operaciones subsiguientes. Alternativamente, si es necesario iterar las columnas de una relación en vez de las filas, usted puede utilizar el operador FOREACH . FOREACH permite operaciones anidadas como FILTER y ORDER para transformar los datos durante la iteración.

El operador ORDER proporciona la habilidad de clasificar una relación basado en uno o más campos. El operador JOIN realiza una unión interna o externa de dos o más relaciones basado en campos comunes. El operador SPLIT proporciona la habilidad de dividir una relación en dos o más relaciones basado en una expresión definida por el usuario. Por último, el operador GROUP agrupa los datos en una o más relaciones basado en alguna expresión. La Tabla 1 proporciona una lista parcial de operadores relacionales en Pig.

Tabla 1. Lista incompleta de operadores relacionales de Pig Latin
OperadorDescripción
FILTERSelecciona un conjunto de tuplas de una relación basado en una condición.
FOREACHItera las tuplas de una relación generando una transformación de datos.
GROUPAgrupa los datos en una o más relaciones
JOINUne dos o más relaciones (unión interna o externa)
LOADCarga datos desde el sistema de archivos
ORDERClasifica una relación basado en uno o más campos.
SPLITParticiona una relación en una o más relaciones.
STOREAlmacena datos en el sistema de archivos

Aunque esta no es un lista completa de los operadores en Pig Latin, esta tabla provee un conjunto muy útil de operaciones para procesar grandes conjuntos de datos. Usted puede saber más sobre el lenguaje a través de Recursos; Pig cuenta con un buen conjunto de documentación online. Ahora, practique escribir algunos scripts de Pig Latin para comprender cómo estos operadores funcionan en la práctica.


Accediendo a Pig

En anteriores artículos sobre Hadoop, adopté el enfoque de instalar y configurar Hadoop como un paquete. Pero Cloudera ha hecho aún más fácil usar Hadoop al empaquetarlo con Linux como un dispositivo virtual. Y aunque es una descarga grande, la máquina virtual (VM) es predefinida y configurada no sólo con Hadoop, sino que también con Apache Hive y Pig. Así, con una descarga y un hipervisor tipo 2 (VirtualBox o Kernel-based Virtual Machine [KVM]) disponible gratuitamente, usted cuenta con un entorno Hadoop completo, preconfigurado y listo para funcionar.


Haciendo funcionar Hadoop y Pig

Una vez que haya descargado su archivo VM específico, usted deberá crear una VM para su hipervisor particular. En Recursosusted encuentra instrucciones paso a paso para hacerlo.

Memoria de Cloudera VM

Descubrí que la VM no funciona correctamente con asignación de memoria de 1 GB. Asignando el doble o triple de esa memoria se obtiene un funcionamiento normal (es decir, Java™ sin problemas de espacio para heap).

Una vez que se crea la VM, usted puede iniciarla a través de VirtualBox, que arranca el kernel de Linux y comienza todos los daemons de Hadoop necesarios. Completado el arranque, empiece creando un terminal para comunicarse con Hadoop y Pig.

Usted puede usar Pig de dos maneras. La primera es modo Local, que no depende de Hadoop o Hadoop Distributed File System (HDFS), que ejecutan todo en una única máquina virtual Java (JVM) en el contexto de sistema local de archivos. La otra es modo Mapreduce, que utiliza un sistema de archivos Hadoop y clúster.

Pig en Modo Local

Para el modo Local, simplemente inicie Pig y especifique modo Local con la opción exectype . Al hacerlo, llega al Grunt shell que le permite introducir interactivamente instrucciones de Pig:

$ pig -x local
... grunt>

Desde aquí, usted puede interactivamente codificar su script Pig Latin y ver el resultado obtenido con cada operador. Vuelva al Listado 1 y pruebe este script (vea el Listado 2). Note en este caso que en lugar de almacenar sus datos en un archivo, usted sencillamente los vuelca como un conjunto de relaciones. Usted notará en el resultado modificado que cada línea de registro (que coincide con el criterio de búsqueda definido por FILTER) en sí, es una relación (unida por paréntesis [()]).

Listado 2. Usando Pig interactivamente en Modo Local
grunt> messages = LOAD '/var/log/messages';
grunt> warns = FILTER messages BY $0 MATCHES '.*WARN+.*';
grunt> DUMP warns
...
(Dec 10 03:56:43 localhost NetworkManager: <WARN> nm_generic_enable_loopback(): error ...
(Dec 10 06:10:18 localhost NetworkManager: <WARN> check_one_route(): (eth0) error ...
grunt>

Si ha especificado el operador STORE , sus datos deben haberse generado en un directorio de nombre especificado (no un simple archivo regular).

Pig en Modo Mapreduce

Para el modo MapReduce, primero debe asegurarse que Hadoop se esté ejecutando. La manera más fácil de hacerlo es realizar una operación de lista de archivos en la raíz del árbol del sistema de archivos Hadoop, como en el Listado 3.

Listado 3. Prueba de disponibilidad de Hadoop
$ hadoop dfs -ls /
Found 3 items
drwxrwxrwx   - hue    supergroup          0 2011-12-08 05:20 /tmp
drwxr-xr-x   - hue    supergroup          0 2011-12-08 05:20 /user
drwxr-xr-x   - mapred supergroup          0 2011-12-08 05:20 /var
$

Como se muestra, este código resultará en un listado de uno o más archivos si Hadoop se ejecuta satisfactoriamente. Ahora, probemos Pig. Empiece por iniciar Pig, y luego cambie el directorio a su raíz de hdfs para determinar si usted puede visualizar lo que vio externamente en HDFS (vea el Listado 4).

Listado 4. Prueba de Pig
$ pig
2011-12-10 06:39:44,276 [main] INFO  org.apache.pig.Main - Logging error messages to...
2011-12-10 06:39:44,601 [main] INFO  org.apache.pig.... Connecting to hadoop file \
system at: hdfs://0.0.0.0:8020
2011-12-10 06:39:44,988 [main] INFO  org.apache.pig.... connecting to map-reduce \
job tracker at: 0.0.0.0:8021
grunt> cd hdfs:///
grunt> ls
hdfs://0.0.0.0/tmp     <dir>
hdfs://0.0.0.0/user    <dir>
hdfs://0.0.0.0/var     <dir>
grunt>

Hasta ahora, bien. Usted puede ver el sistema de archivos Hadoop desde dentro de Pig, así que ahora trate de leer algunos datos desde su sistema de archivos local de host. Copie un archivo desde el modo local al modo HDFS mediante Pig (vea el Listado 5).

Listado 5. Obteniendo algunos datos de prueba
grunt> mkdir test
grunt> cd test
grunt> copyFromLocal /etc/passwd passwd
grunt> ls
hdfs://0.0.0.0/test/passwd<r 1> 1728

A continuación, con sus datos de prueba ahora seguros en el sistema de archivos de Hadoop, usted puede probar otro script. Note que usted puede ejecutar cat en el archivo dentro de Pig para ver sus contenidos (sólo para ver si está allí). En este ejemplo particular, identifique la cantidad de shells especificada para usuarios dentro del archivo passwd (la última columna dentro de passwd).

Para empezar, es necesario cargar su archivo passwd desde HDFS en una relación de Pig. Usted lo hace antes de utilizar el operador LOAD , pero en este caso, usted desea analizar los campos del archivo passwd hasta sus campos individuales. En este ejemplo, especifique la función PigStorage , que le permite indicar el carácter delimitador para el archivo (en este caso, un carácter de dos puntos [ :]). Usted también especifica los campos individuales (o el esquema) con la palabra clave AS , incluyendo sus tipos individuales (vea el Listado 6).

Listado 6. Leyendo su archivo en una relación
grunt> passwd = LOAD '/etc/passwd' USING PigStorage(':') AS (user:chararray, \
passwd:chararray, uid:int, gid:int, userinfo:chararray, home:chararray, \
shell:chararray);
grunt> DUMP passwd;
(root,x,0,0,root,/root,/bin/bash)
(bin,x,1,1,bin,/bin,/sbin/nologin)
...
(cloudera,x,500,500,,/home/cloudera,/bin/bash)
grunt>

A continuación, utilice el operador GROUP para agrupar las tuplas en esta relación basado en sus shells (vea el Listado 7). Vacíe esto nuevamente, solo para ilustrar el resultado del operador GROUP . Note aquí que usted tiene tuplas agrupadas (como una bolsa interior) bajo su shell particular utilizado (con el shell especificado al comienzo).

Listado 7. Agrupando las tuplas como una función de su shell
grunt> grp_shell = GROUP passwd BY shell;
grunt> DUMP grp_shell;
(/bin/bash,{(cloudera,x,500,500,,/home/cloudera,/bin/bash),(root,x,0,0,...), ...})
(/bin/sync,{(sync,x,5,0,sync,/sbin,/bin/sync)})
(/sbin/shutdown,{(shutdown,x,6,0,shutdown,/sbin,/sbin/shutdown)})
grunt>

Pero su deseo es una cuenta de los shells exclusivos especificados en el archivo passwd. Entonces, usted debe utilizar el operador FOREACH para iterar las tuplas de su grupo y ejecutar COUNT sobre el número que aparece (vea el Listado 8).

Listado 8. Agrupando los resultados con cuentas para cada shell
grunt> counts = FOREACH grp_shell GENERATE group, COUNT(passwd);
grunt> DUMP counts;
...
(/bin/bash,5)
(/bin/sync,1)
(/bin/false,1)
(/bin/halt,1)
(/bin/nologin,27)
(/bin/shutdown,1)
grunt>

Nota: Para ejecutar este código como un script, sencillamente escriba su script en un archivo y ejecútelo como pig myscript.pig.


Operadores de diagnóstico

Pig da soporte a una cantidad de operadores que usted puede utilizar para depurar scripts de Pig. Como usted ha visto en los anteriores ejemplos de Pig, el operador DUMP es muy útil para visualizar no solo datos sino que también el esquema de los datos en sí. Usted también puede utilizar el operador DESCRIBE para generar un formato detallado de un esquema de relación (campo y tipo).

El operador EXPLAIN es mucho más complejo pero útil. Para una relación dada, usted puede usar EXPLAIN para ver cómo los operadores físicos se agrupan en un mapa y reducen las tareas (es decir, cómo se derivan los datos). La

Tabla 2 proporciona una lista de operadores de diagnóstico en Pig Latin y sus descripciones.

Tabla 2. Operadores de diagnóstico de Pig Latin
OperadorDescripción
DESCRIBERetorna el esquema de una relación.
DUMPVuelca los contenidos de una relación en la pantalla.
EXPLAINExhibe los planes de ejecución de MapReduce.

Funciones definidas por el usuario

Aunque Pig es poderoso y útil en el contexto explorado en este artículo, puede hacerse aún más poderoso a través de funciones definidas por el usuario (UDFs). Los scripts de Pig pueden utilizar funciones que usted define para, por ejemplo, analizar datos de entrada o formatear datos de salida e, incluso, operadores. Las UDFs se escriben en lenguaje Java y permiten a Pig dar soporte al procesamiento personalizado. Las UDFs son la manera de extender Pig en su dominio de aplicación particular. Usted puede aprender más sobre desarrollo de UDFs en Recursos.


Usuarios de Pig

Como usted puede ver en este breve artículo, Pig es una poderosa herramienta para consultar datos en un clúster Hadoop. Es tan poderosa que Yahoo! estima que entre 40% y 60% de su cargas de trabajo Hadoop se generan de scripts de Pig Latin. Con 100.000 CPUs en Yahoo! y aproximadamente 50% ejecutando Hadoop, son muchos pigs por todas partes.

Pero Yahoo! no es la única organización aprovechando Pig. Usted encuentra Pig en Twitter (registros de procesamiento, minería de datos tweet), en AOL y MapQuest (para análisis y procesamiento de datos por lotes) y en LinkedIn, donde Pig se utiliza para descubrir personas que podría conocer. Ebay, según se informa, utiliza Pig para optimización de búsqueda, y Adyard utiliza Pig en la mitad de su sistema de recomendación.


Avanzando

Nada menos que un libro para poder enumerar la potencia detrás de Pig para el procesamiento de datos grandes. Pig facilita, incluso para los no desarrolladores, realizar el procesamiento de datos grandes en un clúster Hadoop. Pig fue originalmente desarrollado por Yahoo! en 2006 y poco después se trasladó a Apache Software Foundation para poder ser utilizado a nivel mundial. Ese movimiento fue un resultado del reconocimiento de los investigadores de Yahoo! de la potencia que Pig proporcionaba a los no desarrolladores. Debido a la creciente popularidad de Hadoop como una infraestructura, es el ecosistema de Hadoop que cambiará la cara de los datos grandes y su uso creciente.

Recursos

Aprender

  • Apache website es la fuente de información sobre Pig, incluyendo noticias de actualidad, software más reciente, cómo iniciar y cómo participar.
  • Hadoop Demo VM es por mucho la manera más sencilla de ejecutar una instancia de Hadoop. La VM contiene todo lo que usted necesita, incluyendo Hadoop, Hive y Pig en un sistema operativo CentOS Linux.
  • Cloudera Training VM es una excelente manera de comenzar con Hadoop. Minimiza la cantidad de configuraciones necesarias y le permite iniciar fácilmente el procesamiento de conjuntos de datos con Hadoop y Pig.
  • Virtual appliances and the Open Virtualization Format (M. Tim Jones, developerWorks, octubre de 2009) explora el uso de dispositivos virtuales como una nueva forma de entrega de software. Los dispositivos virtuales permiten la distribución de software preconfigurado (con sistema operativo) como una VM.
  • Pig cuenta con una gran cantidad de recursos online, abarcando manuales de referencia, libros de recetas y otros recursos. Pig también cuenta con dos manuales correctamente escritos (part 1 y part 2), un script cookbooky un UDF guide.
  • Una gran cantidad de usuarios de Pig se compone de importantes propiedades web. Sepa sobre la variedad de empresas en la web que usan Pig en páginas PoweredBy de Apache.
  • En la zona developerWorks Linux: encuentre cientos de artículos "cómo hacer" y tutoriales, así como descargas, foros de discusión y gran cantidad de otros recursos para desarrolladores y administradores de Linux.
  • En Open Source developerWorks zone ofrece abundante información sobre herramientas y usos de tecnologías de fuente abierta.
  • Permanezca actualizado con los Eventos técnicos y webcasts de developerWorks enfocados en una variedad de productos IBM y de temas de la industria de TI.
  • Asista a presentaciones breves developerWorks en vivo, para actualizarse rápidamente sobre productos y herramientas IBM y sobre las tendencias de la industria.
  • Vea developerWorks on-demand demos que van desde demostraciones sobre instalación y configuración de productos para principiantes, hasta funcionalidades avanzadas para desarrolladores experimentados.
  • Siga a Tim on Twitter. Usted también puede seguir developerWorks en Twittero suscribirse a un feed de Linux tweets on developerWorks.

Obtener los productos y tecnologías

  • Evaluate IBM products de la manera que le convenga: descargue una evaluación de producto, pruebe un producto online, úselo en un entorno de nube o pase algunas horas en SOA Sandbox aprendiendo a implementar con eficiencia la Arquitectura Orientada a Servicios.

Comentar

  • Participe en developerWorks community. Conéctese con otros usuarios developerWorks mientras explora los blogs, foros, grupos y wikis dirigidos a desarrolladores.

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=Linux
ArticleID=837101
ArticleTitle=Procese sus datos con Apache Pig
publish-date=09252012