CURSO SERVICIO BIG DATA 1 PRACTICAS Práctica 1: Utilizando el servicio cloud (Web) …....... 3 Práctica 2: Utilizando el servicio cloud (SSH) …...... 10 Práctica 3: Lanzar un cluster Hadoop ….................... 12 Práctica 4: HDFS …...................................................... 17 Práctica 5: Lanzando nuestro primer trabajo MapReduce …......................................................... 20 Práctica 6: Desarrollar un trabajo MapReduce usando Streaming API …...................................................... 22 Práctica 7: Desarrollar un trabajo MapReduce en Java …................................................................................. 23 Práctica 8: Procesado de datos con Hive …............... 24 Práctica 9: Machine learning con Mahout …............... 27 2 Práctica 1: Utilizando el servicio cloud (Web) En esta práctica veremos como crear una máquina virtual usando el servicio cloud. Usaremos el método más sencillo que consiste en crear la máquina virtual a partir de una plantilla existente. Para la creación de la misma utilizaremos el interfaz web del servicio. 1. Primero tenemos que loguearnos al servicio cloud: https://cloud.cesga.es 3 2. Pulsar el botón verde con el símbolo + para lanzar una nueva máquina virtual 4 3. Seleccionar la plantilla correspondiente a ttylinux que se encuentra en la tercera página de resultados. También podemos valernos de la opción de búsqueda y escribir allí ttylinux. 5 4. Le damos un nombre a la máquina y seleccionamos los recursos que queremos para la misma. La plantilla ya nos indica unos valores por defecto: 512MB de RAM y 1 CPU. Mantendremos esos valores y lanzaremos la máquina virtual pulsando en el botón verde crear. 6 5. Veremos como la máquina se crea y va pasando por distintos estados hasta que finalmente se pone en ejecución. 7 6. A través del interfaz web nos podemos conectar a la consola VNC de la máquina virtual. En general esta consola web se utiliza para resolver problemas que nos impidan la conexión remota directa a nuestra máquina virtual. 8 7. Finalmente borraremos la máquina virtual 9 Práctica 2: Utilizando el servicio cloud (SSH) En esta práctica repetiremos los pasos que hemos hecho en la práctica anterior pero usando el interfaz de línea de comandos del servicio cloud. 1. Primero tenemos que conectarnos al servicio cloud por SSH. ssh [email protected] 2. En la primera conexión es necesario habilitar el servicio cloud en nuestra cuenta. Esto se consigue a través del comando enable_cloud. En general este paso sólo es necesario realizarlo la primera vez que nos conectamos al servicio, y sólo tendremos que repetirlo en el caso de que cambiemos la contraseña de la cuenta. [curso884@cloud ~]$ enable_cloud Este script habilitara la configuracion cloud en su cuenta. Desea continuar? [S/n] Porfavor introduzca su password de sistema para continuar. Password: Generando clave ssh... Generating public/private dsa key pair. Created directory '/home/cesga/cursos/curso884/.ssh'. Your identification has been saved in /home/cesga/cursos/curso884/.ssh/id_dsa. Your public key has been saved in /home/cesga/cursos/curso884/.ssh/id_dsa.pub. The key fingerprint is: 9b:31:28:4c:4e:3a:1c:d3:80:6b:dc:7e:f7:e8:96:27 [email protected] The key's randomart image is: +--[ DSA 1024]----+ | .. | |. o | |..+ + | |.+ X . | |. = + . S | | o o . = | | . . * | | E o | | o.o | +-----------------+ Leyendo clave publica: /home/cesga/cursos/curso884/.ssh/id_dsa.pub oneuser update curso884 -a /home/cesga/cursos/curso884/oneuser_template CONFIGURACION FINALIZADA En caso de errores contacte con [email protected] 3. Para crear una instancia de una nueva máquina virtual la forma más sencilla es partir de una de las plantillas que ya están predefinidas. Para listar las plantillas disponibles ejecutaremos: [curso884@cloud ~]$ onetemplate list ID USER GROUP NAME REGTIME 177 sistemas users hadoop-1.1.2-raw 07/01 10 10:43:02 205 sistemas 18:27:09 254 sistemas 17:14:43 259 grid 16:28:31 260 grid 16:51:47 261 grid 16:55:05 265 sistemas 15:11:18 327 algarcia 09:42:02 341 sistemas 13:47:18 342 sistemas 13:50:59 347 alfeijoo 18:03:22 355 sistemas 15:16:10 363 dnieto 11:02:54 417 sistemas 19:49:09 users hadoop-1.1.2-raw-master 10/15 users hadoop-1.2.1-raw 05/06 users Ubuntu server 13.10 x86_64 05/13 users Scientific Linux 6.5 05/13 users Ubtuntu Desktop 13.10 05/13 users hadoop-1.2.1-raw-master 06/03 users CentOS 7 - APP - Devel 10/01 oneadmin hadoop.cesga.es-centos7 10/27 oneadmin CentOS 7 - TEMPLATE 10/27 users ttylinux - kvmalfeijoo 11/12 users EC2-TEST 12/03 elearning_G Seminar-Ubuntu-14.04 01/20 oneadmin ttylinux 05/19 4. Para esta práctica usaremos la plantilla ttylinux. Se trata de una distribución mínima de Linux que nos permitirá instanciar de modo rápido nuestra primera máquina virtual. [curso884@cloud ~]$ onetemplate instantiate 417 --name "mi primera maquina virtual" VM ID: 48469 5. Durante el arranque de la máquina virtual podemos ver como va cambiando el estado de la misma desde pending hasta running (pending → prolog → boot → running). [curso884@cloud ~]$ onevm list ID USER GROUP STAT UCPU UMEM HOST 48469 curso884 users runn 0 0K nubacesga-02-4 NAME TIME mi primera maquina virtual 0d 00h00 6. Finalmente borraremos la máquina virtual: [curso884@cloud ~]$ onevm delete 48469 11 Práctica 3: Lanzar un cluster Hadoop En esta práctica lanzaremos nuestro primer cluster de Hadoop. 1. Para lanzar nuestro cluster Hadoop nos conectaremos por SSH al servicio cloud: ssh [email protected] 2. (Este paso no es necesario hacerlo si completamos la práctica anterior) En la primera conexión es necesario habilitar el servicio cloud en nuestra cuenta ya que los clusters de Hadoop se lanzarán utilizando máquinas vituales. Esto se consigue a través del comando enable_cloud tal y como vimos en la práctica anterior. En general este paso sólo es necesario realizarlo la primera vez que nos conectamos al servicio, y sólo tendremos que repetirlo en el caso de que cambiemos la contraseña de la cuenta. [curso884@cloud ~]$ enable_cloud Este script habilitara la configuracion cloud en su cuenta. Desea continuar? [S/n] Porfavor introduzca su password de sistema para continuar. Password: Generando clave ssh... Generating public/private dsa key pair. Created directory '/home/cesga/cursos/curso884/.ssh'. Your identification has been saved in /home/cesga/cursos/curso884/.ssh/id_dsa. Your public key has been saved in /home/cesga/cursos/curso884/.ssh/id_dsa.pub. The key fingerprint is: 9b:31:28:4c:4e:3a:1c:d3:80:6b:dc:7e:f7:e8:96:27 [email protected] The key's randomart image is: +--[ DSA 1024]----+ | .. | |. o | |..+ + | |.+ X . | |. = + . S | | o o . = | | . . * | | E o | | o.o | +-----------------+ Leyendo clave publica: /home/cesga/cursos/curso884/.ssh/id_dsa.pub oneuser update curso884 -a /home/cesga/cursos/curso884/oneuser_template CONFIGURACION FINALIZADA En caso de errores contacte con [email protected] 3. Para lanzar un cluster de hadoop basta con utilizar el comando hadoop-start [curso884@cloud ~]$ hadoop-start -s 3 mié may 27 17:39:22 CEST 2015 = Paso 1/3: Arrancando el cluster = Desplegando las maquinas en OpenNebula VM ID: 48726 12 VM ID: 48727 VM ID: 48728 VM ID: 48729 Esperando a que arranquen los nodos 100% [========================================================================>] Arranque del cluster Finalizado. mié may 27 17:43:01 CEST 2015 = Paso 2/3: Obteniendo la lista de nodos = Lista de nodos obtenida. mié may 27 17:43:08 CEST 2015 = Paso 3/3: Configurando Hadoop = Esperando a que todos los slave esten configurados Configurando el master del cluster ----------------------------------------------------------------------¡Configuracion finalizada!" ----------------------------------------------------------------------Ya puede conectarse al nuevo cluster de hadoop a traves mediante ssh: ssh [email protected] Tambien monitorizar el estado del cluster en las siguientes direcciones: JobTracker Web Interface: http://193.144.33.102:50030/jobtracker.jsp NameNode Web Interface: http://193.144.33.102:50070/dfshealth.jsp ----------------------------------------------------------------------En caso de problemas no dude en contactar con el Dep. de Sistemas: Email: [email protected] Telefono: 981569810 ----------------------------------------------------------------------mié may 27 17:44:37 CEST 2015 4. Una vez arrancado podremos conectarnos a nuestro cluster hadoop utilizando el comando hadoop-connect y ya nos conectará automáticamente al nodo maestro de nuestro cluster: [curso884@cloud ~]$ hadoop-connect [hadoop@hadoop-master ~]$ 5. Podemos ver el estado del cluster usando el comando hadoop-status [curso884@cloud ~]$ hadoop-status ==> Hadoop cluster status Datanodes available: 3 (3 total, 0 dead) Tasktrackers available 3 ===> HDFS 13 Configured Capacity: 94252105728 (87.78 GB) Present Capacity: 91968331776 (85.65 GB) DFS Remaining: 91968208896 (85.65 GB) DFS Used: 122880 (120 KB) DFS Used%: 0% Under replicated blocks: 0 Blocks with corrupt replicas: 0 Missing blocks: 0 ------------------------------------------------Datanodes available: 3 (3 total, 0 dead) Name: 10.38.1.17:50010 Decommission Status : Normal Configured Capacity: 31417368576 (29.26 GB) DFS Used: 40960 (40 KB) Non DFS Used: 761257984 (725.99 MB) DFS Remaining: 30656069632(28.55 GB) DFS Used%: 0% DFS Remaining%: 97.58% Last contact: Wed May 27 18:08:50 CEST 2015 Name: 10.38.1.18:50010 Decommission Status : Normal Configured Capacity: 31417368576 (29.26 GB) DFS Used: 40960 (40 KB) Non DFS Used: 761257984 (725.99 MB) DFS Remaining: 30656069632(28.55 GB) DFS Used%: 0% DFS Remaining%: 97.58% Last contact: Wed May 27 18:08:50 CEST 2015 Name: 10.38.1.16:50010 Decommission Status : Normal Configured Capacity: 31417368576 (29.26 GB) DFS Used: 40960 (40 KB) Non DFS Used: 761257984 (725.99 MB) DFS Remaining: 30656069632(28.55 GB) DFS Used%: 0% DFS Remaining%: 97.58% Last contact: Wed May 27 18:08:47 CEST 2015 ===> Task trackers tracker_hadoop-3:localhost/127.0.0.1:50697 tracker_hadoop-1:localhost/127.0.0.1:48392 tracker_hadoop-2:localhost/127.0.0.1:58530 6. Por motivos de seguridad, para poder acceder al interfaz web de monitorización del cluster primero tendremos que añadir una regla en el firewall del mismo que nos permita acceder desde nuestra IP. Por ejemplo, si nuestra IP es 77.227.249.60 abriremos el acceso a la misma con el siguiente comando (lanzado directamente desde el frontal cloud): 14 [curso884@cloud ~]$ ssh [email protected] iptables-add 77.227.249.60 Fijarse en que la conexión SSH se lanzar desde el frontal cloud. Para ver qué IP tiene nuestro PC podemos verlo conectándonos a https://www.whatismyip.com 7. Una vez abierto el firewall ya podremos acceder a las páginas de monitorización del cluster: JobTracker Web Interface: NameNode Web Interface: http://193.144.33.102:50030 http://193.144.33.102:50070 8. Tenemos la opción de realizar personalizaciones adicionales en el cluster, como por ejemplo instalar nuevos paquetes, para ello disponemos de acceso como root desde el frontal de cloud: [curso884@cloud ~]$ ssh [email protected] Por ejemplo podríamos instalar el editor de textos nano si no estamos acostumbrados a utilizar el editor de textos por defecto del sistema (vi): [root@hadoop-master ~]# yum install nano 9. El comando hadoop-start nos ofrece opciones adicionales que pueden sernos útiles a la hora de crear clusters. Podemos ver la lista completa de comandos disponibles lanzando hadoop-start -h: [curso884@cloud ~]$ hadoop-start -h Usage: hadoop-start [-s SIZE] [-r dfs.replication] [-b <mapred.reduce.tasks>] <dfs.block.size>] [-t Start a Hadoop cluster options include: -s SIZE -r dfs.replication -b dfs.block.size -t mapred.reduce.tasks -c clusterID -R calls) -h Number of slaves in the Hadoop cluster (default 3) Number of replicas of each file (default 3) HDFS block size (default 16MB) Number of reduce tasks (default 1) Cluster ID (only for use within REST service calls) REST API mode (only for use within REST service Print help 10. Aunque el comando hadoop-status nos da de una forma sencilla toda la información de nuestro cluster, también podemos ver el estado de la máquina virtuales que forman nuestro cluster con los comandos estandard del servicio cloud: [curso884@cloud ~]$ onevm list ID USER GROUP STAT UCPU UMEM HOST 48726 curso884 users runn 1 2G nubacesga-05-2 48727 curso884 users NAME TIME hadoop-1.2.1-30965-0 0d 00h34 hadoop-1.2.1-30965-1 15 runn 1 1024M nubacesga-10-3 48728 curso884 users runn 1 1024M nubacesga-08-2 48729 curso884 users runn 0 1024M nubacesga-05-2 0d 00h34 hadoop-1.2.1-30965-2 0d 00h34 hadoop-1.2.1-30965-3 0d 00h34 11. Para parar el custer se usa el comando hadoop-stop. Una vez lanzado este comando se borrarán todos los datos del cluster por lo que es recomandable copiar toda la información que queramos guardar antes de parar un cluster. 16 Práctica 4: HDFS En esta práctica veremos los comandos básicos de HDFS. 1. Tenemos que tener un cluster Hadoop arrancado, una vez esté operativo nos conectarnos al mismo: [curso885@cloud ~]$ hadoop-connect [hadoop@hadoop-master ~]$ 2. Por defecto en el HDFS de nuestro cluster disponemos de varios directorios que podemos utilizar para subir nuestros ficheros: nuestro HOME (/user/hadoop) y un directorio /scratch [hadoop@hadoop-master Found 4 items drwxrwxrwx - hadoop drwxr-xr-x - hadoop drwxrwxrwx - hadoop drwxr-xr-x - hadoop ~]$ hadoop fs -ls / supergroup supergroup supergroup supergroup 0 0 0 0 2015-05-27 2015-05-27 2015-05-27 2015-05-27 19:22 19:22 19:22 19:22 /hive /scratch /tmp /user Por defecto si no se especifica una ruta absoluta para los archivos, Hadoop los buscará en nuestro HOME: /user/hadoop 3. Podemos crear un directorio adicional en nuestro HOME: [hadoop@hadoop-master ~]$ hadoop fs -mkdir test [hadoop@hadoop-master ~]$ hadoop fs -ls Found 1 items drwxr-xr-x - hadoop supergroup 0 2015-05-27 18:18 /user/hadoop/test 4. O también en el directorio /scratch [hadoop@hadoop-master [hadoop@hadoop-master Found 2 items drwxr-xr-x - hadoop drwxr-xr-x - hadoop ~]$ hadoop fs -mkdir /scratch/test ~]$ hadoop fs -ls /scratch supergroup supergroup 0 2015-05-27 17:44 /scratch/hadoop 0 2015-05-27 18:19 /scratch/test 5. Para subir un fichero local al HDFS [hadoop@hadoop-master ~]$ hadoop fs -put /etc/redhat-release /scratch/test/redhat-release 6. Podemos ver los contenidos con un cat [hadoop@hadoop-master ~]$ hadoop fs -cat /scratch/test/redhat-release Scientific Linux release 6.5 (Carbon) Si el fichero es muy grande es mejor usar la opción -tail para leer sólo el el final del fichero: 17 [hadoop@hadoop-master ~]$ hadoop fs -tail /scratch/test/redhat-release Scientific Linux release 6.5 (Carbon) 7. Podemos ver el estado del HDFS conéctandonos a su interfaz web de monitorización, aunque deberemos haber abierto el acceso en el firewall como se mostraba en la práctica anterior: NameNode Web Interface: http://193.144.33.102:50070 Ahí podremos ver el estado de los DataNodes y la ocupación del sistema de ficheros. La parte de navegación del sistema de ficheros no está disponible ya que requiere acceso directo a los nodos del cluster y estos utilizan direcciones IP privadas. 8. Hay más comandos de HDFS que pueden sernos útiles, podemos ver la lista completa de comandos disponibles lanzando hadoop fs sin ninguna opción: [hadoop@hadoop-master ~]$ hadoop fs Usage: java FsShell [-ls <path>] [-lsr <path>] [-du <path>] [-dus <path>] [-count[-q] <path>] [-mv <src> <dst>] [-cp <src> <dst>] [-rm [-skipTrash] <path>] [-rmr [-skipTrash] <path>] [-expunge] [-put <localsrc> ... <dst>] [-copyFromLocal <localsrc> ... <dst>] [-moveFromLocal <localsrc> ... <dst>] [-get [-ignoreCrc] [-crc] <src> <localdst>] [-getmerge <src> <localdst> [addnl]] [-cat <src>] [-text <src>] [-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>] [-moveToLocal [-crc] <src> <localdst>] [-mkdir <path>] [-setrep [-R] [-w] <rep> <path/file>] [-touchz <path>] [-test -[ezd] <path>] [-stat [format] <path>] [-tail [-f] <file>] [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] [-chown [-R] [OWNER][:[GROUP]] PATH...] [-chgrp [-R] GROUP PATH...] [-help [cmd]] Generic options supported are -conf <configuration file> specify an application configuration file -D <property=value> use value for given property -fs <local|namenode:port> specify a namenode -jt <local|jobtracker:port> specify a job tracker -files <comma separated list of files> specify comma separated files to be copied to the map reduce cluster -libjars <comma separated list of jars> specify comma separated jar files to include in the classpath. -archives <comma separated list of archives> specify comma separated archives to be unarchived on the compute machines. 18 The general command line syntax is bin/hadoop command [genericOptions] [commandOptions] 19 Práctica 5: Lanzando nuestro primer trabajo MapReduce En esta práctica lanzaremos nuestro primer trabajo MapReduce usando uno de los trabajos de ejemplo que vienen con la propia distribución de Hadoop. Este trabajo se denomina wordcount y básicamente cuenta el número de ocurrencias de cada palabra de un fichero. En posteriores prácticas veremos más detalles de como funciona este programa MapReduce. 1. Lo primero descargaremos, descomprimiremos los ficheros necesarios para las prácticas y entraremos en el directorio practicas: [hadoop@hadoop-master [hadoop@hadoop-master [hadoop@hadoop-master [hadoop@hadoop-master ~]$ wget https://hadoop.cesga.es/curso/practicas.tar.gz ~]$ tar xzvf practicas.tar.gz ~]$ cd practicas practicas]$ 2. Subiremos el fichero de entrada (wordcount/entrada.txt) al HDFS: [hadoop@hadoop-master practicas]$ cd wordcount/ [hadoop@hadoop-master wordcount]$ hadoop fs -mkdir input [hadoop@hadoop-master wordcount]$ hadoop fs -put entrada.txt input/ 3. Lanzaremos el trabajo MapReduce de ejemplo: [hadoop@hadoop-master wordcount]$ hadoop jar /opt/cesga/hadoop-1.2.1/hadoopexamples-1.2.1.jar wordcount input output-1 15/05/27 18:44:51 INFO input.FileInputFormat: Total input paths to process : 1 15/05/27 18:44:51 WARN snappy.LoadSnappy: Snappy native library is available 15/05/27 18:44:51 INFO util.NativeCodeLoader: Loaded the native-hadoop library 15/05/27 18:44:51 INFO snappy.LoadSnappy: Snappy native library loaded 15/05/27 18:44:52 INFO mapred.JobClient: Running job: job_201505271743_0001 15/05/27 18:44:53 INFO mapred.JobClient: map 0% reduce 0% 15/05/27 18:45:03 INFO mapred.JobClient: map 100% reduce 0% 15/05/27 18:45:12 INFO mapred.JobClient: map 100% reduce 33% 15/05/27 18:45:14 INFO mapred.JobClient: map 100% reduce 100% 15/05/27 18:45:17 INFO mapred.JobClient: Job complete: job_201505271743_0001 15/05/27 18:45:17 INFO mapred.JobClient: Counters: 29 15/05/27 18:45:17 INFO mapred.JobClient: Job Counters 15/05/27 18:45:17 INFO mapred.JobClient: Launched reduce tasks=1 15/05/27 18:45:17 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=10895 15/05/27 18:45:17 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 15/05/27 18:45:17 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 15/05/27 18:45:17 INFO mapred.JobClient: Launched map tasks=1 15/05/27 18:45:17 INFO mapred.JobClient: Data-local map tasks=1 15/05/27 18:45:17 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=10733 15/05/27 18:45:17 INFO mapred.JobClient: File Output Format Counters 15/05/27 18:45:17 INFO mapred.JobClient: Bytes Written=1311 15/05/27 18:45:17 INFO mapred.JobClient: FileSystemCounters 20 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO (bytes)=176230400 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO snapshot=253415424 15/05/27 18:45:17 INFO 15/05/27 18:45:17 INFO snapshot=1461096448 15/05/27 18:45:17 INFO mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: FILE_BYTES_READ=1860 HDFS_BYTES_READ=1394 FILE_BYTES_WRITTEN=116324 HDFS_BYTES_WRITTEN=1311 File Input Format Counters Bytes Read=1273 Map-Reduce Framework Map output materialized bytes=1860 Map input records=19 Reduce shuffle bytes=1860 Spilled Records=272 Map output bytes=2028 Total committed heap usage mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: mapred.JobClient: CPU time spent (ms)=1750 Combine input records=189 SPLIT_RAW_BYTES=121 Reduce input records=136 Reduce input groups=136 Combine output records=136 Physical memory (bytes) mapred.JobClient: mapred.JobClient: Reduce output records=136 Virtual memory (bytes) mapred.JobClient: Map output records=189 4. Veremos que se han creado varios ficheros dentro del directorio de salida output-1 que habíamos indicado: [hadoop@hadoop-master wordcount]$ hadoop fs Found 3 items -rw-r--r-3 hadoop supergroup 0 /user/hadoop/output-1/_SUCCESS drwxr-xr-x - hadoop supergroup 0 /user/hadoop/output-1/_logs -rw-r--r-3 hadoop supergroup 1311 /user/hadoop/output-1/part-r-00000 -ls output-1 2015-05-27 18:45 2015-05-27 18:44 2015-05-27 18:45 5. La salida de nuestro trabajo está en el fichero part-r-00000 [hadoop@hadoop-master wordcount]$ hadoop fs -cat output-1/part-r-00000 6. Podemos ver información adicional sobre nuestro trabajo en el interfaz web del JobTracker: JobTracker Web Interface: http://193.144.33.102:50030 21 Práctica 6: Desarrollar un trabajo MapReduce usando Streaming API En esta práctica desarrollaremos un trabajo MapReduce básico que contará el número de ocurrencias de cada palabra de un documento. Este trabajo se suele denominar wordcount y es el equivalente al programa Hello Word en Hadoop. Los ficheros necesarios para esta práctica están en el directorio wordcount. 1. (No es necesario si ya hemos hecho la práctica anterior) Lo primero subiremos el fichero de entrada (wordcount/entrada.txt) al HDFS: hadoop fs -mkdir input hadoop fs -put entrada.txt input/ 2. Crearemos los scripts que van a actuar como Mapper y Reducer. Se ofrece una plantilla del mapper y reducer en Perl en el directorio wordcount/streaming_api/ con comentarios para ayudar a su implementación. No es necesario realizar la práctica en Perl, se puede usar también Python o incluso es posible instalar otro lenguaje en el cluster. Se ofrece una posible solución en el directorio wordcount/streaming_api/solucion. 3. Lanzaremos nuestro trabajo MapReduce hadoop jar /opt/cesga/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar -input input -output output -mapper mapper.pl -reducer reducer.pl -file mapper.pl -file reducer.pl 5. Y revisaremos la salida hadoop fs -cat output/part-r-* 22 Práctica 7: Desarrollar un trabajo MapReduce en Java En esta práctica desarrollaremos el mismo trabajo wordcount que implementamos en la práctica anterior utilizando Streaming API, pero en esta ocasión usaremos la API nativa de Hadoop en Java. 1. Usaremos el mismo fichero de entrada que en la práctica anterior (wordcount/entrada.txt). Recordamos aquí los pasos necesarios para subir el fichero de entrada al HDFS: hadoop fs -mkdir input hadoop fs -put entrada.txt input/ 2. Implementaremos las funciones map y reduce. Se ofrece una plantilla wordcount/java. La plantilla incluye el driver completo (WordCount.java), el Mapper (WordMapper.java) y el Reducer (SumReducer.java). Sólo es necesario completar la función map que se define dentro del Mapper y la función reduce que se define dentro del Reducer. Se ofrece una posible solución en el directorio wordcount/java/solucion. 3. Compilar el código y generar un fichero jar javac -classpath `hadoop classpath` *.java jar cvf wordcount.jar *.class 4. Por último lanzaremos nuestro trabajo MapReduce hadoop jar wordcount.jar WordCount input output-java 5. Y revisaremos la salida hadoop fs -cat output-java/part-r-* 23 Práctica 8: Procesado de datos con Hive En esta práctica veremos como Hive nos permite acceder a ficheros del HDFS como si se tratase de tablas de una base de datos, con un lenguaje llamado HiveQL que es muy similar a SQL. 1. Lo primero descargaremos el dataset que utilizaremos para la práctica. Se trata de un dataset libre de recomendaciones de películas llamado MovieLens y que es distribuido por GroupLens. [hadoop@hadoop-master ~]$ wget https://hadoop.cesga.es/curso/datasets/movielens/movielens-100k.tar.gz 2. Descomprimir el dataset [hadoop@hadoop-master ~]$ tar xzvf movielens-100k.tar.gz 3. Subirlo al HDFS [hadoop@hadoop-master ~]$ cd movielens-100k [hadoop@hadoop-master movielens-100k]$ hadoop fs -mkdir movierating [hadoop@hadoop-master movielens-100k]$ hadoop fs -put u*.base movierating Comprobaremos que todos los ficheros han sido subidos: [hadoop@hadoop-master movielens-100k]$ hadoop fs -ls movierating Found 7 items -rw-r--r-3 hadoop supergroup 1586544 2015-05-27 19:48 /user/hadoop/movierating/u1.base -rw-r--r-3 hadoop supergroup 1583948 2015-05-27 19:48 /user/hadoop/movierating/u2.base -rw-r--r-3 hadoop supergroup 1582546 2015-05-27 19:48 /user/hadoop/movierating/u3.base -rw-r--r-3 hadoop supergroup 1581878 2015-05-27 19:48 /user/hadoop/movierating/u4.base -rw-r--r-3 hadoop supergroup 1581776 2015-05-27 19:48 /user/hadoop/movierating/u5.base -rw-r--r-3 hadoop supergroup 1792501 2015-05-27 19:48 /user/hadoop/movierating/ua.base -rw-r--r-3 hadoop supergroup 1792476 2015-05-27 19:48 /user/hadoop/movierating/ub.base cd movielens-100k 4. Podemos ver como es el contenido de uno de los ficheros del dataset (todos contienen la misma información): [hadoop@hadoop-master movielens-100k]$ hadoop fs -tail /user/hadoop/movierating/u2.base | tail 943 943 5 888639614 943 1011 2 875502560 943 1028 2 875502096 943 1044 3 888639903 943 1047 2 875502146 943 1067 2 875501756 943 1074 4 888640250 943 1188 3 888640250 24 943 943 1228 1330 3 3 888640275 888692465 Básicamente cada fichero que hemos subido al HDFS contiene la siguiente información separada por tabulaciones: user id | item id | rating | timestamp 5. Lanzamos Hive [hadoop@hadoop-master movielens-100k]$ hive Logging initialized using configuration in jar:file:/opt/cesga/apache-hive1.2.0-bin/lib/hive-common-1.2.0.jar!/hive-log4j.properties hive> 6. Creamos un mapeo para los ficheros que hemos subido al directorio movierating hive> create external table movierating (userid INT, movieid INT, rating INT) row format delimited fields terminated by '\t' location '/user/hadoop/movierating'; 7. Y ahora ya podemos ejecutar consultas sobre esos ficheros como si todos los ficheros del directorio se tratasen de una sola tabla de una base de datos SQL: hive> select count(*) from movierating; Query ID = hadoop_20150527201633_6acd64cd-3f12-479f-b2e0-87464f722322 Total jobs = 1 Launching Job 1 out of 1 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=<number> In order to limit the maximum number of reducers: set hive.exec.reducers.max=<number> In order to set a constant number of reducers: set mapred.reduce.tasks=<number> Starting Job = job_201505272009_0001, Tracking URL = http://hadoopmaster:50030/jobdetails.jsp?jobid=job_201505272009_0001 Kill Command = /opt/cesga/hadoop-1.2.1/libexec/../bin/hadoop job -kill job_201505272009_0001 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1 2015-05-27 20:16:46,840 Stage-1 map = 0%, reduce = 0% 2015-05-27 20:16:53,875 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 2.71 sec 2015-05-27 20:17:02,923 Stage-1 map = 100%, reduce = 33%, Cumulative CPU 2.71 sec 2015-05-27 20:17:05,942 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 5.16 sec MapReduce Total cumulative CPU time: 5 seconds 160 msec Ended Job = job_201505272009_0001 MapReduce Jobs Launched: Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 5.16 sec HDFS Read: 11508774 HDFS Write: 7 SUCCESS Total MapReduce CPU Time Spent: 5 seconds 160 msec OK 25 581140 Time taken: 36.357 seconds, Fetched: 1 row(s) 8. También podemos poner restricciones en la consulta: hive> select * from movierating where userid=1 limit 5; OK 1 1 5 1 2 3 1 3 4 1 4 3 1 5 3 Time taken: 0.12 seconds, Fetched: 5 row(s) 9. He incluso podemos crear nuevas tablas a partir de los resultados de una consulta: hive> create table newtable as select * from movierating where userid=1; Query ID = hadoop_20150527202223_3e348cf2-f5d5-4082-9e96-a709b704a47a Total jobs = 3 Launching Job 1 out of 3 Number of reduce tasks is set to 0 since there's no reduce operator Starting Job = job_201505272009_0002, Tracking URL = http://hadoopmaster:50030/jobdetails.jsp?jobid=job_201505272009_0002 Kill Command = /opt/cesga/hadoop-1.2.1/libexec/../bin/hadoop job -kill job_201505272009_0002 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0 2015-05-27 20:22:33,991 Stage-1 map = 0%, reduce = 0% 2015-05-27 20:22:41,018 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 3.0 sec 2015-05-27 20:22:45,038 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 3.0 sec MapReduce Total cumulative CPU time: 3 seconds 0 msec Ended Job = job_201505272009_0002 Stage-4 is selected by condition resolver. Stage-3 is filtered out by condition resolver. Stage-5 is filtered out by condition resolver. Moving data to: hdfs://hadoop-master:54310/user/hive/warehouse/.hivestaging_hive_2015-05-27_20-22-23_816_3702496325782217670-1/-ext-10001 Moving data to: hdfs://hadoop-master:54310/user/hive/warehouse/oneuser Table default.oneuser stats: [numFiles=1, numRows=1612, totalSize=12256, rawDataSize=10644] MapReduce Jobs Launched: Stage-Stage-1: Map: 1 Cumulative CPU: 3.0 sec HDFS Read: 11505630 HDFS Write: 12332 SUCCESS Total MapReduce CPU Time Spent: 3 seconds 0 msec OK Time taken: 21.541 seconds 10. Para terminar la sesión interactiva: hive> quit ; 26 Práctica 9: Machine learning con Mahout En esta práctica veremos como utilizar la librería de machine learning Mahout para obtener recomendaciones del películas. 1. (Si ya hemos completado la práctica anterior esta parte no es necesaria) Primero descargaremos los datos que utilizaremos y los subiremos al HDFS. [hadoop@hadoop-master ~]$ wget https://hadoop.cesga.es/curso/datasets/movielens/movielens-100k.tar.gz [hadoop@hadoop-master ~]$ tar xzvf movielens-100k.tar.gz [hadoop@hadoop-master ~]$ cd movielens-100k [hadoop@hadoop-master movielens-100k]$ hadoop fs -mkdir movierating [hadoop@hadoop-master movielens-100k]$ hadoop fs -put u*.base movierating Podemos ver como es el contenido de uno de los ficheros del dataset (todos contienen la misma información): [hadoop@hadoop-master movielens-100k]$ hadoop fs -tail /user/hadoop/movierating/u2.base | tail 943 943 5 888639614 943 1011 2 875502560 943 1028 2 875502096 943 1044 3 888639903 943 1047 2 875502146 943 1067 2 875501756 943 1074 4 888640250 943 1188 3 888640250 943 1228 3 888640275 943 1330 3 888692465 Básicamente cada fichero que hemos subido al HDFS contiene la siguiente información separada por tabulaciones: user id | item id | rating | timestamp 2. Crearemos una lista con los identificadores de los usuarios de los cuales queremos obtener las recomendaciones. Para ello crearemos un fichero en el disco local llamado users y dentro de ese fichero pondremos el siguiente contenido (asegurarse de no dejar ninguna línea en blanco al final del fichero): 1 2 3 3. Subiremos el fichero al HDFS [hadoop@hadoop-master ~]$ hadoop fs -put users users 4. Por último ejecutaremos el recomendador de Mahout: 27 [hadoop@hadoop-master ~]$ mahout recommenditembased --input movierating --output recs --usersFile users --similarityClassname SIMILARITY_LOGLIKELIHOOD Este comando lanzará automáticamente alrededor de 10 trabajos MapReduce y tardará en torno a 5 minutos: 15/05/27 20:40:55 INFO driver.MahoutDriver: Program took 321375 ms (Minutes: 5.35625) 5. Podemos monitorizar el progreso del trabajo a través del interfaz web del JobTracker: JobTracker Web Interface: http://193.144.33.102:50030 6. Cuando finalice el trabajo tendremos la lista de recomendaciones en el directorio recs dentro del fichero recs/part-r-00000 será: [hadoop@hadoop-master ~]$ hadoop fs -cat recs/part-r-* 1 [1351:5.0,225:5.0,68:5.0,449:5.0,355:5.0,1194:5.0,474:5.0,1137:5.0,69:5.0,481:5 .0] 2 [403:5.0,339:5.0,1281:5.0,224:5.0,1163:5.0,137:5.0,156:5.0,582:5.0,209:5.0,176: 5.0] 3 [461:5.0,789:5.0,1226:5.0,236:5.0,475:5.0,1143:4.7997327,896:4.798386,311:4.797 055,337:4.7516527,903:4.750977] 28
© Copyright 2024