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:
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