martes, junio 03, 2014

Usar un cluster de Hadoop con Pig (modo distribuido)

Vamos a contar palabras de nuevo en modo distribuido con Hadoop y Pig. Para realizar este tutorial, que en realidad es tremendamente sencillo; hay que tener un cluster de Hadoop corriendo en modo distribuido (o pseudo-distribuido) y tener una instalación completa de Pig.

  1. Instalando Apache Hadoop en modo Pseudo-Distribuido
  2. Primeros pasos con Apache Pig. Usando Pig para hacer un contador de palabras
  3. Creando scripts en Apache Pig para Hadoop
Cuando tengamos el paso 3 terminado, tendremos un fichero con un script en Pig listo para ejecutarse en el cluster. Supongamos que el nombre del script es "wordcountPig.pig" y que el fichero del que queremos contar se llama "prueba.txt".

Lo primero que tendremos que hacer es arrancar el cluster de Hadoop como indica el primero de los tutoriales y copiar el fichero "prueba.txt" al HDFS


hadoop fs -mkdir /pig
hadoop fs -put prueba.txt /pig


Una vez tengamos el fichero dentro del HDFS, vamos a usar el mismo script del tercer tutorial con una ligera variación para indicarle la localización del fichero:
/* Cargar el fichero */
myfile = LOAD '/pig/tweets' AS (words:chararray);
 
/* Separar las palabras dentro de cada linea */
wordsList = FOREACH myfile GENERATE TOKENIZE($0);
 
/* Separar las palabras a una linea por palabra */
words = FOREACH wordsList GENERATE FLATTEN($0);       
 
/* Agrupar las palabras iguales en la misma linea */
groupedWords = GROUP words BY $0;
 
/* Contar las palabras */
final = FOREACH groupedWords GENERATE $0, COUNT($1);  
 
/* Ordenar las palabras */
sortedWords = ORDER final BY $1 ASC;
 
/* Guardar los resultados en una carpeta llamada pig_wordcount */
STORE sortedWords into '/pig/pig_wordcount';


Las dos líneas que han variado son la que indica la ruta para cargar el fichero y la última, que indica la ruta donde guardar el fichero con los resultados.
Por último, vamos a ejecutar el script:
pig wordcount.pig


Cabe resaltar que esta vez hemos omitido el "-x" y la palabra "local" ya que vamos a hacer una ejecución real dentro del cluster. El resultado se guarda también dentro del HDFS y es el esperado:

hadoop fs -ls /user/MaC/pig/pig_wordcount
Found 3 items
-rw-r--r--   2 mariocaster supergroup          0 2014-06-02 17:43 /pig/pig_wordcount/_SUCCESS
drwxr-xr-x   - mariocaster supergroup          0 2014-06-02 17:42 /pig/pig_wordcount/_logs
-rw-r--r--   2 mariocaster supergroup       6768 2014-06-02 17:43 /pig/pig_wordcount/part-r-00000

Podéis ver el resultado del script en el archivo part-r-00000. Espero que os haya gustado.