细节决定成败 MapReduce任务实战 Map Join

一、任务描述

在hdfs 上有两个文件
学生信息文件:hdfs://***.***.***:8020/user/train/joinjob/student.txt
以逗号分隔,第一列为学号,学号每个学生唯一,第二列为学生姓名。

点击(此处)折叠或打开

  1. 2016001,Join
  2. 2016002,Abigail
  3. 2016003,Abby
  4. 2016004,Alexandra
  5. 2016005,Cathy
  6. 2016006,Katherine
学生成绩信息文件:hdfs://***.***.***:8020/user/train/joinjob/student_score.txt
以逗号分隔,第一列为学号,学号每个学生唯一,第二列为课程代码,第三列为分数。

点击(此处)折叠或打开

  1. 2016001,YY,60
  2. 2016001,SX,88
  3. 2016001,YW,91
  4. 2016002,SX,77
  5. 2016002,YW,33
  6. .............
期望的结果文件形式如下

点击(此处)折叠或打开

  1. 2016001,Join,YY,60
  2. 2016001,Join,SX,88
  3. 2016001,Join,YW,91
  4. 2016002,Abigail,SX,77
  5. 2016002,Abigail,YW,33
  6. 2016002,Abigail,YY,56
  7. 2016003,Abby,YY,34
  8. 2016003,Abby,SX,84
  9. 2016003,Abby,YW,69
  10. 2016004,Alexandra,YY,89
  11. 2016004,Alexandra,SX,84
  12. .......

二、任务分析

  1. 这是一个两个数据集关联的任务。关联有map端join ,和reduce端join。 通常在有一个数据集比较小,可在全部放到内存中时,选择map端join;当两个数据集都很大时,使用reduce端join,这时可以使用Bloom过滤器来增加效率。 本次任务我们使用map端join实现。
  2. 此任务关联到直接输出即可,不需要reduce过程。
  3. 本任务会使用到的技术有:分布式缓存DistributedCache、mapreduce中的本地文件读取

三、实现思路

  1. 把一个学生信息使用分布式缓存分发到各个任务节点。
  2. 学生成绩信息当做map的input。
  3. 在mapper 的setup函数中读取已缓存到本的学生信息,并保存到一个HashMap中,key为学号,value为姓名。
  4. 在mapper函数中对每一个学生成绩信息,根据学号去上一步的map中去取姓名信息。
  5. 封装到Text对象中输出。

三、实现代码

点击(此处)折叠或打开

  1. package join;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.URI;
  6. import java.util.HashMap;
  7. import java.util.Map;

  8. import org.apache.commons.lang.StringUtils;
  9. import org.apache.hadoop.conf.Configuration;
  10. import org.apache.hadoop.conf.Configured;
  11. import org.apache.hadoop.fs.FileSystem;
  12. import org.apache.hadoop.fs.Path;
  13. import org.apache.hadoop.io.LongWritable;
  14. import org.apache.hadoop.io.NullWritable;
  15. import org.apache.hadoop.io.Text;
  16. import org.apache.hadoop.mapreduce.Job;
  17. import org.apache.hadoop.mapreduce.Mapper;
  18. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  19. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  20. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  21. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  22. import org.apache.hadoop.util.Tool;
  23. import org.apache.hadoop.util.ToolRunner;
  24. import org.apache.log4j.Logger;


  25. public class MapJoinDirectOutPutJob extends Configured implements Tool {
  26.         private static String STUDENTNAME_PARAM ="STUDENTNAME_PARAM";
  27.         private static String INPATH_SCORE = "joinjob/student_score.txt";
  28.         private static String OUTPATH = "joinjob/output";
  29.         public static class MapJoinDirectOutPutMapper extends Mapper<LongWritable,Text,NullWritable,Text>{
  30.                 private BufferedReader br = null;
  31.                 private Map <String,String> map =new HashMap<String,String>();
  32.                 private Text newValue = new Text();
  33.                 @Override
  34.                 protected void map(LongWritable key, Text value, Context context)
  35.                                 throws IOException, InterruptedException {
  36.                         String [] words = StringUtils.split(value.toString(),',');
  37.                         String name = map.get(words[0]);
  38.                         newValue.set(words[0]+","+name +","+words[1]+","+words[2]);
  39.                         context.write(NullWritable.get(), newValue);
  40.                 }

  41.                 @Override
  42.                 protected void setup(Context context) throws IOException,
  43.                                 InterruptedException {
  44.                         Configuration conf = context.getConfiguration();
  45.                         FileSystem fs = FileSystem.getLocal(conf);

  46.                         br = new BufferedReader(new InputStreamReader(fs.open(new Path("studentLink.txt"))));
  47.                         String current;
  48.                         while((current= br.readLine())!=null){
  49.                                 String [] words = current.split(",");
  50.                                 map.put(words[0],words[1]);
  51.                         }
  52.                         br.close();
  53.                 }

  54.         }

  55.         @Override
  56.         public int run(String[] args) throws Exception {
  57.                 Job job = Job.getInstance(getConf(),"MapJoinDirectOutPutJob");
  58.                 job.setJarByClass(getClass());
  59.                 Configuration conf = job.getConfiguration();

  60.                 conf.set(STUDENTNAME_PARAM, args[0]);

  61.                 Path in = new Path(INPATH_SCORE);
  62.                 Path out = new Path(OUTPATH);
  63.                 FileSystem.get(conf).delete(out,true);
  64.                 FileInputFormat.setInputPaths(job, in);
  65.                 FileOutputFormat.setOutputPath(job, out);
  66.                 job.setInputFormatClass(TextInputFormat.class);
  67.                 job.setOutputFormatClass(TextOutputFormat.class);
  68.                 job.setMapperClass(MapJoinDirectOutPutMapper.class);
  69.                 job.setMapOutputKeyClass(NullWritable.class);
  70.                 job.setMapOutputValueClass(Text.class);

  71.                 job.setNumReduceTasks(0);
  72.                 URI uri = new URI("hdfs://***.***.***.***:8020/user/train/joinjob/student.txt#studentLink.txt");
  73.                 job.addCacheFile(uri);

  74.                 return job.waitForCompletion(true) ?0:1;
  75.         }

  76.         public static void main(String [] args){
  77.                 int r = 0;
  78.                 try{
  79.                         r = ToolRunner.run(new Configuration(),new MapJoinDirectOutPutJob(),args);
  80.                 }catch(Exception e){
  81.                         e.printStackTrace();
  82.                 }
  83.                 System.exit(r);
  84.         }

  85. }
本文地址:http://blog.itpub.net/30066956/viewspace-2120063/



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30066956/viewspace-2120063/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30066956/viewspace-2120063/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值