MapReduce是Hadoop分布式计算的核心组件,它能够把数据分解成小块,并分发到集群中的多台计算机上进行并行处理,最终将结果合并为一个有序的输出结果。在这里,我们将演示如何编写一个简单的MapReduce程序并部署在Hadoop2.2.0上运行。
首先,我们将编写一个简单的WordCount程序,该程序能够从指定的文本文件中输入数据,并统计出其中每个单词出现的次数。
- 编写Map函数
在WordCount程序中,Map函数的作用是将输入数据分解成每个单词,并为每个单词设置一个计数器,初始值为1。下面是一个示例Map函数。
public static class Map extends 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, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}
- 编写Reduce函数
Reduce函数的作用是对Map函数输出的每个单词的计数器进行累加,并输出最终的计数结果。下面是一个示例Reduce函数。
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
- 配置运行Hadoop的环境变量
在Linux环境下,在/etc/profile文件中添加如下环境变量。
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:${HADOOP_HOME}/bin
- 创建HDFS文件夹
在Hadoop执行前,需要在HDFS上进行目录创建。通过下列命令创建/wordcount/input目录。
$ hadoop fs -mkdir /wordcount
$ hadoop fs -mkdir /wordcount/input
- 将输入文件上传到HDFS上
将输入文件放置在本地文件系统上,并通过hadoop fs -put
将文件复制到HDFS上。输入文件在HDFS中的路径为/wordcount/input。
$ hadoop fs -put /path/to/input/file/in/local /wordcount/input/
- 编写运行WordCount程序的脚本
#!/bin/bash
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
input=/wordcount/input
output=/wordcount/output
hdfs dfs -rm -r -f $output
hadoop jar wordcount.jar WordCount $input $output
hadoop fs -cat $output/*
- 执行脚本
执行前请确认wordcount.jar位于指定位置,执行脚本。
$ sh run_wordcount.sh
以上就是简单的MapReduce程序如何在Hadoop2.2.0上运行的演示步骤。希望能对大家有所帮助。