Laboratorio No. V - Hadoop-1

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

Universidad Tecnológica de Panamá

Facultad de Ingeniería de Sistemas Computacionales


Coordinación de Postgrado

Curso: Tópicos Especiales


Laboratorio No. V Uso de Herramienta Hadoop a través de Cloudera QuickStart VMs
Objetivos:

  Instalar y manipular la herramienta hadoop.


 Familiarizarse con el ambiente y comandos básicos para trabajar con Hadoop. 
  Aplicar y hacer uso de hadoop para el procesamiento y análisis de datos.
  Comprender el funcionamiento de herramientas YARN, MapReduce, Hive, Spark y HDFS
 Describir las características de Cloudera Manager para el manejo y gestión de datos.

Introducción:
Hadoop MapReduce es un framework de software para procesar grandes conjuntos de datos.
Utiliza muchas computadoras en paralelo que se ejecutan en un clúster. Los hosts de la
computadora funcionan como si fueran una computadora grande.

MapReduce está basada en una variedad de criterios. Un ejemplo clásico es la clase


JavaWordCount. WordCount mapea (extrae) palabras de una fuente de entrada y la reduce
(resume) los resultados, devolviendo un conteo de cada palabra. Las versiones de WordCount en
esta práctica esta implementada en base a las características de MRv2 API.

Los argumentos de la línea de comandos para compilar (build) y ejecutar WordCount, es la


que presentamos para este ejemplo. Dichos comandos están en un script Makefile.
Este lo veremos en la práctica dos de este laboratorio.

Práctica No. 1: Lanzando trabajos 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 cómo funciona este programa MapReduce.

1. Lo primero descargaremos, descomprimiremos los ficheros necesarios para las prácticas


y entraremos en el directorio practicas: (el archivo practicas.tar.gz se encuentra en la
carpeta Actividad a Realizar del Capítulo II en la plataforma Moodle)

[cloudera@quickstart ~]$ tar xzvf


practicas.tar.gz [cloudera@quickstart ~]$ cd
practicas [cloudera@quickstart practicas]$

2. Subiremos el fichero de entrada (wordcount/entrada.txt) al HDFS:

[cloudera@quickstart practicas]$ cd wordcount/


[cloudera@quickstart wordcount]$ hadoop fs -mkdir input
[cloudera@quickstart wordcount]$ hadoop fs -put entrada.txt input/
3. Lanzaremos el trabajo MapReduce de ejemplo:

[cloudera@quickstart wordcount]$ hadoop jar


/home/cloudera/programas/hadoop-examples-1.2.1.jar wordcount input
output-1

20/02/1818:45:17 INFO mapred.JobClient: FILE_BYTES_READ=1860


20/02/1818:45:17 INFO mapred.JobClient: HDFS_BYTES_READ=1394
20/02/1818:45:17 INFO mapred.JobClient: FILE_BYTES_WRITTEN=116324
20/02/1818:45:17 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=1311
20/02/1818:45:17 INFO mapred.JobClient: File Input Format Counters
20/02/1818:45:17 INFO mapred.JobClient: Bytes Read=1273
20/02/1818:45:17 INFO mapred.JobClient: Map-Reduce Framework
20/02/1818:45:17 INFO mapred.JobClient: Map output materialized bytes=1860
20/02/1818:45:17 INFO mapred.JobClient: Map input records=19
20/02/1818:45:17 INFO mapred.JobClient: Reduce shuffle bytes=1860
20/02/1818:45:17 INFO mapred.JobClient: Spilled Records=272
20/02/1818:45:17 INFO mapred.JobClient: Map output bytes=2028
20/02/1818:45:17 INFO mapred.JobClient: Total committed heap usage
(bytes)=176230400
20/02/1818:45:17 INFO mapred.JobClient: CPU time spent (ms)=1750
20/02/1818:45:17 INFO mapred.JobClient: Combine input records=189
20/02/1818:45:17 INFO mapred.JobClient: SPLIT_RAW_BYTES=121
20/02/1818:45:17 INFO mapred.JobClient: Reduce input records=136
20/02/1818:45:17 INFO mapred.JobClient: Reduce input groups=136
20/02/1818:45:17 INFO mapred.JobClient: Combine output records=136
20/02/1818:45:17 INFO mapred.JobClient: Physical memory (bytes)
snapshot=253415424
20/02/1818:45:17 INFO mapred.JobClient: Reduce output records=136
20/02/1818:45:17 INFO mapred.JobClient: Virtual memory (bytes)
snapshot=1461096448
20/02/1818:45:17 INFO mapred.JobClient: Map output records=189
20/02/1818:44:51 INFO input.FileInputFormat: Total input paths to process : 1
20/02/1818:44:51 WARN snappy.LoadSnappy: Snappy native library is available
20/02/1818:44:51 INFO util.NativeCodeLoader: Loaded the native-hadoop library
20/02/1818:44:51 INFO snappy.LoadSnappy: Snappy native library loaded
20/02/1818:44:52 INFO mapred.JobClient: Running job: job_201505271743_0001
20/02/1818:44:53 INFO mapred.JobClient: map 0% reduce 0%
20/02/1818:45:03 INFO mapred.JobClient: map 100% reduce 0%
20/02/1818:45:12 INFO mapred.JobClient: map 100% reduce 33%
20/02/1818:45:14 INFO mapred.JobClient: map 100% reduce 100%
20/02/1818:45:17 INFO mapred.JobClient: Job complete: job_201505271743_0001
20/02/1818:45:17 INFO mapred.JobClient: Job Counters Counters: 29
20/02/1818:45:17 INFO mapred.JobClient: Launched reduce tasks=1
20/02/1818:45:17 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=10895
20/02/1818:45:17 INFO mapred.JobClient: Total time spent by all reduces
20/02/1818:45:17 INFO mapred.JobClient:
waiting after reserving slots (ms)=0 Total time spent by all maps
20/02/1818:45:17 INFO mapred.JobClient:
waiting after reserving slots (ms)=0 Launched map tasks=1 Data-
20/02/1818:45:17 INFO mapred.JobClient: local map tasks=1
20/02/1818:45:17 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=10733
20/02/1818:45:17 INFO mapred.JobClient: File Output Format Counters
20/02/1818:45:17 INFO mapred.JobClient: Bytes Written=1311
20/02/1818:45:17 INFO mapred.JobClient: FileSystemCounters
20/02/1818:45:17 INFO mapred.JobClient:

Bajar archivo de http://www.java2s.com/Code/Jar/h/Downloadhadoopexamples121jar.htm

$hadoop jar hadoop-examples.jar wordcount input output-1


4. Veremos que se han creado varios ficheros dentro del directorio de salida output-1 que
habíamos indicado:
[cloudera@quickstart wordcount]$ hadoop fs -ls output-1

Found 3 items

-rw-r--r-- 3 hadoop supergroup 0 2018-02-21 18:45


/user/hadoop/output-1/_SUCCESS
drwxr-xr-x - hadoop supergroup 0 2018-02-21 18:44
/user/hadoop/output-1/_logs
-rw-r--r-- 3 hadoop supergroup 1311 2018-02-21 18:45
/user/hadoop/output-1/part-r-00000

5. La salida de nuestro trabajo está en el fichero part-r-00000

[cloudera@quickstart wordcount]$ hadoop fs -cat output-1/part-r-00000

Práctica No. 2: uso de aplicación para conteo de palabras


En este taller de laboratorio haremos uso de la función WordCount.

Descomprima dicho archivo. Allí encontrará 3 carpetas. Entre a la carpeta WordCount2, y


ejecute el comando,
$ make

Este es un script que contiene,

$ rm -rf build wordcount.jar


$ mkdir -p build
$ javac -cp /usr/lib/hadoop/*:/usr/lib/hadoop-mapreduce/* WordCount.java -d build -Xlint
$ jar -cvf wordcount.jar -C build/ .

A continuación, crearemos 3 archivos de textos de la siguiente manera:


HadoopFile0.txt:

Hadoop is the Elephant King!


A yellow and elegant thing.
He never forgets
Useful data, or lets
An extraneous element cling!
HadoopFile1.txt:
A wonderful king is Hadoop.
The elephant plays well with Sqoop.
But what helps him to thrive
Are Impala, and Hive,
And HDFS in the group.
HadoopFile2.txt:
Hadoop is an elegant fellow.
An elephant gentle and mellow.
He never gets mad,
Or does anything bad,
Because, at his core, he is yellow.

También los puede crear con el comando echo, de la siguiente forma:

$ echo -e "Hadoop is the Elephant King! \\nA yellow and elegant thing.\\nHe never forgets\\nUseful data,
or lets\\nAn extraneous element cling! " > HadoopPoem0.txt
$ echo -e "A wonderful king is Hadoop.\\nThe elephant plays well with Sqoop.\\nBut what helps him to
thrive\\nAre Impala, and Hive,\\nAnd HDFS in the group." > HadoopPoem1.txt
$ echo -e "Hadoop is an elegant fellow.\\nAn elephant gentle and mellow.\\nHe never gets mad,\\nOr does
anything bad,\\nBecause, at his core, he is yellow." > HadoopPoem2.txt

$ hadoop fs -put HadoopP* /user/cloudera/wordcount/input


$ rm HadoopPoem*

Ahora, elimine los resultados anteriores, y ejecute la aplicación con los nuevos archivos de
texto como entrada.

$ hadoop fs –rm –r -f /user/cloudera/wordcount/output


$ hadoop jar wordcount.jar org.myorg.WordCount /user/cloudera/wordcount/input
/user/cloudera/wordcount/output

Ahora observe los resultados con el comando:

$ hadoop fs -cat /user/cloudera/wordcount/output/*

Entre ahora a la carpeta WordCount3, y ejecute

$ hadoop fs -rm -r -f /user/cloudera/wordcount/output

Esto removerá los resultados anteriores realizados por hadoop.


Cree una lista de palabras sencillas, cuyo nombre de archivo sea stop_words.text
$ echo -e "a\\nan\\nand\\nbut\\nis\\nor\\nthe\\nto\\n.\\n," > stop_words.text

Ejecute la aplicación con la opción –skip y el nombre del archivo.

$ hadoop jar wordcount.jar org.myorg.WordCount /user/cloudera/wordcount/input


/user/cloudera/wordcount/output -skip /user/cloudera/wordcount/stop_words.text

Los resultados los podrá observar al lanzar,


$ hadoop fs -cat /user/cloudera/wordcount/output/*
Práctica No. 3: análisis de sentimiento utilizando contadores personalizados
de MapReduce
MapReduce utilizan una amplia variedad de contadores incorporados. Puede agregar sus propios
contadores y analizar los resultados de sus aplicaciones. Para este caso, se utilizarán contadores
personalizados para el análisis de sentimiento.

Para realizar un análisis de sentimiento básico, cuenta las palabras positivas y las negativas de un
conjunto de datos. Divide la diferencia por la suma para calcular una puntuación de sentimiento
general.

sentiment = (positive - negative) / (postitive + negative)

En este ejemplo, Map y Reduce se compilan como clases separadas para mantener ejemplos de
códigos cortos y que sean fáciles de leer. MrManager maneja la configuración, define el trabajo y
proporciona el método principal.

Todo el código fuente esta comprimido en el archivo sentimentAnalysis.tar.gz, el cual contiene:


makefile, Map.java, MrManage.java, Reduce.java, neg-words.txt, pos-words.txt, stop-words.txt, la
carpeta shakespare (comedies, histories, poems, tragedies).

Para ello debe,


1. Bajar y descomprimir el archivo sentimentAnalysis.tar.gz
2. Abrir una terminal e ir a la carpeta sentimentAnalysis
3. Ejecutar $ make
Al ejecutarlo, realizará una serie de eventos tales
como, Eliminar los resultados previos invocados por
hadoop Creará directorios HDFS de input y ouput
Copiará los trabajos de Shakespeare al directorio
input Creará y subirá tres poemas cortos a Hadoop
Copie los archivos stop-words.txt, pos-words.txt y neg-words.txt a
HDFS Compile y realice jars Map, Reduce y MrManager
Ejecute la aplicación

MrManager agrega los resultados de sus contadores personalizados al final de la lista de contadores
estándar. Los puntajes de sentimiento y positividad aparecen después del resultado estándar.

Una puntuación de positividad del 50% o superior indica que las palabras de la entrada tienden a
ser en su mayoría positivas. En el caso de Shakespeare, cae solo un 1% por debajo de ese mETA.
Sin embargo, este es un ejemplo rudimentario de un análisis de sentimiento. Si el contenido
incluye frases como "not unhappy,"("no soy feliz"), eso contaría como dos palabras negativas,
aunque la intención general de la frase sea positiva. Puede implementar algoritmos de análisis de
sentimiento más sólidos si así se requiere.

org.myorg.Map$Gauge

NEGATIVE=42163
POSITIVE=41184
**********

Sentiment score = (41184.0 - 42163.0) / (41184.0 + 42163.0)


Sentiment score = -0.011746074

Positivity score = 41184.0/(41184.0+42163.0)


Positivity score = 49%

**********

Práctica No. 4: 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 ua posible solución en el directorio wordcount/streaming_api/solucion.


Bajarlo de http://www.java2s.com/Code/Jar/h/Downloadhadoopstreaming121jar.htm

3. Lanzaremos nuestro trabajo MapReduce

$ hadoop jar hadoop-streaming-1.2.1.jar -input input -output output -


mapper streaming_api/mapper.pl -reducer streaming_api/reducer.pl -file
streaming_api/mapper.pl -file streaming_api/reducer.pl

5. Y revisaremos la salida

$ hadoop fs -cat output/part-00000


Práctica 5: 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.

[cloudera@quickstart ~]$ wget ruta donde se encuentra el archivo

Nota: el archivo movielens-100k.tar.gz se encuentra en la carpeta Actividad a Realizar del Capítulo II en


la plataforma Moodle

2. Descomprimir el dataset

[cloudera@quickstart ~]$ tar xzvf movielens-100k.tar.gz

3. Subirlo al HDFS

[cloudera@quickstart ~]$ cd movielens- 100k [cloudera@quickstart


movielens-100k]$ hadoop fs -mkdir movierating [cloudera@quickstart
movielens-100k]$ hadoop fs -put u*.base movierating

Comprobaremos que todos los ficheros han sido subidos:

4. Podemos ver como es el contenido de uno de los ficheros del dataset (todos contienen
la misma información):
[hadoop@ quickstart movielens-100k]$ hadoop fs –
tail 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

5. Lanzamos 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'; <dar ENTER>

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; <dar ENTER>

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://hadoop-
master: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 2018-02-21 20:16:46,840 Stage-1 map = 0%, reduce = 0%
2018-02-21 20:16:53,875 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 2.71
sec
2018-02-21 20:17:02,923 Stage-1 map = 100%, reduce = 33%, Cumulative CPU 2.71
sec
2018-02-21 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:


HDFS Read:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 5.16 sec

11508774 HDFS Write: 7 SUCCESS

Total MapReduce CPU Time Spent: 5 seconds 160 msec

OK

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://hadoop-
master: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
2018-02-21 20:22:33,991 Stage-1 map = 0%, reduce = 0%
2018-02-21 20:22:41,018 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 3.0
sec
2018-02-21 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/.hive-
staging_hive_2018-02-21_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;
Práctica 6: Machine learning con Mahout

En esta práctica veremos cómo 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.

[cloudera@quickstart ~]$ tar xzvf movielens-100k.tar.gz


[cloudera@quickstart ~]$ cd movielens-100k
[cloudera@quickstart movielens-100k]$ hadoop fs -mkdir movierating
[cloudera@quickstart 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):

[cloudera@quickstart 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): (Puede utilizar el editor gedit)

1
2
3

3. Subiremos el fichero al HDFS


[cloudera@quickstart ~]$ hadoop fs -put users users

4. Por último ejecutaremos el recomendador de Mahout:


[cloudera@quickstart ~]$ 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:

5. Podemos monitorizar el progreso del trabajo a través del interfaz web del JobTracker:

JobTracker Web Interface: http://10.0.2.5:50030

6. Cuando finalice el trabajo tendremos la lista de recomendaciones en el directorio recs


dentro del fichero recs/part-r-00000 será:

[cloudera@quickstart ~]$ 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.79
7

055,337:4.7516527,903:4.750977]
Referencias:

Hadoop Online Tutorial – Hadoop HDFS Commands Guide


https://www.dezyre.com/hadoop-tutorial/hadoop-hdfs-commands

MapReduce tutorial. https://github.com/cloudera/mapreduce-tutorial

MapReduce. https://maprdocs.mapr.com/52/ClstrAdmin.html

Documentation Cloudera
https://www.cloudera.com/documentation/enterprise/5-9-x/topics/cloudera_quickstart_vm.html

Instalación de Hadoop y ejecución de MapReduce


https://github.com/pagutierrez/tutorial-hadoop/blob/master/instalacion.md

También podría gustarte