mapReducer示例

package cn.itcast.bigdata.mr.flowsum;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class FlowCount {
   
   static class FlowCountMapper extends Mapper<LongWritable, Text, Text, FlowBean>{
      FlowBean bean = new FlowBean();
      @Override
      protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
          
         //将一行内容转成string
         String line = value.toString();
         //切分字段
         String[] fields = line.split("\t");
         //取出手机号
         String phoneNbr = fields[1];
         //取出上行流量下行流量
         long upFlow = Long.parseLong(fields[fields.length-3]);
         long dFlow = Long.parseLong(fields[fields.length-2]);
         
         //context.write(new Text(phoneNbr), new FlowBean(upFlow, dFlow));
         bean.set(upFlow,dFlow);
         context.write(new Text(phoneNbr), bean);
      }
   }
   
   static class FlowCountReducer extends Reducer<Text, FlowBean, Text, FlowBean>{
      FlowBean bean = new FlowBean();
      //<183323,bean1><183323,bean2><183323,bean3><183323,bean4>.......
      @Override
      protected void reduce(Text key, Iterable<FlowBean> values, Context context) throws IOException, InterruptedException {
         long sum_upFlow = 0;
         long sum_dFlow = 0;
         
         //遍历所有bean,将其中的上行流量,下行流量分别累加
         for(FlowBean bean: values){
            sum_upFlow += bean.getUpFlow();
            sum_dFlow += bean.getdFlow();
         }
         
         //FlowBean resultBean = new FlowBean(sum_upFlow, sum_dFlow);
         //context.write(key, resultBean);
         bean.set(sum_upFlow,sum_dFlow);
         context.write(key, bean);

      }
      
   }
   
   public static void main(String[] args) throws Exception {
      Configuration conf = new Configuration();

      //在本地运行,默认的配置,不写也是会有这样的配置
//    conf.set("mapreduce.framework.name", "local");
//    conf.set("fs.defaultFs", "file:///");//读哪里的数据,写到哪里
      //运行集群模式(idea中操作集群),就是把程序提交到yarn中去运行
      //要想运行为集群模式,以下3个参数要指定为集群上的值
      conf.set("mapreduce.framework.name", "yarn");
      conf.set("yarn.resourcemanager.hostname", "linux1");//文件存取地
      conf.set("fs.defaultFS", "hdfs://linux1:9000/");
      System.setProperty("HADOOP_USER_NAME", "hadoop");//指定用户
      //因为windows启动脚本后的环境变量,不符合linux语法,所以与win下需要重写YARNRunner.java。mac下不用

      Job job = Job.getInstance(conf);

      //指定本程序的jar包所在的本地路径(四种场景)
      //1.idea运行本地单机hadoop时,无须设置(用于测试,速度快、方便)
      //2.打成jar包,idea中来操作集群时使用
      job.setJar("/Users/mx/Desktop/hadoop.jar");
      //3.打成jar包,在集群中 java -jar 时使用,需要导入四个xml配置文件
//    job.setJar("/home/hadoop/hadoop.jar");
      //4.打成jar包,在集群中 hadoop jar 时使用(常用)
//    job.setJarByClass(FlowCount.class);
      
      //指定本业务job要使用的mapper/Reducer业务类
      job.setMapperClass(FlowCountMapper.class);
      job.setReducerClass(FlowCountReducer.class);
      
      //指定mapper输出数据的kv类型
      job.setMapOutputKeyClass(Text.class);
      job.setMapOutputValueClass(FlowBean.class);
      
      //指定最终输出的数据的kv类型
      job.setOutputKeyClass(Text.class);
      job.setOutputValueClass(FlowBean.class);
      
      //指定job的输入原始文件所在目录
      FileInputFormat.setInputPaths(job, new Path(args[0]));
      //指定job的输出结果所在目录
      FileOutputFormat.setOutputPath(job, new Path(args[1]));
      
      //将job中配置的相关参数,以及job所用的java类所在的jar包,提交给yarn去运行
      /*job.submit();*/
      boolean res = job.waitForCompletion(true);
      System.exit(res?0:1);  
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值