• Hadoop解析--MapReduce


    从本篇博客開始咱们一起来具体了解Hadoop的每一个部分。我们在上篇博客中介绍了HDFS,MapReduce,MapReduce为了更有效率事实上是建立在HDFS之上的。有了分布式的文件系统,我们就能在这个系统之上更有效率地进行分布式的计算。我们看看它是咱么实现更优秀的分布式计算。

    优势

    第一。限制大小

            由于HDFS对本地的文件大小做了限制,这样我们本地一个任务处理的量是有限的。尽管我们能够改变这个值。可是也为更好的运行任务打下了坚实的基础,分片的处理方式。不不过分开。还有限制。这种思想使我们欠缺的,分开不过攻克了问你。而限制,是在优化解决方式。


    第二。备份

            HDFS对全部的文件,都会进行备份,这样就会降低非常多麻烦。我们以往对文件的备份还原一直是个头疼的问题。尤其是数据量上来之后。这件事情变得越来越不可控,而HDFS为计算数据做了备份。这样我们的失误率就会下降,在一台机器文件毁坏的情况下。不影响我们的计算,这就降低了查询日志的时间(相对传统数据库的备份策略)


    第三。本地计算

            MapReduce中,全部的计算,都是在本地完毕,及时有计算须要外来数据。也是集合好后完毕。这样保证了我们最高效的带宽利用。使我们对数据的处理能力随着集群数目的增大而线性增大。


    第四,预处理

            在计算的过程中,假设我们对数据的处理结果每次都要控制机进行汇总,和我们能够对计算出的数据,进行预处理,当然是预处理的效果好些,这样相当于减轻了控制机的压力。这种设计在前台js里也有涉及,我们通过js让客户机运行部分代码,减轻我们server的压力,这种效果,自然是比較优秀的!


    第五,心跳

            在MapReduce过程中。心跳对我们的帮助也非常大,它帮助我们维护计算的可靠性,帮助我们屏蔽一部分因机器故障造成的计算失败,相当于心跳是我们计算过程中主要的保证!

    原理

    那么mapreduce是怎么做的呢。我们看看这幅原理图:


    再看看一些细节上的图,帮我们这里了解下详细是怎么执行的:


    源代码

    有了前面的认识。我们通过代码看看,我们要秉着一个原则,就是这是简单的分治法的应用。所以这一切都不复杂,map就是分治法的分。reduce就是分治法的治,将大问题打散成小问题,最后整合小问题的结果:

    map:

    public static class Map extends MapReduceBase implements 
                Mapper<LongWritable, Text, Text, IntWritable> { 
            private final static IntWritable one = new IntWritable(1); 
            private Text word = new Text();
            public void map(LongWritable key, Text value, 
                    OutputCollector<Text, IntWritable> output, Reporter reporter) 
                    throws IOException { 
                String line = value.toString(); 
                StringTokenizer tokenizer = new StringTokenizer(line); 
                while (tokenizer.hasMoreTokens()) { 
                    word.set(tokenizer.nextToken()); 
                    output.collect(word, one); 
                } 
            } 
        }

    reduce:

     public static class Reduce extends MapReduceBase implements 
                Reducer<Text, IntWritable, Text, IntWritable> { 
            public void reduce(Text key, Iterator<IntWritable> values, 
                    OutputCollector<Text, IntWritable> output, Reporter reporter) 
                    throws IOException { 
                int sum = 0; 
                while (values.hasNext()) { 
                    sum += values.next().get(); 
                } 
                output.collect(key, new IntWritable(sum)); 
            } 
        }

    任务运行的方法:

    public static void main(String[] args) throws Exception { 
            JobConf conf = new JobConf(WordCount.class); 
            conf.setJobName("wordcount");
            conf.setOutputKeyClass(Text.class); 
            conf.setOutputValueClass(IntWritable.class);
            conf.setMapperClass(Map.class); 
            conf.setCombinerClass(Reduce.class); 
            conf.setReducerClass(Reduce.class);
            conf.setInputFormat(TextInputFormat.class); 
            conf.setOutputFormat(TextOutputFormat.class);
            FileInputFormat.setInputPaths(conf, new Path(args[0])); 
            FileOutputFormat.setOutputPath(conf, new Path(args[1]));
            JobClient.runJob(conf); 
        } 


    任务方法解析:

    首先解说一下 Job 的 初始化过程 。

    main 函数调用 Jobconf 类来对 MapReduce Job 进行初始化,然后调用 setJobName() 方法命名这个 Job 。

    对Job进行合理的命名有助于 更快 地找到Job,以便在JobTracker和Tasktracker的页面中对其进行 监视 。

    JobConf conf = new JobConf(WordCount. class ); conf.setJobName("wordcount" );

    接着设置Job输出结果<key,value>的中key和value数据类型。由于结果是<单词,个数>。所以key设置为"Text"类型,相当于Java中String类型。

    Value设置为"IntWritable"。相当于Java中的int类型。


    conf.setOutputKeyClass(Text.class );
    conf.setOutputValueClass(IntWritable.class );

    然后设置Job处理的Map(拆分)、Combiner(中间结果合并)以及Reduce(合并)的相关处理类。这里用Reduce类来进行Map产生的中间结果合并。避免给网络传输数据产生压力。
    conf.setMapperClass(Map.class );
    conf.setCombinerClass(Reduce.class );
    conf.setReducerClass(Reduce.class );

    接着就是调用setInputPath()和setOutputPath()设置输入输出路径。
    conf.setInputFormat(TextInputFormat.class );
    conf.setOutputFormat(TextOutputFormat.class );

    总结:

            不论什么技术都是一种思想的体现,而这个世界。我们最主要的一个算法就是分治法。这是我们拿在手里的一本百科全书,差点儿能够解决我们80%的问题。而性能的问题尤其如此,我们经过了几百万年的演变,我们成为了地球上的强大智慧生物,我们本身就具有几百万年延续自己生命的强大竞争力。及我们几千年文明的积淀。我们如今遇到的问题,前人用文字书写在书上,我们一定能够找到。或者我们如今的生活,这个社会,也一定有这个问题的缩影。

  • 相关阅读:
    来自极客标签10款最新设计素材系列七
    支持触摸设备的响应式HTML5音频播放器 AudioPlayer.js
    最流行的JavaScript库,jQuery不再支持IE旧版本
    来自极客标签10款最新设计素材系列六
    来自极客标签10款最新设计素材系列四
    推荐10款来自极客标签的超棒前端特效[第四期]
    响应式的无限滚动全屏dribbble作品集布局展示效果
    推荐10款来自极客标签的超棒前端特效[第五期]
    基于属性编程
    郁闷的企业软件开发
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7060650.html
Copyright © 2020-2023  润新知