|
MapReduce应用需要先编译,然后通过指定输入路径(inputpath)来运行。编译过程确保代码无错误,而指定输入路径让程序知道从哪里读取数据进行处理,是执行MapReduce作业的基本步骤。
MapReduce是一种编程模型,用于处理和生成大数据集,它由两个主要阶段组成:Map阶段和Reduce阶段,在Map阶段,输入数据被分割成多个独立的块,然后每个块被映射到一个键值对,在Reduce阶段,所有具有相同键的键值对被组合在一起,并使用一个reduce函数进行处理。
zbhjcvf55tigit5.jpg
(图片来源网络,侵删)
以下是一个简单的MapReduce应用示例,用于统计文本中单词的出现次数:
1、编写Mapper类:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class WordCountMapper extends Mapper {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] words = value.toString().split("\s+");
for (String w : words) {
word.set(w);
context.write(word, one);
}
}
}
2、编写Reducer类:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordCountReducer extends Reducer {
public void reduce(Text key, Iterable[I] values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
3、编译并运行MapReduce应用:
确保已经安装了Hadoop和Java环境,将上述代码保存为WordCountMapper.java和WordCountReducer.java文件,使用以下命令编译这两个类:
$ javac classpathhadoop classpath d wordcount_classes WordCountMapper.java WordCountReducer.java
编译成功后,会生成一个名为wordcount_classes的目录,其中包含编译后的.class文件,创建一个名为wordcount.jar的JAR包,包含所有编译后的类:
$ jar cvf wordcount.jar C wordcount_classes/ .
使用以下命令运行MapReduce作业:
zbhjvg1d3hjea05.png
(图片来源网络,侵删)
$ hadoop jar wordcount.jar org.apache.hadoop.examples.WordCount input_path output_path
input_path是HDFS上存储输入数据的路径,output_path是要将结果写入的HDFS路径。
$ hadoop jar wordcount.jar org.apache.hadoop.examples.WordCount /user/hadoop/input /user/hadoop/output
运行完成后,可以在HDFS上查看output_path目录下的结果。
zbhjbienxe1bjtz.png
(图片来源网络,侵删) |
|