guión de prácticas - Hadoop

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