MapReduce编程模型[通俗易懂]

MapReduce编程模型[通俗易懂]1.MapReduce简介MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。一个完整的mapreduce程序在分布式运行时有三类实例进程:MRAppMaster负责整个程序的过程调度及状态协调MapTask负责map阶段的整个数据处理流程ReduceTask负责reduce阶段的整个数据处理流程2.MapReduce核心编程思想1)分布式的运算程序往往需要分成至少2个阶段。2

大家好,又见面了,我是你们的朋友全栈君。

1.MapReduce简介
MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。
一个完整的mapreduce程序在分布式运行时有三类实例进程:
MRAppMaster 负责整个程序的过程调度及状态协调
MapTask 负责map阶段的整个数据处理流程
ReduceTask 负责reduce阶段的整个数据处理流程
2.MapReduce核心编程思想
在这里插入图片描述
1)分布式的运算程序往往需要分成至少2个阶段。
2)第一个阶段的maptask并发实例,完全并行运行,互不相干。
3)第二个阶段的reduce task并发实例互不相干,但是他们的数据依赖于上一个阶段的所有maptask并发实例的输出。
4)MapReduce编程模型只能包含一个map阶段和一个reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个mapreduce程序,串行运行。
3.MapReduce编程规范
在这里插入图片描述
用户需要编写的代码分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)
1)Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)map()方法(maptask进程)对每一个<K,V>调用一次

2)Reducer阶段
(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4)Reducetask进程对每一组相同k的<k,v>组调用一次reduce()方法
3)Driver阶段
整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象
4.实操案例
需求:统计某个文本文件中每个单词出现的次数并输出到文件
4.1编写Mapper类

public class WordCountMapper extends Mapper<LongWritable,Text,Text,LongWritable> { 
   
    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
   
        String line = value.toString();
        String[] split = line.split(",");
        for (String word : split) { 
   
            context.write(new Text(word),new LongWritable(1));
        }
    }
}

4.2编写Reduce类


public class WordCountReducer extends Reducer<Text,LongWritable,Text,LongWritable> { 
   
    /** * 自定义我们的reduce逻辑 * 所有的key都是我们的单词,所有的values都是我们单词出现的次数 * @param key * @param values * @param context * @throws IOException * @throws InterruptedException */
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException { 
   
        long count = 0;
        for (LongWritable value : values) { 
   
            count += value.get();
        }
        context.write(key,new LongWritable(count));
    }
}

4.3编写Driver类即是主方法main的类

public class JobMain extends Configured implements Tool { 
   
    @Override
    public int run(String[] args) throws Exception { 
   
        Job job = Job.getInstance(super.getConf(), JobMain.class.getSimpleName());
        //打包到集群上面运行时候,必须要添加以下配置,指定程序的main函数
        job.setJarByClass(JobMain.class);
        //第一步:读取输入文件解析成key,value对
        job.setInputFormatClass(TextInputFormat.class);
        TextInputFormat.addInputPath(job,new Path("hdfs://node1:8020/wordcount"));

        //第二步:设置我们的mapper类
        job.setMapperClass(WordCountMapper.class);
        //设置我们map阶段完成之后的输出类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        //第三步,第四步,第五步,第六步,省略
        //第七步:设置我们的reduce类
        job.setReducerClass(WordCountReducer.class);
        //设置我们reduce阶段完成之后的输出类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        //第八步:设置输出类以及输出路径
        job.setOutputFormatClass(TextOutputFormat.class);
        TextOutputFormat.setOutputPath(job,new Path("hdfs://node1:8020/wordcount_out"));
        boolean b = job.waitForCompletion(true);
        return b?0:1;
    }

    /** * 程序main函数的入口类 * @param args * @throws Exception */
    public static void main(String[] args) throws Exception { 
   
        Configuration configuration = new Configuration();
        Tool tool  =  new JobMain();
        int run = ToolRunner.run(configuration, tool, args);
        System.exit(run);
    }
}

关于这个最后的主类还有另外一种写法

public class WordMain { 
   
    public static void main(String[] args) throws IOException,
            ClassNotFoundException,
            InterruptedException { 
   

        args = new String[]{ 
   "E:\\mapreduce\\hello.txt","E:\\mapreduce\\20200712"};
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);
        job.setJarByClass(WordMain.class);
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        FileInputFormat.setInputPaths(job,new Path(args[0]));
        FileOutputFormat.setOutputPath(job,new Path(args[1]));
        job.waitForCompletion(true);
    }
}

两种方式任君选择,需要注意的是输出路径一定不能存在否则会报错的。其实也很好理解。毕竟这是要在集群中运行的如果两个不同的mapreduce任务输出路径是同一个那么结果就无法分清楚了。关于基本的MapReduce就介绍到这里,后续的省略的第3456步会在后面文章中更新的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148820.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • maven常见命令及打包方式

    maven常见命令及打包方式做项目时使用maven构建项目已经是现在的流行做法了。maven最大的作用就是用于对项目中jar包依赖的统一管理。maven还有一些常用的命令,更加方便项目的管理。下面介绍一些常用的命令及其作用。(1)mavenclean。对项目进行清理,清理的过程中会删除删除target目录下编译的内容。(2)mavencompile。编译项目源代码。(3)maventest。对项目的运…

  • c3p0连接池的配置方式

    c3p0连接池的配置方式c3p0的配置方式分为三种,分别是1.setters一个个地设置各个配置项2.类路径下提供一个c3p0.properties文件3.类路径下提供一个c3p0-config.xml文件1.setters一个个地设置各个配置项这种方式最繁琐,形式一般是这样:01Propertiesprops= new Properties();

  • c#时间转时间戳_数据库时间戳转换日期格式

    c#时间转时间戳_数据库时间戳转换日期格式原文地址:http://www.cnblogs.com/codemo/archive/2012/05/18/2507251.html//////时间戳转为C#格式时间/////////privateDateTimeGetTime(stringtimeStamp){

  • vue笔记(2)vue中使用ajax

    vue笔记(1):https://blog.csdn.net/qq_43537987/article/details/93402865Vue中利用vue-resource发起Ajax请求除了vue-resource之外,还可以使用axios的第三方包实现实现数据的请求参考网址:https://www.runoob.com/vue2/vuejs-ajax.htmlhttp…

  • Pycharm自动导入模块小技巧「建议收藏」

    Pycharm自动导入模块小技巧「建议收藏」周末愉快!不知道大家周末写不写代码,哈哈,反正我已经加完班回来了,今天分享一个能提高编码效率的小技巧,可能你早就在用了,也可能像我一样刚学会,还是趁热跟大家分享一下。如果能把工具熟练运用,往往能达到事半功倍的效果,Pycharm是很多Python开发者的首选IDE,提供各种快捷键、重构功能、调试技巧等,Python是动态语言,对于自动导入模块没有静态语言那么方便,但有了Pycharm,还是…

  • pycharm使用conda环境_anaconda运行python

    pycharm使用conda环境_anaconda运行python基础环境是ubuntu的。之前一直使用windows系统,新公司需要使用ubuntu环境,所以从头开始搭建一个python运行的环境。主要的步骤可以记为如下:1.安装anaconda2.配置一个conda的python36环境3.安装pycharm4.在pycharm中使用2中配置的环境作为项目的解释器5.其他一些注意事项1.安装anaconda1.2安装下载的安装包,我下载的最新版…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号