Foro Formación Hadoop
Curso Online Desarrollador Hadoop
En ocasiones vamos a necesitar indicar el nombre del fichero en nuestra salida del Reduce, la manera de hacer esto es la siguiente:
- La clase encarga de realizar esto es MultipleOutputs.
- Para cada valor a escribir le indicaremos el nombre del fichero al cual queremos que vaya ese registro.
public void setup(Context context){
out =new MultipleOutputs(context);
}
public void reduce(Text key,Iterable values,Context context)throwsIOException,InterruptedException{
for(Text t : values){
out.write(key, t, nombredelfichero);
}
}
protected void cleanup(Context context)throwsIOException,InterruptedException{
out.close();}
Temario completo del curso de Desarrollador Hadoop:
Capítulo 1: Introducción
Capítulo 2: Introducción a Hadoop
Capítulo 3: Hadoop - Conceptos básicos
Capítulo 4: Desarrollo de un programa MapReduce
Capítulo 5: Programación básica con Hadoop Core API
Capítulo 6: Testear aplicaciones MapReduce
Capítulo 7: Rendimiento de un MapReduce
Capítulo 8: Datos de entrada y salida de un MapReduce
Capítulo 9: Resolución de problemas con MapReduce
Capítulo 10: Ecosistema de Hadoop
¿Cómo modificar el separador por defecto del KeyValueTextInputFormat ?Si no se indica otro separador, el separador por defecto es el tabulador.
//New API
Configuration conf =newConfiguration();
conf.set("key.value.separator.in.input.line",",");
Job job =newJob(conf);
job.setInputFormatClass(KeyValueTextInputFormat.class);
Ejemplo del WordCount en MapReduce:
1
2
3 import java.io.IOException;
4 import java.util.*;
5
6 import org.apache.hadoop.fs.Path;
7 import org.apache.hadoop.conf.*;
8 import org.apache.hadoop.io.*;
9 import org.apache.hadoop.mapreduce.*;
10 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
11 import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
12 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
13 import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
14
15 public class WordCount {
16
17 public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
18 private final static IntWritable one = new IntWritable(1);
19 private Text word = new Text();
20
21 public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
22 String line = value.toString();
23 StringTokenizer tokenizer = new StringTokenizer(line);
24 while (tokenizer.hasMoreTokens()) {
25 word.set(tokenizer.nextToken());
26 context.write(word, one);
27 }
28 }
29 }
30
31 public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
32
33 public void reduce(Text key, Iterable<IntWritable> values, Context context)
34 throws IOException, InterruptedException {
35 int sum = 0;
36 for (IntWritable val : values) {
37 sum += val.get();
38 }
39 context.write(key, new IntWritable(sum));
40 }
41 }
42
43 public static void main(String[] args) throws Exception {
44 Configuration conf = new Configuration();
45
46 Job job = new Job(conf, "wordcount");
47
48 job.setOutputKeyClass(Text.class);
49 job.setOutputValueClass(IntWritable.class);
50
51 job.setMapperClass(Map.class);
52 job.setReducerClass(Reduce.class);
53
54 job.setInputFormatClass(TextInputFormat.class);
55 job.setOutputFormatClass(TextOutputFormat.class);
56
57 FileInputFormat.addInputPath(job, new Path(args[0]));
58 FileOutputFormat.setOutputPath(job, new Path(args[1]));
59
60 job.waitForCompletion(true);
61 }
62
63 }
Redes sociales