加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

从HDFS和MapReduce两方面了解Hadoop

发布时间:2019-03-21 23:52:20 所属栏目:教程 来源:佚名
导读:简介 Hadoop 是一个能够对大量数据进行分布式处理的软件框架,框架最核心的设计就是:HDFS 和 MapReduce。HDFS 为海量的数据提供了存储,而 MapReduce 则为海量的数据提供了计算。这篇文章就主要从 HDFS 和 MapReuce 两个大的方面展开对 Hadoop 讲解,当然

打包作业,我们需要将我们的 MapReduce 程序打成 jar 包。

  • 清单 17. 打包作业
  1. mvn package -Dmaven.test.skip=true 

将 jar 包复制到 hadoop 机器上。

在 HDFS 上准备好要统计的文件,我准备的文件在 HDFS 上的/mr/input/目录下,内容为"hello hadoop hdfs.I am coming."。

执行 jar。

  • 清单 18. 执行作业
  1. hadoop jar mr-test-1.0-SNAPSHOT.jar cn.itweknow.mr.CharCountDriver /mr/input/ /mr/output/out.txt 

查看结果。

我们先看看输出目录,结果如下,最终输出的结果就存放在/mr/output/part-r-00000 文件中。

图 1. MapReduce 作业输出目录

从HDFS和MapReduce两方面了解Hadoop

然后我们再看看输出文件中的具体内容,如下所示:

图 2. MapReduce 作业输出结果

MapReduce 运行原理

我们可以将一个 MapReduce 作业的运行过程简单的拆分成 6 个过程,分别是作业的提交、作业初始化、任务分配、任务执行、进度和状态的更新、作业完成。下面我就一起来具体了解下这么几个步骤。

作业的提交

当我们调用 job.submit()或者 job.waitForCompletion()方法(其内部也会调用 submit()方法)的时候,会创建一个 JobSubmitter 对象,在 JobSubmitter 内部所实现的作业提交过程如下:

  1. 向资源管理器请求新的应用 ID 作为 MapReduce 作业的作业 ID。
  2. 检查作业的输出目录,如果没有指定输出目录或者输出目录已经存在就会抛出错误,这也就是为啥我们在执行 MapReduce 作业时为啥需要保证指定的输出目录不存在。
  3. 将作业运行所需要的资源文件(作业 JAR 包,配置文件,输入分片)复制到一起(一个以作业 ID 命名的目录下)。
  4. 调用 submitApplication()方法提交作业。​

作业的初始化

  1. 首先资源管理器会将作业请求传递给 YARN 调度器。
  2. 调度器会为作业分配一个容器。
  3. 资源管理器在节点管理器的管理下在容器中启动 application master。
  4. application master 的主类 MRAppMaster 会创建多个簿记对象来跟踪作业的进度。
  5. 接收输入分片。
  6. application master 为每个分片创建 map 任务以及确定 reduce 任务,并且分配任务 ID。

任务的分配

application master 会为创建的任务向资源管理器请求容器,先是为 map 任务请求资源,后为 reduce 任务请求资源。为 map 任务分配资源的时候需要考虑到数据本地化的局限,会尽量保证运行的 map 任务所需要的数据块存储在当前机器或者当前机架中,这样会极大的节省带宽资源。而 reduce 任务则不存在这个限制。

任务的执行

  1. 资源管理器为任务分配好容器后,application master 就通过与节点管理器通信启动容器。
  2. 在运行任务之前,会将任务所需要的资源本地化。
  3. 运行任务。

进度和状态的更新

任务在运行的过程中,会对其精度保持追踪,对与 map 任务,其任务进度就是已经处理的输入所占总输入的比例。对与 reduce 任务来讲就比较复杂了,因为这个部分包含资源复制阶段、排序阶段和 reduce 阶段三个阶段,每个阶段都占整个完成比例的 1/3,也就是说当我们完成 reduce 的一半的时候进度应该为 5/6。对与状态的更新,客户端会每秒轮询一次 application master 以接收最新的任务状态。

作业的完成

当 application master 收到作业最后一个任务已经完成的通知后,便把作业的状态设置为"成功"。

为了方便大家理解,我这里将整个过程总结为一张图,贴在这里仅供大家参考。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读