7
Avenida de Castilla,1 - Edificio Best Point - Oficina 21B 28830 San Fernando de Henares (Madrid) tel./fax: +34 91 675 33 06 [email protected] - www.autentia.com Somos su empresa de Soporte a Desarrollo Informático. Ese apoyo que siempre quiso tener... 1. Desarrollo de componentes y proyectos a medida Tecnología Desarrollo Sistemas Gran Empresa Producción autentia Certificación o Pruebas Verificación previa RFP Concurso Consultora 1 Consultora 2 Consultora 3 Equipo propio desarrollo Piloto 3a 3b 1. Definición de frameworks corporativos. 2. Transferencia de conocimiento de nuevas arquitecturas. 3. Soporte al arranque de proyectos. 4. Auditoría preventiva periódica de calidad. 5. Revisión previa a la certificación de proyectos. 6. Extensión de capacidad de equipos de calidad. 7. Identificación de problemas en producción. 3. Arranque de proyectos basados en nuevas tecnologías ¿Qué ofrece Autentia Real Business Solutions S.L? Para más información visítenos en: www.autentia.com Compartimos nuestro conociemiento en: www.adictosaltrabajo.com Gestor portales (Liferay) Gestor de contenidos (Alfresco) Aplicaciones híbridas Tareas programadas (Quartz) Gestor documental (Alfresco) Inversión de control (Spring) BPM (jBPM o Bonita) Generación de informes (JasperReport) ESB (Open ESB) Control de autenticación y acceso (Spring Security) UDDI Web Services Rest Services Social SSO SSO (Cas) Spring MVC, JSF-PrimeFaces /RichFaces, HTML5, CSS3, JavaScript-jQuery JPA-Hibernate, MyBatis Motor de búsqueda empresarial (Solr) ETL (Talend) Dirección de Proyectos Informáticos. Metodologías ágiles Patrones de diseño TDD 2. Auditoría de código y recomendaciones de mejora 4. Cursos de formación (impartidos por desarrolladores en activo)

F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Como aquí lo importante son los datos y dado que el clásico wordcount (el holamundo de MapReduce) está muy visto, he ... Para

  • Upload
    leliem

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

Page 1: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Como aquí lo importante son los datos y dado que el clásico wordcount (el holamundo de MapReduce) está muy visto, he ... Para

Avenida de Castilla,1 - Edificio Best Point - Oficina 21B28830 San Fernando de Henares (Madrid)

tel./fax: +34 91 675 33 [email protected] - www.autentia.com

Somos su empresa de Soporte a Desarrollo Informático.Ese apoyo que siempre quiso tener...

1. Desarrollo de componentes y proyectos a medida

TecnologíaDesarrolloSistemas

Gran Empresa

Producción

autentia

Certificacióno Pruebas

Verificación previa

RFP Concurso

Consultora 1

Consultora 2

Consultora 3

Equipo propio desarrolloPiloto

3a

3b

1. Definición de frameworks corporativos.2. Transferencia de conocimiento de nuevas arquitecturas.3. Soporte al arranque de proyectos.4. Auditoría preventiva periódica de calidad.5. Revisión previa a la certificación de proyectos.6. Extensión de capacidad de equipos de calidad.7. Identificación de problemas en producción.

3. Arranque de proyectos basados en nuevas tecnologías

¿Qué ofrece Autentia Real Business Solutions S.L?

Para más información visítenos en: www.autentia.com

Compartimos nuestro conociemiento en: www.adictosaltrabajo.com

Gestor portales (Liferay)Gestor de contenidos (Alfresco)Aplicaciones híbridas

Tareas programadas (Quartz)Gestor documental (Alfresco)Inversión de control (Spring)

BPM (jBPM o Bonita)Generación de informes (JasperReport)ESB (Open ESB)

Control de autenticación y acceso (Spring Security)UDDIWeb ServicesRest ServicesSocial SSOSSO (Cas)

Spring MVC, JSF-PrimeFaces /RichFaces, HTML5, CSS3, JavaScript-jQuery

JPA-Hibernate, MyBatisMotor de búsqueda empresarial (Solr)ETL (Talend)

Dirección de Proyectos Informáticos.Metodologías ágilesPatrones de diseñoTDD

2. Auditoría de código y recomendaciones de mejora

4. Cursos de formación (impartidos por desarrolladores en activo)

Page 2: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Como aquí lo importante son los datos y dado que el clásico wordcount (el holamundo de MapReduce) está muy visto, he ... Para

Entra en Adictos a través de

Entrar Deseo registrarmeOlvidé mi contraseña

Inicio Quiénes somos Formación Comparador de salarios Nuestros libros Más

» Estás en: Inicio Tutoriales Primeros pasos de MapReduce con Hadoop

Síguenos a travésde:

Catálogo de serviciosAutentia

Últimas Noticias

» PhoneGap y ApacheCordova: resolviendo elenredo.

» Mi semana de desk-surfingen Otogami

» Enamórate de un geek

» Buscamos quien nos ayudeen Autentia con WordPress

» XXII Charla Autentia -PhoneGap/Cordova ¡québueno que viniste!

Histórico de noticias

Últimos Tutoriales

» Primeros pasos con Hadoop:instalación y configuración enLinux

» Como configurar CloudFlareen nuestra web

» Crea todo un entorno demáquinas virtuales con un solocomando, gracias a Vagrant

» Depurar Tomcat en remoto.

» Firewall de alta

Ver todos los tutoriales del autor

Juan Alonso Ramos

Consultor tecnológico de desarrollo de proyectos informáticos.

Ingeniero en Informática, especialidad en Ingeniería del Software

Puedes encontrarme en Autentia: Ofrecemos de servicios soporte a desarrollo, factoría yformación

Somos expertos en Java/J2EE

Fecha de publicación del tutorial: 2014-03-03 Tutorial visitado 1 veces Descargar en PDF

Primeros pasos de MapReduce con Hadoop

0. Índice de contenidos.

1. Introducción.2. Entorno.3. Configuración del proyecto.4. Análisis de DataSet.5. Mapper.6. Reducer.7. Driver.8. Conclusiones.

1. Introducción.

Una vez visto el tutorial de primeros pasos con Hadoop, instalación y configuración, muchos se dirán: "pues muy bonito, ¿yesto para qué vale?". Como dijimos en el anterior tutorial, principalmente para realizar tareas distribuidas sobre grandesficheros de datos utilizando el paradigma MapReduce. En este tutorial vamos a ponernos manos a la obra realizando unejemplo simple de un algoritmo MapReduce con el API de Hadoop.

Como aquí lo importante son los datos y dado que el clásico wordcount (el holamundo de MapReduce) está muy visto, hebuscado un dataset que pueda darme un poco más de miga para sacar un poco de jugo a los datos.

Por suerte, aunque queda mucho camino por recorrer, nuestras administraciones van publicando lo que se conoce como opendata o datos abiertos poniendo a disposición del que quiera y de forma libre datos relativos a censos, información económica,laboral, sectorial, mediciones medioambientales, datos estadísticos de consumo, transportes, etc. A mí me ha parecidointeresante un dataset sobre la medición de la calidad del aire en Castilla y León desde 1997 que he sacado de la páginadatosabiertos.jcyl.es . Vamos a ver con Hadoop cómo extraer información relevante de un fichero que contiene más de150.000 líneas.

Puedes descargarte el código del tutorial desde mi repositorio de github pinchando aquí.

2. Entorno.

El tutorial se ha realizado con el siguiente entorno:

Ubuntu 12.04 64 bitsOracle Java SDK 1.6.0_27Apache Hadoop 2.2.0Apache Maven 3.1.1

3. Configuración del proyecto

Lo primero que haremos será crear un proyecto Maven y añadir al pom.xml las dependencias necesarias para trabajar.

12

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance

?

MoreShareShareShareShareShareShare

Primeros pasos de MapReduce con Hadoop http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pag...

1 of 6 03/03/14 09:40

Page 3: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Como aquí lo importante son los datos y dado que el clásico wordcount (el holamundo de MapReduce) está muy visto, he ... Para

PUSH THIS Page Pushers Community Help?

----no clicks + + + + + + + +

0 people brought clicks to this page

powered by karmacracy disponibilidad con balanceo decarga (Clúster)

Últimos Tutoriales delAutor

» Primeros pasos con Hadoop:instalación y configuración enLinux

» Trabajando con Mule ESB

» Crear un proyecto de MuleESB con Mule Studio

» Crear un proyecto de MuleESB con Maven

» Primeros pasos con MuleESB

Categorías del Tutorial

Big Data

Últimas ofertas deempleo

2011-09-08Comercial - Ventas -MADRID.

2011-09-03Comercial - Ventas -VALENCIA.

2011-08-19Comercial - Compras -ALICANTE.

2011-07-12Otras Sin catalogar -MADRID.

2011-07-06Otras Sin catalogar -LUGO.

4. Análisis del DataSet

Antes de implementar ni una línea de código debemos pararnos a analizar lo que pretendemos extraer del fichero de datos. Siabrimos el fichero CSV que nos hemos descargado esto es lo que nos aparece.

Como se puede ver, el fichero tiene una línea por cada día de medición de diferentes medidas relativas a diferentescontaminantes como son el monóxido de carbono, monóxido de nitrógeno, dióxido de nitrógeno, ozono, etc... por provincia ypoblación donde se encuentra la estación donde se ha tomado la medida.

Para hacer una primera prueba sencilla con el API de Hadoop vamos a calcular la media de las muestras tomadas desde 1997de Monóxido de Carbono (CO) agrupados por provincia. Este sería un cálculo que aporta valor, podemos saber qué provinciade Castilla y León tiene un menor nivel de presencia de esta sustancia. Sin ser ningún entendido en química la he escogidopor ser una sustancia que se desprende al quemar gasolina, petróleo, carbón, etc. y que representan un problema por estarpresentes en el aire que respiramos.

El ranking final de las provincias menos contaminadas que resulte del cálculo que vamos a realizar, no se debe tomar como unestudio serio para determinar la calidad del aire presente en ellas ya que se ha decidido tomar este indicador como podríahaber sido cualquier otro. Imagino que el cálculo para medir en conjunto la calidad del aire de una provincia debe ser muchomás complejo pero queda fuera del ámbito de este tutorial.

5. Mapper

Dentro del paradigma MapReduce, en la tarea mapper se reciben los bloques de datos que contienen la información. Es aquídonde debemos extraer la información que nos irá llegando línea a línea. Nuestra clase AirQualityMapper extenderá de laclase Mapper definiendo los formatos de entrada de la clave y valor y los tipos de salida que devolverá la función. La salida delmapper será la entrada del reducer. En nuestro caso el valor de la clave contendrá el offset del fichero es decir el puntero queva recorriendo el fichero entero y extrae cada una de las líneas del mismo. La línea nos la pasará en el campo value. Alheredar de Mapper debemos implementar el método map cuyos parámetros de entrada corresponderán con los tipos

3456789

1011121314151617181920212223242526272829303132333435363738394041

<modelversion>4.0.0</modelversion> <groupid>com.autentia.tutoriales</groupid> <artifactid>mapreduce-basico</artifactid> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.encoding>UTF-8</project.encoding> <java.version>1.6</java.version> </properties> <build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <configuration> <encoding>${project.encoding}</encoding> <source>${java.version} <target>${java.verion}</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupid>org.apache.hadoop</groupid> <artifactid>hadoop-common</artifactid> <version>2.2.0</version> </dependency> <dependency> <groupid>org.apache.hadoop</groupid> <artifactid>hadoop-client</artifactid> <version>2.2.0</version> </dependency> </dependencies> </project>

123456789

10111213141516

DIA;CO(mg/m3);NO(ug/m3);NO2(ug/m3);O3(ug/m3);PM10(ug/m3);SH2(ug/m3);PM25(ug/m3);PST(ug/m301/01/1997;1.2;12;33;63;56;;;;19;ÁVILA;Ávila02/01/1997;1.3;15;35;59;47;;;;17;ÁVILA;Ávila03/01/1997;1.5;18;43;54;65;;;;19;ÁVILA;Ávila04/01/1997;1.6;56;73;50;74;;;;22;ÁVILA;Ávila05/01/1997;1.4;11;33;63;54;;;;18;ÁVILA;Ávila06/01/1997;1.6;28;46;56;60;;;;20;ÁVILA;Ávila07/01/1997;1.5;19;41;58;47;;;;23;ÁVILA;Ávila08/01/1997;1.8;35;58;43;43;;;;27;ÁVILA;Ávila09/01/1997;1.1;14;34;60;55;;;;17;ÁVILA;Ávila10/01/1997;1.3;35;53;38;61;;;;18;ÁVILA;Ávila11/01/1997;1.3;27;40;25;59;;;;16;ÁVILA;Ávila12/01/1997;1.5;33;41;24;61;;;;16;ÁVILA;Ávila....09/09/1997;No cumple el anexo IV de la Decisión del Consejo 97/101/CE;25;62;48;56;;;;17;áVILA;ávila....

?

Primeros pasos de MapReduce con Hadoop http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pag...

2 of 6 03/03/14 09:40

Page 4: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Como aquí lo importante son los datos y dado que el clásico wordcount (el holamundo de MapReduce) está muy visto, he ... Para

genéricos la que definimos anteriormente.

El método map es muy sencillo, considerando que en el campo value tenemos una línea del fichero de entrada, la troceamosseparando por el token ";". Nos quedaremos con los valores que nos interesan, para nuestro análisis nos quedamos con elvalor correspondiente al Monóxido de Carbono (CO) y con la provincia.

Aparte de la tarea de extracción del dato, el mapper también realiza la tarea de filtrado, en nuestro caso no emitimos ningúnvalor que no sea numérico. Hacemos esto porque hay líneas que no tienen todas las medidas bien informadas supongo queporque ese día la muestra tomada no es fiable de acuerdo a las directiva que regula la medición.

Una parte muy importante en la fase de map es la información que devuelve el propio método, como es lógico. Esto se realizaescribiendo en el objeto context siempre una tupla compuesta por una clave y un valor. La clave será la provincia y como valorel dato relativo a la medición de Monóxido de Carbono (CO). Los tipos que se escriben en el context son del tipo Writable. Esun tipo de datos específico en Hadoop ya que por temas de rendimiento redefine los tipos de Java, por ejemplo si la clave esde tipo string tenemos que crear un tipo Text, si el valor es de tipo Double, debemos crear un DoubleWritable. Tambiénpodremos crear nuestros propios Writables para trabajar con objetos compuestos. Esto lo veremos en próximos tutoriales.

El código del mapper quedaría así:

6. Reducer

El reducer es la parte del algoritmo que recoge agrupadas por clave todos los valores emitidos en la fase map. En nuestrocaso a la tarea reduce le llegará algo como (ÁVILA, [1.2, 1.3, 1.5, 1.6, 1.4...]). En esta fase debemos realizar la operación quecalcule la media de los valores recibidos para la provincia.

De forma muy parecida al map, en este caso extendemos de Reducer y definimos los valores de entrada y de salida delmétodo reduce que debemos implementar obligatoriamente. Los valores de entrada deben coincidir con los valores de salidade la función map. La salida del reduce será de tipo texto resultando la tupla que contendrá la provincia y el valor medio de lasmuestras tomadas de Monóxido de Carbono (CO) desde 1997.

Recorremos con un bucle for el iterable que Hadoop nos pasa con los valores de las muestras tomadas. En el campo keyvendrá la provincia. Si existen medidas para la provincia se emitirá el resultado escribiendo en el objeto context. De formasimilar al map, se escribe siempre una tupla key/value. En nuestro caso la provincia y la media obtenida redondeando en 2decimales.

7. Driver

Pues ahora que ya tenemos todo, sólo nos faltaría ejecutarlo. Para eso nos creamos una función Driver que no es más que unmétodo main que creará un Job configurando todo lo necesario para ejecutar la tarea: función map, función reduce, tipos dedatos que manejan, entrada y salida de datos, etc. Utilizaremos también la clase ToolRunner de Hadoop, una utilidad que se

123456789

101112131415161718192021222324252627282930313233

public static class AirQualityMapper extends Mapper<Object, Text, Text, DoubleWritable> { private static final String SEPARATOR = ";"; /** * DIA; CO (mg/m3);NO (ug/m3);NO2 (ug/m3);O3 (ug/m3);PM10 (ug/m3);SH2 (ug/m3);PM25 (ug/m3);PST (ug/m3 * 01/01/1997; 1.2; 12; 33; 63; 56; ; ; ; 19 ;áVILA ;ávila */ public void map(Object key, Text value, Context context) throws IOException, InterruptedException { final String[] values = value.toString().split(SEPARATOR); // final String date = format(values[0]); final String co = format(values[1]); // final String no = format(values[2]); // final String no2 = format(values[3]); // final String o3 = format(values[4]); // final String pm10 = format(values[5]); // final String sh2 = format(values[6]); // final String pm25 = format(values[7]); // final String pst = format(values[8]); // final String so2 = format(values[9]); final String province = format(values[10]); // final String station = format(values[11]); if (NumberUtils.isNumber(co.toString())) { context.write(new Text(province), new DoubleWritable(NumberUtils.toDouble(co))); } } private String format(String value) { return value.trim(); }}

123456789

101112131415161718

public static class AirQualityReducer extends Reducer<Text, DoubleWritable, Text, Text> { private final DecimalFormat decimalFormat = new DecimalFormat("#.##"); public void reduce(Text key, Iterable<DoubleWritable> coValues, Context context) throws int measures = 0; double totalCo = 0.0f; for (DoubleWritable coValue : coValues) { totalCo += coValue.get(); measures++; } if (measures > 0) { context.write(key, new Text(decimalFormat.format(totalCo / measures))); } }}

?

?

Primeros pasos de MapReduce con Hadoop http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pag...

3 of 6 03/03/14 09:40

Page 5: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Como aquí lo importante son los datos y dado que el clásico wordcount (el holamundo de MapReduce) está muy visto, he ... Para

encarga de pasar en la invocación por línea de comandos de nuestra clase Driver una serie de parámetros de configuraciónque le pasemos.

El resultado final (eliminando código repetido) quedaría así:

Creamos la clase AirQualityManager que para poder invocarse a través de ToolRunner debe extender de Configured eimplementar el interfaz Tool. Define el método main que servirá de punto de entrada a nuestra función. En el main invocamosal ToolRunner creando una instancia de nuestra clase manager pasándole los argumentos que recogemos por línea decomandos.

Esto llamará a nuestro método run que valida los datos recibidos como entrada ya que es necesario introducir el fichero quecontiene los datos y también el directorio de salida donde se escribirá el resultado. A continuación borra el directorio si yaexiste (Hadoop da un error si ya está creado) y crea un nuevo Job pasándole la configuración recogida por línea de comandossi la hubiera. Al job hay que configurarle una serie de parámetros como son el formato de entrada y salida, en nuestro casouna entrada de texto línea a línea, el mapper y el reducer, los tipos de datos que se manejan, los ficheros de entrada y eldirectorio de salida. Invocamos y esperamos mediante la llamada al método waitForCompletion. El valor true indica el modoverbose.

Ya sólo queda ejecutar y esperar el resultado. Para ello antes debemos crear el directorio y subir al HDFS el fichero quecontiene los datos mediante el comando:

Podemos comprobar si se ha subido bien mediante el comando:

123456789

10111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

package com.autentia.tutoriales; //imports ... public class AirQualityManager extends Configured implements Tool { /** Map */ public static class AirQualityMapper extends Mapper<Object, Text, Text, DoubleWritable> { private static final String SEPARATOR = ";"; public void map(Object key, Text value, Context context) throws IOException, InterruptedException ... } } /** Reduce */ public static class AirQualityReducer extends Reducer<Text, DoubleWritable, Text, Text> { public void reduce(Text key, Iterable<DoubleWritable> coValues, Context context) ... } } @Override public int run(String[] args) throws Exception { if (args.length != 2) { System.err.println("AirQualityManager required params: {input file} {output dir}" System.exit(-1); } deleteOutputFileIfExists(args); final Job job = new Job(getConf()); job.setJarByClass(AirQualityManager.class); job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); job.setMapperClass(AirQualityMapper.class); job.setReducerClass(AirQualityReducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(DoubleWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); return 0; } private void deleteOutputFileIfExists(String[] args) throws IOException { final Path output = new Path(args[1]); FileSystem.get(output.toUri(), getConf()).delete(output, true); } public static void main(String[] args) throws Exception { ToolRunner.run(new AirQualityManager(), args); }}

12

$ hadoop fs -mkdir input$ hadoop fs -put input/calidad_del_aire_cyl_1997_2013.csv input

1 $ hadoop fs -ls input

?

?

?

Primeros pasos de MapReduce con Hadoop http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pag...

4 of 6 03/03/14 09:40

Page 6: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Como aquí lo importante son los datos y dado que el clásico wordcount (el holamundo de MapReduce) está muy visto, he ... Para

Share | 0

O también desde la url http://localhost:50075 donde se ve la información del NameNode y del filesystem de HDFS.

El siguiente paso será generar un jar que será la forma de pasarle a Hadoop el código que tiene que ejecutar. Para ellousamos maven haciendo un mvn package. Una vez hecho esto ejecutamos el siguiente comando para lanzar el Job.

Después de unos pocos segundos nos dejará el resultado en el directorio output. Lo abrimos y tendremos el resultado delcálculo de la media de Monóxido de Carbono (CO) por provincia.

Enhorabuena a los sorianos por tener un aire tan limpio :)

8. Conclusiones.

En este tutorial hemos visto lo sencillo que resulta crear un Job en Hadoop y extraer información de un fichero que a simplevista no nos dice gran cosa a menos que se procese. El fichero con el que hemos trabajado era pequeño, unas 150.000 líneas(9 MB). Imaginad ficheros de cientos de millones de líneas, quizá la tarea no tardaría unos segundos en terminar sino horas odías por lo que ya tendríamos todo montado para distribuir nuestra tarea en un cluster que redujera los tiempos de proceso.

En próximos tutoriales complicaremos un poco más el problema y explotaremos un poquito más la información de la quedisponemos.

Puedes descargarte el código del tutorial desde mi repositorio de github pinchando aquí.

Espero que te haya sido de ayuda.

Un saludo.

Juan

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

1234

$ hadoop jar target/mapreduce-basico-0.0.1-SNAPSHOT.jar com.autentia.tutoriales.AirQualityManager input/calidad_del_aire_cyl_1997_2013.csv output

123456789

BURGOS 0.86LEÓN 0.98PALENCIA 1.18SALAMANCA 1.39SEGOVIA 1.02SORIA 0.18VALLADOLID 0.69ZAMORA 0.84ÁVILA 0.96

?

?

Primeros pasos de MapReduce con Hadoop http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pag...

5 of 6 03/03/14 09:40

Page 7: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Como aquí lo importante son los datos y dado que el clásico wordcount (el holamundo de MapReduce) está muy visto, he ... Para

Esta obra está licenciada bajo licencia Creative Commons de Reconocimiento-No comercial-Sin obras derivadas 2.5

» Registrate y accede a esta y otras ventajas «

Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Copyright 2003-2014 © All Rights Reserved | Texto legal y condiciones de uso | Banners | Powered by Autentia | Contacto

Primeros pasos de MapReduce con Hadoop http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pag...

6 of 6 03/03/14 09:40