从本篇博客開始我们一块儿来具体了解Hadoop的每个部分。咱们在上篇博客中介绍了HDFS,MapReduce,MapReduce为了更有效率事实上是创建在HDFS之上的。有了分布式的文件系统,咱们就能在这个系统之上更有效率地进行分布式的计算。咱们看看它是咱么实现更优秀的分布式计算。java
第一。限制大小算法
因为HDFS对本地的文件大小作了限制,这样咱们本地一个任务处理的量是有限的。尽管咱们可以改变这个值。但是也为更好的运行任务打下了坚实的基础,分片的处理方式。不不过度开。还有限制。这种思想使咱们欠缺的,分开不过攻克了问你。而限制,是在优化解决方式。数据库
第二。备份网络
HDFS对所有的文件,都会进行备份,这样就会下降很是多麻烦。咱们以往对文件的备份还原一直是个头疼的问题。尤为是数据量上来以后。这件事情变得愈来愈不可控,而HDFS为计算数据作了备份。这样咱们的失误率就会降低,在一台机器文件毁坏的状况下。不影响咱们的计算,这就下降了查询日志的时间(相对传统数据库的备份策略)app
第三。本地计算分布式
MapReduce中,所有的计算,都是在本地完毕,及时有计算需要外来数据。也是集合好后完毕。这样保证了咱们最高效的带宽利用。使咱们对数据的处理能力随着集群数目的增大而线性增大。函数
第四,预处理oop
在计算的过程当中,假设咱们对数据的处理结果每次都要控制机进行汇总,和咱们可以对计算出的数据,进行预处理,固然是预处理的效果好些,这样至关于减轻了控制机的压力。这种设计在前台js里也有涉及,咱们经过js让客户机运行部分代码,减轻咱们server的压力,这种效果,天然是比較优秀的!post
第五,心跳性能
在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); } } }
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" );
Value设置为"IntWritable"。至关于Java中的int类型。
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 );
不论什么技术都是一种思想的体现,而这个世界。咱们最主要的一个算法就是分治法。这是咱们拿在手里的一本百科全书,差点儿可以解决咱们80%的问题。而性能的问题尤为如此,咱们通过了几百万年的演变,咱们成为了地球上的强大智慧生物,咱们自己就具备几百万年延续本身生命的强大竞争力。及咱们几千年文明的积淀。咱们现在遇到的问题,前人用文字书写在书上,咱们必定可以找到。或者咱们现在的生活,这个社会,也必定有这个问题的缩影。