概述

虽然现在都在说大内存时代,不过内存的发展怎么也跟不上数据的步伐吧。所以,我们就要想办法减小数据量。这里说的减小可不是真的减小数据量,而是让数据分散开来。分开存储、分开计算。这就是 MapReduce 分布式的核心。


版权说明

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
本文作者:Q-WHai
发表日期: 2016年5月10日
本文链接:http://blog.csdn.net/lemon_tree12138/article/details/51367732
来源:CSDN
更多内容:分类 >> 大数据之 Hadoop


目录

文章目录

  • 概述
  • 版权说明
  • 目录
    • @[toc]
  • MapReduce 简介
  • MapReduce 原理
  • WordCount 程序
    • 需求分析
    • 逻辑实现
      • Mapper
      • Reducer
      • Client
    • 本地运行
    • 分布式运行
      • 打包
      • 上传源数据
      • 分布式运行
      • 结果视窗
  • Ref
  • 征集

MapReduce 简介

要了解 MapReduce,首先要了解 MapReduce 的载体是什么。在 Hadoop 中,用于执行 MapReduce 任务的机器有两个角色:一个是 JobTracker,另一个是 TaskTracker。JobTracker 是用于管理和调度工作的,TaskTracker 是用于执行工作的。一个 Hadoop 集群中只有一台 JobTracker(当然在 Hadoop 2.x 中,一个 Hadoop 集群中可能有多个 JobTracker)。


MapReduce 原理

MapReduce 模型的精髓在于它的算法思想——分治。对于分治的过程可以参见我之前的一篇博客《大数据算法:对5亿数据进行排序》。还有就是可以去学习一下排序算法中的归并排序,在这个排序算法中就是基于分治思想的。
回归正题,在 MapReduce 模型中,可以把分治的这一概念表现得淋漓尽致。在处理大量数据的时候(比如说 1 TB,你别说没有这么多的数据,大公司这点数据也不算啥的),如果只是单纯地依赖我们的硬件,就显得有些力不从心了。首先我们的内存没有那么大,如放在磁盘上处理,那么过多的 IO 操作无疑是一个死穴。聪明的 Google 工程师总是给我们这些渣渣带来惊喜,他们想把了把这些数据分散到许多机器上,在这些机器上完成一些初步的计算,再经过一系列的汇总,最后在我们的机器上(Master/Namenode)统计结果。
要知道我们不可能把我们的数据分散到随意的 N 台机器上。那么我们就必须让这些机器之间建立一种可靠的关联,这样的关联形成了一个计算机集群。这样我们的数据就可以分发到集群中的各个计算机上了。在 Hadoop 里这一操作可以通过 -put 这一指令实现,关于这一点在下面的操作过程中也有体现。
当数据被上传到 Hadoop 的 HDFS 文件系统上之后,就可以通过 MapReduce 模型中的 Mapper 先将数据读进内存,过程像下面这样:

经过 Mapper 的处理,数据会变成这样

好了,到了这里,Map 的过程就已经结束了。接下来就是 Reduce 的过程了。

可以看到这里有一个 conbin 的过程,这个过程,也可以没有的。而有的时候是一定不能有的,在后面我们可以会单独来说说这里的 conbin,不过不是本文的内容,就不详述了。
这样整个 MapReduce 过程就已经 over 了,下面看看具体的实现及测试结果吧。


WordCount 程序

关于 WordCount 的 MapReduce 计算模型可参见本人的在线绘图工具:https://www.processon.com/view/572bf161e4b0739b929916ea

需求分析

  1. 现在有大量的文件
  2. 每个文件又有大量的单词
  3. 要求统计每个单词的词频

逻辑实现

Mapper

public static class CoreMapper extends Mapper<Object, Text, Text, IntWritable> {private static final IntWritable one = new IntWritable(1);private static Text label = new Text();@Overrideprotected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)throws IOException, InterruptedException {StringTokenizer tokenizer = new StringTokenizer(value.toString());while(tokenizer.hasMoreTokens()) {label.set(tokenizer.nextToken());context.write(label, one);}}}

Reducer

public static class CoreReducer extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable count = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values,Reducer<Text, IntWritable, Text, IntWritable>.Context context)throws IOException, InterruptedException {if (null == values) {return;}int sum = 0;for (IntWritable intWritable : values) {sum += intWritable.get();}count.set(sum);context.write(key, count);}}

Client

public class ComputerClient extends Configuration implements Tool {public static void main(String[] args) {ComputerClient client = new ComputerClient();args = new String[] {AppConstant.INPUT,AppConstant.OUTPUT};try {ToolRunner.run(client, args);} catch (Exception e) {e.printStackTrace();}}@Overridepublic Configuration getConf() {return this;}@Overridepublic void setConf(Configuration arg0) {}@Overridepublic int run(String[] args) throws Exception {Job job = new Job(getConf(), "ComputerClient-job");job.setJarByClass(CoreComputer.class);job.setMapperClass(CoreComputer.CoreMapper.class);job.setCombinerClass(CoreComputer.CoreReducer.class);job.setReducerClass(CoreComputer.CoreReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));return job.waitForCompletion(true) ? 0 : 1;}
}

本地运行

关于本地运行没什么好说的,就是在 Eclipse 里配置好运行参数或是直接在代码里指定输入输出路径。然后 Run As 一个 Hadoop 程序即可。

分布式运行

在分布式运行 MapReduce 的过程中,主要有以下几个步骤:

  1. 打包
  2. 上传源数据
  3. 分布式运行

打包

在打包的过程中,可以使用命令行打包,也可以使用 Eclipse 自带的 Export。在 Eclipse 的打包导出过程中,与打包导出一个 Java 的 jar 过程是一样的。这里就不多说了。假设我们打成的 jar 包为: job.jar

上传源数据

上传源数据是指将本地的数据上传到 HDFS 文件系统上。
在上传源数据之前我们需要在 HDFS 上新建你需要上传的目标路径,然后使用下面的这条指令即可完成数据的上传。

$ hadoop fs -mkdir <hdfs_input_path>
$ hadoop fs -put <local_path> <hdfs_input_path>

如果这里之前你不进行创建目录,上传过程会因为找不到目录而出现异常情况。
数据上传完成后,这些数据会分布在你整个集群的 DataNode 上,而不只是在你的本地机器上了。

分布式运行

等上面的所有事情已经就绪,那么就可以使用下面的 hadoop 指令运行我们的 hadoop 程序。

$ hadoop jar job.jar <hdfs_input_path> <hdfs_output_path>

结果视窗

打开浏览器
这里是程序中执行的过程中,进度的变化情况

下面是程序执行完成时的网页截图


Ref

  • 《Hadoop 实战》

征集

如果你也需要使用ProcessOn这款在线绘图工具,可以使用如下邀请链接进行注册:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d

从 WordCount 到 MapReduce 计算模型相关推荐

  1. 3 MapReduce计算模型

    MapReduce被广泛应用于日志分析.海量数据排序.在海量数据中查找特定模式等场景中. MapReduceJob 在Hadoop中,每个MapReduce任务都被初始化为一个Job. 每个Job又可 ...

  2. 大数据Hadoop(十六):MapReduce计算模型介绍

    文章目录 MapReduce计算模型介绍 理解MapReduce思想 Hadoop MapReduce设计构思

  3. 大数据图数据库之离线挖掘计算模型

    /* 版权声明:可以任意转载,转载时请务必标明文章原始出处和作者信息 .*/             author: 张俊林 节选自<大数据日知录:架构与算法>十四章,书籍目录在此 对于离 ...

  4. 大数据计算技术-数据计算处理系统-计算模式(计算模型)

    大数据计算技术-数据计算处理系统-计算模式(计算模型) 1计算模式(计算模型) 1.1批处理计算模式:数据计算处理系统例子:MapReduce计算模型 1.2流计算模式 1.2.1定义 1.2.2流计 ...

  5. Storm 02_Storm 计算模型

    一.Storm 计算模型 Topology – DAG有向无环图的实现 对于Storm实时计算逻辑的封装 即,由一系列通过数据流相互关联的Spout.Bolt所组成的拓扑结构 生命周期:此拓扑只要启动 ...

  6. 【Hadoop】谷歌的三篇论文(GFS、MapReduce分布式计算模型 、BigTable大表)

    谷歌的三篇论文(GFS.MapReduce分布式计算模型 .BigTable大表) 0 谷歌的基本思想:三驾马车 1 第一篇论文:GFS 1.1 Google的GFS分布式文件系统的基本原理 1.2 ...

  7. Hadoop MapReduce编程模型

    MapReduce编程模型 目录 MapReduce编程模型 1.MapReduce编程模型简介 2.什么是MapReduce 3.MapReduce的优缺点 4.MapReduce程序设计方法 5. ...

  8. mapreduce 编程模型

    MapReduce是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,它适用的应用场景往往具有一个共同的特点:任务可被分解成相互独立的子问题.基于该特点,MapReduce编程模型给出了其分布 ...

  9. 大数据快速入门(05):MapReduce 编程模型赏析

    一.Hadoop 诞生的传奇故事 (上图是 Doug Cutting,hadoop 之父) 1985年,Cutting 毕业于美国斯坦福大学. Cutting 的第一份工作是在 Xerox 做实习生, ...

最新文章

  1. 魔改Attention大集合
  2. 这一次,彻底弄懂 JavaScript 执行机制
  3. 说一下StoreBoard和纯代码编程各有什么好处吧
  4. 什么是JSON处理(JSON-P API)?
  5. 基于模型的嵌入式开发流程_如何使用基于模型的测试来改善工作流程
  6. java 判断日期连续_如何在Java中检查日期是否大于另一个日期?[重复]
  7. wdcp v2.5.15 php版本,linux服务器/虚拟主机管理系统wdcp v2.5.6版本发布
  8. videojs如何获取请求消息_WEB之基于HTTP协议的几种实时数据获取技术
  9. intel无线网卡日志服务器,不定期找不到Intel N 2230无线网卡
  10. LTE下行物理层传输机制(6)-下行资源分配方式(Resource Allocation Type)
  11. J2ME 访问JAR和JAD文件中的属性
  12. 厉害了,我的谷歌小弟
  13. Rust: Descending Order
  14. Interproscan性能测试
  15. 再谈OT算法的协同文档制作的底层基础架构记录
  16. 计算机网络第一章知识总结
  17. Windows10设置任务栏透明化
  18. SVG之Animation
  19. 北上深杭广漂,似曾相识的代码人生(转知乎)
  20. 易语言路由器服务器,易语言通过post实现对小米路由器操作的代码

热门文章

  1. 《研磨设计模式》chap22 装饰模式Decorator(3)I/O流
  2. C++ Primer 5th笔记(7)chapter7 类:字面值常量类
  3. 机器学习(六)——优化器
  4. 机器学习(二)——鸢尾花案例
  5. 数学建模——K-means聚类模型Python代码
  6. buu [BJDCTF 2nd]cat_flag
  7. Shell之系统函数和自定义函数
  8. python——深拷贝与浅拷贝的区别
  9. sqli-labs第一关(MySql基础)
  10. SEO -- 搜索引擎优化