Hadoop MapReduce — это система YARN для параллельной обработки больших наборов данных. Если вы новичок в Hadoop, сначала изучите сайт Hadoop . В этой статье я помогу вам быстро начать писать простейшее задание MapReduce. Это известное задание WordCount — первое, что пишут многие начинающие Hadoop: простое приложение, которое подсчитывает количество вхождений каждого слова в заданном входном наборе.
Этот пример кода взят из учебного пособия MapReduce, доступного здесь . Вы можете проверить исходный код непосредственно из этого небольшого проекта Github, который я создал.
Шаг 1. Установите и запустите сервер Hadoop
В этом руководстве я предполагаю, что ваша установка Hadoop готова. Для настройки одного узла, посетите здесь .
Запустите Hadoop:
amresh@ubuntu:/home/amresh$ cd /usr/local/hadoop/ amresh@ubuntu:/usr/local/hadoop-1.0.2$ bin/start-all.sh amresh@ubuntu:/usr/local/hadoop-1.0.2$ sudo jps 6098 JobTracker 8024 Jps 5783 DataNode 5997 SecondaryNameNode 5571 NameNode 6310 TaskTracker
(Убедитесь, что NameNode, DataNode, JobTracker, TaskTracker, SecondaryNameNode работают)
Шаг 2. Напишите задание MapReduce для Wordcount
Map.java (реализация Mapper)
package com.impetus.code.examples.hadoop.mapred.wordcount; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reporter; public class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); output.collect(word, one); } } }
Reduce.java (Реализация редуктора)
package com.impetus.code.examples.hadoop.mapred.wordcount; import java.io.IOException; import java.util.Iterator; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reducer; import org.apache.hadoop.mapred.Reporter; public class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { int sum = 0; while (values.hasNext()) { sum += values.next().get(); } output.collect(key, new IntWritable(sum)); } }
WordCount.java (Работа)
package com.impetus.code.examples.hadoop.mapred.wordcount; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.FileInputFormat; import org.apache.hadoop.mapred.FileOutputFormat; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapred.TextOutputFormat; public class WordCount { public static void main(String[] args) throws Exception { JobConf conf = new JobConf(WordCount.class); conf.setJobName("wordcount"); conf.setOutputKeyClass(Text.class); conf.setOutputValueClass(IntWritable.class); conf.setMapperClass(Map.class); conf.setCombinerClass(Reduce.class); conf.setReducerClass(Reduce.class); conf.setInputFormat(TextInputFormat.class); conf.setOutputFormat(TextOutputFormat.class); FileInputFormat.setInputPaths(conf, new Path(args[0])); FileOutputFormat.setOutputPath(conf, new Path(args[1])); JobClient.runJob(conf); } }
Шаг 3. Скомпилируйте и создайте файл Jar
Я предпочитаю Maven для создания моего проекта Java. Вы можете найти файл POM здесь и добавить в свой проект Java. Это обеспечит готовность вашей зависимости от Jad Hadoop.
Просто беги:
amresh@ubuntu:/usr/local/hadoop-1.0.2$ cd ~/development/hadoop-examples amresh@ubuntu:/home/amresh/development/hadoop-examples$ mvn clean install
Шаг 4. Создайте входные файлы для копирования слов из
amresh@ubuntu:/usr/local/hadoop-1.0.2$ bin/hadoop dfs -mkdir ~/wordcount/input amresh@ubuntu:/usr/local/hadoop-1.0.2$ sudo vi file01 (Hello World Bye World) amresh@ubuntu:/usr/local/hadoop-1.0.2$ sudo vi file02 (Hello Hadoop Goodbye Hadoop) amresh@ubuntu:/usr/local/hadoop-1.0.2$ bin/hadoop dfs -copyFromLocal file01 /home/amresh/wordcount/input/ amresh@ubuntu:/usr/local/hadoop-1.0.2$ bin/hadoop dfs -copyFromLocal file02 /home/amresh/wordcount/input/ amresh@ubuntu:/usr/local/hadoop-1.0.2$ bin/hadoop dfs -ls /home/amresh/wordcount/input/ Found 2 items -rw-r--r-- 1 amresh supergroup 0 2012-05-08 14:51 /home/amresh/wordcount/input/file01 -rw-r--r-- 1 amresh supergroup 0 2012-05-08 14:51 /home/amresh/wordcount/input/file02
Шаг 5. Запустите задание MapReduce, которое вы написали
amresh@ubuntu:/usr/local/hadoop-1.0.2$ bin/hadoop jar ~/development/hadoop-examples/target/hadoop-examples-1.0.jar com.impetus.code.examples.hadoop.mapred.wordcount.WordCount /home/amresh/wordcount/input /home/amresh/wordcount/output amresh@ubuntu:/usr/local/hadoop-1.0.2$ bin/hadoop dfs -ls /home/amresh/wordcount/output/ Found 3 items -rw-r--r-- 1 amresh supergroup 0 2012-05-08 15:23 /home/amresh/wordcount/output/_SUCCESS drwxr-xr-x - amresh supergroup 0 2012-05-08 15:22 /home/amresh/wordcount/output/_logs -rw-r--r-- 1 amresh supergroup 41 2012-05-08 15:23 /home/amresh/wordcount/output/part-00000 amresh@ubuntu:/usr/local/hadoop-1.0.2$ bin/hadoop dfs -cat /home/amresh/wordcount/output/part-00000 Bye 1 Goodbye 1 Hadoop 2 Hello 2 World 2