分享

在 Hadoop 上编写 MapReduce 程序

xuanxufeng 发表于 2014-1-12 02:44:19 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 7 20311
本帖最后由 pig2 于 2014-2-2 14:56 编辑

Map Reduce是包含两个过程:Map过程和Reduce过程。每一个过程都包含键值对作为输入,程序员可以选择键和值的类型。

Map和Reduce的数据流是这样的:

Input ==> Map ==> Mapper Output ==> Sort and shuffle ==> Reduce ==> Final Output

使用Java编写Hadoop Map Reduce代码Map Reduce程序需要三个元素:Map, Reduce和运行任务的代码(在这里,

  1. import org.apache.hadoop.io.IntWritable;
  2. import org.apache.hadoop.io.LongWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Mapper;
  5. import java.io.IOException;
  6. public class Map extends Mapper<LongWritable, Text, Text,IntWritable> {
  7.     private final static IntWritable one = new IntWritable(1);
  8.     private Text word = new Text();
  9.     public void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException {
  10.         word.set(value.toString());
  11.         context.write(word, one);
  12. }
复制代码
我们把它叫做Invoker)。1) 创建Map(可以是任何名字)类和map函数,map函数是在org.apache.hadoop.mapreduce.Mapper.class类中,以抽象方法定义的。解释:Mapper类是一个泛型类,带有4个参数(输入的键,输入的值,输出的键,输出的值)。在这里输入的键为LongWritable(hadoop中的Long类型),输入的值为Text(hadoop中的String类型),输出的键为Text(关键字)和输出的值为Intwritable(hadoop中的int类型)。以上所有hadoop数据类型和java的数据类型都很相像,除了它们是针对网络序列化而做的特殊优化。2) 创建Reducer(任何名字)类和reduce函数,reduce函数是在org.apache.hadoop.mapreduce.Reducer.class类中,以抽象方法定义的。
  1. import org.apache.hadoop.io.IntWritable;
  2. import org.apache.hadoop.io.Text;
  3. import org.apache.hadoop.mapreduce.Reducer;
  4. import java.io.IOException;
  5. import java.util.Iterator;
  6. public class Reduce extends Reducer<Text, IntWritable, Text,IntWritable> {
  7.     @Override
  8.     protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
  9.         int sum = 0;
  10.         for(IntWritable intWritable : values){
  11.             sum += intWritable.get();
  12.         }
  13.         context.write(key, new IntWritable(sum));
  14.     }
  15. }
复制代码

解释:

Reducer类是一个泛型类,带有4个参数(输入的键,输入的值,输出的键,输出的值)。在这里输入的键和输入的值必须跟Mapper的输出的类型相匹配,输出的键是Text(关键字),输出的值是Intwritable(出现的次数)

3)我们已经准备号了Map和Reduce的实现类,现在我们需要invoker来配置Hadoop任务,调用Map Reduce程序。

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.fs.Path;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Job;
  5. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  6. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
复制代码
4)编译代码:
  1. mkdir WordCount javac -classpath ${HADOOP_HOME}/hadoop-0.20.2+228-core.jar -d WordCount path/*.java
复制代码
5)创建jar包
  1. jar -cvf ~/WordCount.jar -C WordCount/ .
复制代码
6)在本地文件系统中创建输入文件例如:mkdir /home/user1/wordcount/input
  1. cd /wordcount/input gedit file01 gedit file02
复制代码
7)复制本地的输入文件到HDFS
  1. $HADOOP_HOME/bin/hadoop fs -cp ~/wordcount/input/file01 /home/user1/dfs/input/file01 $HADOOP_HOME/bin/hadoop fs -cp ~/wordcount/input/file02 /home/user1/dfs/input/file02
复制代码
8) 执行jar包
  1. $HADOOP_HOME/bin/hadoop jar WordCount.jar WordCount /home/user1/dfs/input /home/user1/dfs/output
复制代码
9)执行完毕后,以下的命令是用于查看reduce的输出文件
  1. $HADOOP_HOME/bin/hadoop fs -ls /home/user1/dfs/output/
复制代码
10)使用如下命令来查看文件:
  1. $HADOOP_HOME/bin/hadoop fs -cat hdfs:///home/user1/dfs/output/part-00000 $HADOOP_HOME/bin/hadoop fs -cat hdfs:///home/user1/dfs/output/part-00001 $HADOOP_HOME/bin/hadoop fs -cat hdfs:///home/user1/dfs/output/part-00002
复制代码

已有(7)人评论

跳转到指定楼层
tang 发表于 2015-3-7 13:34:58
讲解得很详细,学习了
回复

使用道具 举报

w517424787 发表于 2016-2-17 14:45:03
楼主讲解的很详细!
回复

使用道具 举报

adminJJ 发表于 2016-2-24 14:19:33
讲解得很详细,学习了
回复

使用道具 举报

416961658 发表于 2016-7-25 18:33:21
将得很好,学习
回复

使用道具 举报

changgh 发表于 2016-10-17 17:15:24
讲的很好理解,有信心了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条