martes, junio 03, 2014

Apache Hive: Escribiendo scripts en Hive para ejecutarlos en un cluster Hadoop

Creando el script

El script es, de nuevo, el contador de palabras que hicimos en un tutorial anterior (Primeros pasos con Apache Hive. Creando el contador de palabras en Apache Hive). El script va a importar un fichero del HDFS y creará una tabla para hacer consultas en el mismo. Luego, creará una tabla nueva con el resultado del conteo de palabras. El script es el siguiente:

CREATE TABLE IF NOT EXISTS ejemplo (linea STRING);

LOAD DATA INPATH '/user/MaC/pg4300.txt' OVERWRITE INTO TABLE ejemplo;

CREATE TABLE contador AS 
 SELECT palabra, count(1) AS cuenta 
 FROM (SELECT explode(split(linea,' ')) AS palabra FROM ejemplo) w 
 GROUP BY palabra 
 ORDER BY cuenta;

El cual, crea una tabla llamada "ejemplo" donde vuelca los contenidos del fichero pg4300.txt. De hecho se puede ver el contenido de este dentro del cluster en la ruta del warehouse de Hive:

hadoop fs -cat /user/hive/warehouse/ejemplo/pg4300.txt

También crea otra tabla llamada "contador" con las columnas "palabra" y "cuenta" que guarda el resultado del conteo de palabras.

El cluster de Hadoop

Si no tienes un cluster de Hadoop todavía o no sabes como arrancarlo, te recomiendo que te pases por este tutorial para saber el método para instalar uno: Instalando Hadoop en modo pseudo-distribuido.

Copiando datos al HDFS para probar

Vamos a usar el poema "Rime of the ancient mariner" de Samuel Taylor Coleridge (para los que no lo sepan, Iron Maiden tiene una versión del mismo). El archivo se llama pg4300.txt y tenemos que copiarlo al HDFS de la siguiente manera:

hadoop fs -copyFromLocal pg4300.txt /user/mariocaster

Ahora, la localización de nuestro fichero sería hdfs://localhost/user/mariocaster/pg4300.txt

Ejecutando el script

La ejecución del script es sencilla. Solamente hay que llamar al comando hive -f y pasarle el nombre del fichero que, en nuestro caso, hemos llamado "wordcount.q"

$ $HIVE_HOME/bin/hive -f wordcount.q

Logging initialized using configuration in jar:file:/var/hadoop/hive/lib/hive-common-0.13.0.jar!/hive-log4j.properties
OK
Time taken: 1.31 seconds
Loading data to table default.ejemplo
Table default.ejemplo stats: [numFiles=1, numRows=0, totalSize=1573150, rawDataSize=0]
OK
Time taken: 0.778 seconds
Total jobs = 2
Launching Job 1 out of 2
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=
In order to set a constant number of reducers:
  set mapred.reduce.tasks=
Starting Job = job_201406031222_0005, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201406031222_0005
Kill Command = /var/hadoop/bin/hadoop job  -kill job_201406031222_0005
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2014-06-03 15:53:16,940 Stage-1 map = 0%,  reduce = 0%
2014-06-03 15:53:22,992 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.85 sec
2014-06-03 15:53:31,075 Stage-1 map = 100%,  reduce = 33%, Cumulative CPU 4.85 sec
2014-06-03 15:53:33,091 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 8.7 sec
MapReduce Total cumulative CPU time: 8 seconds 700 msec
Ended Job = job_201406031222_0005
Launching Job 2 out of 2
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=
In order to set a constant number of reducers:
  set mapred.reduce.tasks=
Starting Job = job_201406031222_0006, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201406031222_0006
Kill Command = /var/hadoop/bin/hadoop job  -kill job_201406031222_0006
Hadoop job information for Stage-2: number of mappers: 1; number of reducers: 1
2014-06-03 15:53:40,018 Stage-2 map = 0%,  reduce = 0%
2014-06-03 15:53:43,038 Stage-2 map = 100%,  reduce = 0%, Cumulative CPU 3.34 sec
2014-06-03 15:53:51,116 Stage-2 map = 100%,  reduce = 33%, Cumulative CPU 3.34 sec
2014-06-03 15:53:53,129 Stage-2 map = 100%,  reduce = 100%, Cumulative CPU 7.18 sec
MapReduce Total cumulative CPU time: 7 seconds 180 msec
Ended Job = job_201406031222_0006
Moving data to: hdfs://localhost:54310/user/hive/warehouse/contador
Table default.contador stats: [numFiles=1, numRows=50108, totalSize=527742, rawDataSize=477634]
MapReduce Jobs Launched: 
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 8.7 sec   HDFS Read: 1573365 HDFS Write: 1340154 SUCCESS
Job 1: Map: 1  Reduce: 1   Cumulative CPU: 7.18 sec   HDFS Read: 1340609 HDFS Write: 527821 SUCCESS
Total MapReduce CPU Time Spent: 15 seconds 880 msec
OK
Time taken: 45.941 seconds

Viendo los resultados

Si prestamos atención, podemos observar que se ha ejecutado como un trabajo MapReduce en nuestro cluster. Si queremos confirmarlo sólo tenemos que entrar en la web UI de nuestro JobTracker para ver el Job:


Para ver los resultados del map reduce, lo mejor es abrir un prompt the Hive y hacer un select:

bin/hive
hive> SELECT * FROM contador;
...
her 1505
it 1679
for 1789
on 1894
was 2005
that 2168
with 2391
I 2432
he 2712
his 3035
in 4606
to 4787
a 5842
and 6542
of 8127
 10116
the 13600
Time taken: 0.114 seconds, Fetched: 50108 row(s)

Espero que os haya gustado

0 comentarios:

Publicar un comentario