Hadoop-MapReduce原理及操作(小实验)

本篇博客原理部分摘取自视频http://yun.itheima.com/course/301.html
实验部分教程来自https://www.shiyanlou.com/courses/237

(如果有不理解的可以直接查看上面的链接,另外说一下,该博客只能帮助你理解mapreduce的原理,如果你接触过相关开发的话,本博客可能并不能给你带来帮助。)

MapReduce思想

MapReduce思想在生活中处处可见。其的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)
Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
Reduce负责“合”,即对map阶段的结果进行全局汇总。
这两个阶段合起来正是MapReduce思想的体现。

还有一个比较形象的语言解释MapReduce:
我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就更快。现在我们到一起,把所有人的统计数加在一起。这就是“Reduce“。

Hadoop MapReduce设计构思

MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成–个完整的分布式运算程序,并发运行在Hadoop集上。

既然是做计算的框架,那么表现形式就是有个输入( input ),MapReduce 操作这个输入( input),通过本身定义好的计算模型,得到一个输出(output)。
对许多开发者来说,自己完完全全实现一个并行计算程序难度太大,而.MapReduce就是一种简化并行计算的编程模型,降低了开发并行应用的入门门槛。

Hadoop MapReduce 构思体现在如下的三个方面:

  • 如何对付大数据处理: 分而治之
    对相互间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分而治之的策略。并行计算的第一个重要问题是如何划分计算任务或者计算数据以便对划分的子任务或数据块同时进行计算不可分拆的计算任务或相互间有依赖关系的数据无法进行并行计算!

  • 构建抽象模型: Map 和Reduce
    MapReduce借鉴了函数式语言中的思想,用Map和Reduce两个函数提供了高层的并行编程抽象模型。
    Map:对一组数据元素进行某种重复式的处理;
    Reduce:对Map的中间结果进行某种进一步的结果整理。
    MapReduce中定义了如下的Map和Reduce两个抽象的编程接口,由用户去
    编程实现:
    map:(k1;v1)→[(k2; v2)] (分别对应 [划分的任务:运算结果] )
    reduce: (k2; [v2])→[(k3; v3)]
    Map和Reduce为程序员提供了一个清晰的操作接口抽象描述。通过以上两个编程接口,大家可以看出MapReduce处理的数据类型是<key,value>键值对。

  • 统一构架,隐藏系统层细节
    如何提供统一的计算框架,如果没有统一封装底层细节,那么程序员则需要考虑诸如数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此,MapReduce设计提供了统一的计算框架, 为程序员隐藏了绝大多数系统层面的处理细节。
    MapReduce最大的亮点在于通过抽象模型和计算框架把需要做什么(what need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高层的编程接口和框架。**程序员仅需要关心其应用层的其体计算问题,仅需编写少量的处理应用本身计算问题的程序代码。**如何具体完成这个并行计算任务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理:从分布代码的执行,到大到数千小到单个节点集群的自动调度使用。

MapReduce框架结构

一个完整的mapreduce程序在分布式运行时有三类实例进程
1、MRAppMaster: 负责整个程序的过程调度及状态协调
2、MapTask: 负责map阶段的整个数据处理流程
3、ReduceTask: 负责reduce阶段的整个数据处理流程

运行流程:
在这里插入图片描述
1.在集群中的任意一个节点提交 MapReduce 程序。

2.JobClient 收到作业后,JobClient 向 JobTracker 请求获取一个 Job ID。

3.将运行作业所需要的资源文件复制到 HDFS 上(包括 MapReduce 程序打包的 JAR 文件、配置文件和客户端计算所得的输入划分信息),这些文件都存放在 JobTracker 专门为该作业创建的文件夹中,文件夹名为该作业的 Job ID。

4.获得作业 ID 后,提交作业。

5.JobTracker 接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度,当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个 map 任务,并将 map 任务分配给 TaskTracker 执行。

6.对于 map 和 reduce 任务,TaskTracker 根据主机核的数量和内存的大小有固定数量的 map 槽和 reduce 槽。这里需要强调的是:map 任务不是随随便便地分配给某个TaskTracker 的,这里有个概念叫:数据本地化(Data-Local)。意思是:将 map 任务分配给含有该 map 处理的数据块的 TaskTracker 上,同时将程序 JAR 包复制到该 TaskTracker 上来运行,这叫“运算移动,数据不移动”。

7.TaskTracker 每隔一段时间会给 JobTracker 发送一个心跳,告诉 JobTracker 它依然在运行,同时心跳中还携带着很多的信息,比如当前 map 任务完成的进度等信息。当JobTracker 收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当 JobClient 查询状态时,它将得知任务已完成,便显示一条消息给用户。

8.运行的 TaskTracker 从 HDFS 中获取运行所需要的资源,这些资源包括 MapReduce 程序打包的 JAR 文件、配置文件和客户端计算所得的输入划分等信息。

9.TaskTracker 获取资源后启动新的 JVM 虚拟机。

10.运行每一个任务。

编程规范
(1)用户编写的程序分成三个部分: Mapper, Reducer, Driver (提交运行mr程序的客户端)
(2) Mapper的输入数据是KV对的形式(KV 的类型可自定义)
(3) Mapper的输出数据是KV对的形式(KV 的类型可自定义)
(4) Mapper 中的业务逻辑写在map()方法中
(5) map()方法(maptask 进程)对每-一个<K, V>调用一次
(6)Reducer的输入数据类型对应Mapper的输出效据类型,也是KV
(7) Reducer 的业务逻辑写在reduce()方法中
(8) Reducetask进程对每- -组相同k的<k, v>组调用一次 reduce()方法
(9)用户自定义的Mapper和Reducer都要继承各自的父类
(10)整个程序需要一个Drvier来进行提交,提交的是一一个描述了各种必要信息的job对象

MapReduce实验:

实验教程来自https://www.shiyanlou.com/courses/237
下载气象数据集部分数据,写一个 Map-Reduce 作业,求每年的最低温度。
实验所需气象数据下载地址:http://labfile.oss.aliyuncs.com/courses/237/temperature.zip
下载后将其解压到hadoop/temperature如下(按照如下格式,需要自己操作一下):
在这里插入图片描述
使用如下命令启动Hadoop(在hadoop主目录下):

cd etc/hadoop/
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
jps 	# 查看启动的进程,确保 NameNode 和 DataNode、jobServer都有启动

编写代码

进入/hadoop/myclass 目录,在该目录中建立 MinTemperature.java、MinTemperatureMapper.java 和 MinTemperatureReducer.java 代码文件,执行命令如下:

cd /app/hadoop-1.1.2/myclass
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值