山东科技大学数学与系统工程学院 秦怀强
Hadoop的深入探究
山东科技大学数学与系统工程学院 秦怀强
本文对Hadoop的架构设计进行了深入的研究,分别分析了它的两个核心功能组件HDFS和MapReduce的系统架构、实现原理和特点。
大数据;Hadoop;伪分布式;HDFS
Hadoop的核心技术:
对于Hadoop这一大数据处理平台,需要了解的是它具有的两个核心功能:分布式存储和分布式计算。Hadoop分布式存储是由其文件系统HDFS实现的,而其分布式计算则是由它自带的计算框架MapReduce实现的[1]。
Hadoop在部署安装时一般会由一台服务器作为master,一台服务器作为SecondaryNameNode,多台服务器作为slave。
(1)Hadoop的核心之HDFS
Hadoop架构中的master和slave在HDFS中分别扮演NameNode和DataNode的角色。一个超大文件在存储到HDFS上时会由NameNode对其进行分片(这里仅针对文件的内容数据进行分片),每一个分片是一个block,而每一个block的大小可以由用户自己设定(一般设定为64MB)。一个文件的所有block会由NameNode决定将其存储到哪个DataNode上。一个相同的block会存储到不同的DataNode上(一般是3个),这种副本机制是为了保证数据的安全存储,使其不易丢失[2]。Hadoop的HDFS由NameNode、Secondary NameNode和DataNode三部分组成,这三个部分我们都可以简单的将其看做一台普通的计算机。其中,在NameNode上主要存储的数据是:文件的元数据、文件的分块信息、文件的每个分块与DataNode的映射信息。文件的元数据为:文件名、文件大小、文件存储位置等除了文件内容数据之外的所有文件数据。文件的分块信息指的是文件被分成了多少块。并且,这两部分数据是存储在NameNode的磁盘上,文件名为fsimage,其会在HDFS启动时被加载到NameNode的内存中。而文件的每个分块与DataNode的映射信息不会存储在NameNode的磁盘上,而是在HDFS启动时由DataNode的心跳机制上报给NameNode的内存。在DataNode上存储的数据是文件的内容数据,即每一个block。而且,文件的内容数据都是存储在DataNode的磁盘上。在启动HDFS时,DataNode会向NameNode上报它自己存储的所有的映射信息。对于NameNode来说,用户的每一步操作并不会立马修改其上的fsimage文件,而是生成一个edits文件用来存储用户的操作信息。edits文件的大小会有相应的上限设置制(具体的可以自己设定,但一般设定为64MB),在edits文件大小达到上限或用户操作时间超过了3600秒时,NameNode会将edits文件和fsimage文件同时传给SecondaryNameNode,由SecondaryNameNode根据edits来修改fsimage(如果在Hadoop架构中没有设计SecondaryNameNode,则会由NameNode执行这种合并机制。在架构中设计SecondaryNameNode的原因是为了减少NameNode的负载,使其能更加高效的处理用户的请求)。最后,再由SecondaryNameNode将修改后的fsimage回传给NameNode。而且,在HDFS启动期间,这些操作会依据用户的操作和系统状况不断进行。
(2)Hadoop的核心之MapReduce
Hadoop架构中的master和slave在MapReduce中分别扮演ResourceManager和NodeManager的角色。其中ResourceManager会分配用户写好的MapReduce程序,NodeManager则会执行MapReduce程序。
MapReduce计算框架是移动计算而不是移动数据,即将程序移动到其需要的数据所在的那台服务器上,而不是将程序需要的数据调用到程序最初存在的那台服务器上。然后,我们在编写MapReduce程序时,可以将其简单的分为Map子程序、Reduce子程序和主程序。其中,Map子程序的作用是将输入的数据依照某种目的构造成键值对(一种数据存储形式)输出。而Reduce子程序则是根据某种目的来处理Map子程序的输出键值对,最后再以键值对的形式输出结果。主程序则是对框架程序的运行进行一些相关的配置。MapReduce程序中的Map和Reduce子程序会被ResourceManager分发到Hadoop集群中的不同服务器上,MapReduce计算框架大体可以分成5个部分:split、Map、Shuffle、Reduce和output。其中,split、Map和Shuffle的前半部分在Map端(可以简单的理解为一台计算机)执行。而Shuffle的后半部分、Reduce和output在Reduce端执行。在一个Hadoop集群中会存在多个Map端和Reduce端。MapReduce框架的工作流程为:首先,split部分将输入数据(即在Map端上的block)以某种形式进行分片。然后,分片会被递交给Map子程序。Map子程序将分片数据以键值对的形式输出。然后,就到了Shuffle阶段,这一阶段指的是从Map子程序输出到Reduce子程序输入这一过程。这一阶段有两部分构成,一部分在Map端,一部分在Reduce端,而且其操作主要有三个部分:分区、排序和将数据溢出到磁盘。最后,再由Reduce子程序对数据进行处理,并将最后的结果以键值对的形式输出。
Map子程序会在Map端拥有划给它的一部分内存(一般为64MB)来存储它的输出数据。当这部分内存被存满的时候,这些数据会被转存到Map端磁盘上。但在转存的的过程中,partition程序(框架中自带的,一般是执行Hash模运算操作,当然也可以自己定义)会对这部分数据进行分区。即将这些数据标识上相应分区的标签,并相邻存储。分区的结果是不同的分区数据最终会被分配给不同的Reduce子程序执行。并且在执行完分区操做后还会对这部分数据进行排序操作(一般是依照数据ASCII码的大小来排序)。最后,这部分数据会存储到Map端磁盘上。上述操作只是一次Map子程序输出数据存满Map端划分内存的操作。多次这种操作还会导致combiner程序(框架中自带,当然用户也可以自己定义)将Map端磁盘上的数据依据某种规则合并。当Map子程序将一个分片的输入数据处理完后,Map端磁盘上的数据会被依照分区标签传送给相应的Reduce子程序执行(当然若Map程序在处理完一个分片数据的操作后Map端划分内存没满,则上述的操作都只是在Map端划分内存中执行)。Reduce端也会有专门的划分内存(一般为64MB)来存储Map端传过来的数据。若一次传输的数据没存满这部分内存,则这部分数据直接交付给Reduce子程序处理,若在一次传输过程中这部分内存满了,则这部分数据会被转存到Reduce端磁盘上。在转存的过程中会依据某种规则对数据执行合并操作,然后,在Reduce端接收完Map端一次数据传输后,Reduce端磁盘上的数据会被交付给Reduce子程序来处理。以上内容即是MapReduce框架中Shuffle部分的具体操作。
[1]文艾,王磊.高可用性的HDFS-Hadoop分布式文件系统深度实践[M].清华大学出版社,2012:135-180.
[2]陈全,邓倩妮.异构环境下自适应的MapReduce调度[J].计算机工程与科学,2009,31:169-175.