1 环境概要
要学一门新的东西,对于不通的人可能会有不通的出发点。就学习方法而言,也是多样的。我前面写的文章主要是搭建环境,并且客观的说我也不知道Hadoop能干什么。但是我认为系统环境的搭建就如同打仗的后勤一样。所谓兵马未动,粮草先行吧。接下来我们来看看Hadoop的具体理论吧。看如下图是Hadoop的组成部分。分别是HDFS以及Map Reduce。HDFS(Hadoop Distributed FileSystem) 分布式文件系统。 Map Reduce则是任务处理的框架。
关于Hadoop能干什么,或者接下来的学习,可以使用一个项目来完成。
当我们安装Hadoop之后,我么会使用jps命令来观察运行的Java进程:
[root@gosaint ~]# jps
5152 SecondaryNameNode
4995 DataNode
18147 Jps
4875 NameNode
15916 ResourceManager
3950 WrapperSimpleApp
[root@gosaint ~]#
关于WrapperSimpleApp是一个将Java程序转化为一个服务的应用,暂且不理会。因此上述的Hadoop的架构发生了变化。因为我上面给出的架构是基于老版本的Hadoop而言的。
接下来我要介绍上述的参数:
HDFS
NameNode:是Master节点,有点类似Linux里的根目录。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;
SecondaryNameNode:保存着NameNode的部分信息(不是全部信息NameNode宕掉之后恢复数据用),是NameNode的冷备份;合并fsimage和edits然后再发给namenode。(防止edits过大的一种解决方案)
DataNode:负责存储client发来的数据块block;执行数据块的读写操作。是NameNode的小弟。
热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。
冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。
fsimage:元数据镜像文件(文件系统的目录树。)
edits:元数据的操作日志(针对文件系统做的修改操作记录)
namenode**内存中存储的是=fsimage+edits。
Map Reduce
ResourceManager 是基于应用程序对资源的需求进行调度的 ; 每一个应用程序需要不同类型的资源因此就需要不同的容器。
ResourceManager 是一个中心的服务,它做的事情是调度、启动每一个 Job 所属的 ApplicationMaster、另外监控 ApplicationMaster 的存在情况。
NodeManager 是每一台机器框架的代理,是执行应用程序的容器,监控应用程序的资源使用情况 (CPU,内存,硬盘,网络 ) 并且向调度器(ResourceManager )汇报。
ApplicationMaster 的职责有:向调度器索要适当的资源容器,运行任务,跟踪应用程序的状态和监控它们的进程,处理任务的失败原因。
2 Hadoop能干什么
在《Hadoop权威指南》中说了一个例子:在之前如果要下载1024M的东西,假设网速是2M/s.那么大概需要500s左右。但是随着数据量的增大,你如果要下载1T的资源,假设此时网速为10M/s。那么你需要多个时间呢。答案是很可怕的。也就是说现在随着数据量的增大,你读取数据的事件仍然没有可观的增长。仅仅读取数据就这么消耗时间,那么对于写入数据就更加的糟糕啦。但是试想,我们存在100个硬盘呢。每一个硬盘上面保存1%的数据,那么读取是不是很快,到最后合并读取结果不就Ok了嘛。但是问题来了:
问题1:硬件故障
假设100个硬盘,其中一个坏了怎么办呢?最常见的做法就是系统保存数据的副本,一旦这个坏了,将数据放在其它硬盘上。HDFS就可以干这个事情,它是分布式文件处理系统,只不过它的实现方式稍微有点差别。
问题2:并行处理数据,逻辑如何一致
我们并行读取数据,最终我们希望我们的数据是一个可靠的,并且符合原始数据模型的数据。Ma Reduce就是实现了并行计算。这个和Java中的Join/Fork框架很相似。或者是二者的思想基本一致。分而治之!
简而言之,Hadoop为我们提供了一个可靠的而且易于扩展的存储和分析平台。
3 MapReduce
Mapreduce是一中用于数据处理的编程模型,思想就是分而治之。map就是分,reduce就是合。
运行流程分析:
1 客户端提交作业到ResourceManage
2 ResourceManage找到一个NodeManage来启动ApplicationMaster.
3 ApplicationMaster向ResourceManage申请资源,并且启动其余的NodeManage
4 NodeManage启动map或者reduce任务来处理数据
5 最终得到分片信息
整个MapReduce的过程大致分为 Map–>Shuffle(排序)–>Combine(组合)–>Reduce
4 单词计数案例分析
1)将文件拆分成splits(片),并将每个split按行分割形成<key,value>对,如图所示。这一步由MapReduce框架自动完成,其中偏移量即key值
将分割好的<key,value>对交给用户定义的map方法进行处理,生成新的<key,value>对,如下图所示。
得到map方法输出的<key,value>对后,Mapper会将它们按照key值进行Shuffle(排序),并执行Combine过程,将key至相同value值累加,得到Mapper的最终输出结果。如下图所示。
Reducer先对从Mapper接收的数据进行排序,再交由用户自定义的reduce方法进行处理,得到新的<key,value>对,并作为WordCount的输出结果,如下图所示。
这是最终的排序结果 。我们通过流程分析和Java代码的输出一致。