四、hadoop MapReduce之Job代码编写

22 篇文章 0 订阅
15 篇文章 0 订阅

1、模板代码,只要替换成自己写的Mapper和Reducer等等就行了


    public static void main(String[] args)  throws Exception{
        int exit = ToolRunner.run(new Configuration(), new WCRunner(), args);
        System.exit(exit);
    }
    
    @Override
    public int run(String[] strings) throws Exception{

        //hdfs操作文件系统的用户名,避免在windows下使用默认用户名对hdfs没有修改权限
        System.setProperty("HADOOP_USER_NAME", "root");
        Configuration conf = new Configuration();

        //namenode返回远程datanode主机的主机名,而不使用内网ip,
        //并且需要配置当前代码运行到的所有主机的hosts文件,
        //把namenode返回的主机名与对应主机ip的映射写好。。有钱的话可以用域名
        conf.set("dfs.client.use.datanode.hostname", "true");


        Job job = Job.getInstance(conf);
        
        //设置当前mapreduce程序的jar包所在路径,运行runjar时会把该路径的jar包上传至resourceManager指定的路径下
        //与下面的setJarByClass是设置一样的属性,不过看了源码之后了解到:
        //下面setJarByClass虽然同样会设置mapreduce.job.jar属性,但在windows本地用idea直接run运行时,setJarByClass方式是拿不到jar包的路径的,
        //如果拿不到,那么就不会去设置mapreduce.job.jar属性
        //所以在本地运行时,生效的设置是这一行。setJarByClass会无效。。所以这一行可以自己设置自己导出的本地jar包所在路径
        conf.set("mapreduce.job.jar","C:\\Users\\周利东\\.m2\\repository\\com\\example\\hadoop\\0.0.1-SNAPSHOT\\hadoop-0.0.1-SNAPSHOT.jar");


        //根据指定的class找到该类所属的jar包路径。
        //设置当前mapreduce程序的jar包所在路径,运行runjar时会把该jar包上传至resourceManager指定的路径下
        //如果找不到jar包路径(在本地用编译器直接run就可能找不到),则不会设置mapreduce.job.jar。。如果找到了jar包路径(使用hadoop jar xxx.jar方式运行),则会设置mapreduce.job.jar,即把前面的给覆盖掉。
        job.setJarByClass(WCRunner.class);

        //指定当前作业执行的Mapper与Reducer
        job.setMapperClass(WCMapper.class);
        job.setReducerClass(WCReduce.class);

        //指定Mapper与Reducer输出的key-value类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        //执行Mapper输出的key-value类型
        //可以覆盖上面的,这样的话就相当于上面两行是指定Reducer的输出kv类型
        //而下面两行是指定Mapper的输出kv类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);

        //指定输入数据存放在hdfs的目录,只要指定目录就行,到时候会读取整个目录下的所有文件
        FileInputFormat.setInputPaths(job, new Path("/wc/srcData"));

        Path path = new Path("/wc/output");
        FileSystem fileSystem = FileSystem.get(conf);
        if (fileSystem.exists(path)){
            fileSystem.delete(path,true );
        }

        //指定处理结果输出数据存放在hdfs的目录
        FileOutputFormat.setOutputPath(job,path );
        
        return job.waitForCompletion(true)?0:1;
    }

2、把项目打成jar包,然后丢到hadoop集群里面运行就行了。

运行命令格式:hadoop jar jar包名 主类全限定名

其中,主类指的是你要运行的main方法所处的类。

比如上面的代码中main方法在WCRunner中,所以使用命令:hadoop jar xxx.jar com.example.xx.xx.WCRunner

3、需要注意,数据输出的最低的那一层目录不要自己创建,mapreduce会创建,如果已经存在那个输出目,运行时会抛异常,提示你那个输出目录已经存在。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值