基于Hadoop架构的分布式计算和存储技术及其应用

在硬盘存储容量快速增加的同时,访问速度,即数据从硬盘读取的速度未能快速提高.1990年,一个普通的硬盘驱动器可以存储1 370 MB的数据并拥有4.4 MB/s的传输速度,只需5 min就可以读取整个磁盘的数据。20年后的今天,海量数据的出现使得使用1TB存储容量的磁盘驱动器已很正常,由于数据传输速度在100 MB/s左右,需要花2.5 h以上才能读取整个驱动器的数据.如果可以一次从多个磁盘上读取数据,那么可以大大提高数据访问效率,若拥有100个磁盘,每个磁盘存储1%的数据,让它们并行运行,那么不到2 min就可以读完存储的所有数据。Hadoop架构的引入使建立大型商业集群、解决超大数据量处理的瓶颈难题成为可能,改善了传统海量数据访问带来的访问效率低下的状况,本文基于Hadoop架构设计了职工工资统计实例,并对该实例在单节点模式、伪分布模式和完全分布模式应用中的运行效率进行了分析和比较。

1  Hadoop的工作原理

    Hadoop是Apache软件基金会所研发的分布式基础架构,于2005年推出,它使用分布式文件系统(Hadoop Distributed File System,HDFS)作为低层存储支持,HDFS有着高容错性的特点,并将其设计部署在低廉的硬件设备上,以提供高传输率来访问应用程序的数据,适合那些有着超大数据集的应用程序。目前国内外著名的公司如Yahoo,阿里巴巴,百度,Facebook等都建立了基于Hadoop的应用,下面分别从Hadoop的MapRe-dace实现机制和HDFS低层存储来说明如何构建基于Hadoop的分布式应用。

    1.1 MapReduce实现机制

    Hadoop是MapReduce的实现,而MapRe-duce的工作过程一般分为两个阶段:map阶段和reduce阶段,每个阶段都有一批关键值对作为输入,而另一批关键值对作为输出,关键字的类型可以由程序员选择设定,程序员可以根据实际应用具体设计两个函数的实现体,在map阶段输入的是原始数据,可以选择文本文件作为输入。
    1.1.1气象数据集

    分布在全球各地的气象传感器每隔1h便收集当地的气象数据,从而累积了大量的日志数据,这些数据是可以用MapReduce来分析的最佳数据。

    1.1.2数据存放格式

    假设数据是以面向行的ASCII格式存储,每一行是一条记录,该格式支持许多气象元素,其中许多数据的长度可选或可变,为简化起见,我们将选择始终都有固定宽度的数据(如温度)进行讨论,数据文件按照日期和气象站进行组织,从1901~2010年,每一年都有一个目录,每一个目录都包含一个打包文件,文件中的每一个气象站都带有当年的数据,实际生活中有上万个气象台,所以整个数据集由大量较小的文件组成,通常情况下,我们更容易、更有效地处理数量较少的大型文件,因此,数据会被预先处理,并将每年记录的读数连接到一个单独的文件中。

    1.1.3  MapReduce过程

    使用map函数找出年份和气温,在这种情况下,map函数处理过程仅是数据的一个准备阶段,map函数输出的是能让Reduce函数在其中工作的数据,map函数也可以很好地去除损坏的记录,即在map函数中过滤掉丢失、不可靠或错误的气象数据。

    以下面的几行示例作为输入数据(一些未使用的列已经去除,为了符合页面宽度,用省略号表示):

 

    关键值是文件中的行偏移,而这往往是map函数中所忽视的,map函数的功能仅仅提取年份和空气温度(用黑体表示),并作为它的输出发送出去。温度值已被转换成整数:

    1950, 0; 1950, 22; 1950,-11;1949,111;1949 ,78.

    map函数的输出先由MapReduce中的shuffle来处理,然后再被发送到reduce函数,这种数据是一个一个键值对,因此,reduce函数有以下输入,每年的年份后面都有一系列温度的数据,所有的reduce函数现在必须重复这个列表并从中找出最大的读数:

    1949,(111,78);1950,(0,22,-11).

    最后输出的全球气温中,每年的最高温度为:

    1949,111;1950,22.

    整个数据流向如图1所示,在图1的底部是Unix的管道,以模拟整个MapReduce流程。
1.2  HDFS低层存储

    HDFS分为3个部分:客户端(client);名称节点(NameNode);数据节点(DataNode),Client是基于HDFS的应用程序;NameNode是分布式文件系统的管理者,主要负责文件系统的命名空间,集群的配置信息和数据块的复制信息等,并将文件系统的元数据存储在内存中;DataNode是文件实际存储的位置,它将块(Block)的元数据信息,存储在本地文件系统中,周期性地将所有的Block信息发给NameNode。

    HDFS的构成如图2所示,

  

    图1  MapReduce逻辑数据流

     HDFS的构成

    图2 HDFS的构成

    NameNode上的文件名称空间信息存储在FsImage文件中,NameNode上还有一个事务日志文件EditLog,这两个文件要有备份,以防文件损坏或者NameNode宕机导致系统不可恢复,NameNode的作用主要有以下3个:一是文件映射,把一个文件映射到一批数据block,把文件数据映射到DataNode上;二是集群的配置管理,数据块的管理和复制;三是日志处理,

2职工工资统计的实现

    根据前面的Hadoop架构及其MapReduce实现机制和HDFS低层存储,我们将一个公司所有员工的工资按照员工姓名、月工资存放于不同的文本文件中,并通过编写统计工资的map和reduce函数,将计算输出的员工姓名、员工年工资存放在结果文件中,如图3所示。

  

   工资统计的MapReduce过程

    图3 工资统计的MapReduce过程
  2.1程序代码及分析

    由TokenizerMapper类和IntSumReducer类分析工资统计功能的MapReduce实现,

    2.1.1 TokenizerMapper类工资统计功能的实现

    定义TokenizerMapper类,继承Hadoop提供的Mapper类来实现个性化的map函数,map函数中,由于输入的文本内容格式固定,故将文本文件中一行数据(value)提取出name和monthSalary后,写入context,其中用到的IntWritable类是Hadoop为了统一格式所自带的封装类,与Integer无异,此类map方法将分析后的结果写入context,作为IntSumReducer类reduce方法的输入

     TokenizerMapper类中map函数的基本算法思想为:

    (1)读取文本文件中的一行数据String-Tokenizer itr=new StringTokenizer ( value. toString());

    (2)获取姓名String name = itr, nextToken();

    (3)获取月薪IntWritable monthSalary = new

    IntWritable(Integer. parseInt(itr. nextToken()));

    (4)计算结果输出将结果写入context,作为reduce方法的输入context. write ( word ,monthSalary ),

    2. 1. 2  IntSumReducer类工资统计功能的实现

    定义IntSumReducer类,继承Hadoop提供的Reducer类来实现个性化的reduce函数,reduce函数中,key为map提取出的姓名作为输出参数,values为maP之后通过combiner归并该名员工工资的集合,对每一名员工,假设其姓名是唯一的,那么可以作为主键区别,计算其对应的月工资的总和(年工资),context输出年工资,

    IntSumReduce:类中reduce函数的基本算法思想:

    (1)计算年工资总和根据key和values计算每个员工的年工资总和

    for(IntWritable val;values)

      {

    sum + =val. get();

      };

    (2)计算结果输出将结果写入context,并显示输出context. write ( key , result ).

    在完成了用于map的TokenizerMapper类和用于redace的IntSumReducer类之后,通过Hadoop所提供的应用类去设置运行时的一些参数,最主要的是Job类,其中有许多设置,包括Jar类、Mapper类、Cornbiner类、Reducer类,以及输入输出路径等,通过waitForCompletion方法执行任务,直至完成,

    2. 2运行结果

    运行完成后输出的文本文件的内容格式为员工姓名、年工资,符合预期的运行结果,程序的TokenizerMapper类实现了Mapper接口的map方法,将输入的文本文件逐行读取,并以“空格”来划分,将员工姓名作为key,其月工资作为value,map的结果集再由combiner归并后输出到reducer,对相同key的结果,求其value的和,并将其输出到对应目录下。

3职工年工资统计效率测试

    分布式计算法适合于大数据量的计算,大集群的效率无可置疑,但由于实验条件的限制,只能测试双机集群的效率。

    3.1主要配置参数

    两台主机的主要软硬件配置见表1,

  

    表1主要配置参数
3. 2测试方案

    单节点模式:不涉及分布式文件系统,在Eclipse中运行(需配置Hadoop插件和运行参数)。

    伪分布模式:运行于A机.

    分布式模式(A-B);A作为master, B作为slave;下传速度平均为2 MB左右.

    分布式模式(B-A);B作为master, A作为slave;下传速度平均为3. 6 MB左右。

    3. 3测试结果

    由1 MB数据量至1GB数据量进行测试效率的比较,运行时间结果记录见表2.

  

    表2不同测试模式下不同文件的运行时间

4结语

    基于Hadoop架构计算模式的出现,突破了传统的数据库系统对海量数据处理的速度限制,通过对大量数据的并发访问,有效缩短了数据的查询计算时间,使用户的查询响应更快速,本文通过比较不同大小文件中的工资数据在4种不同分布下的运行效率,得到分布式A一B的效率最高,单机的效率最低,Hadoop架构模式可以充分利用不同机器同时参与并发运算,提高了运算效率,目前Hadoop架构已广泛应用于信息检索领域,如Google, Baidu等,我们将继续对一些符合分布式运算的算法在Hadoop架构下的实现方案进行集中研究,并根据其特点应用于特定的场景。   
 

你可能感兴趣的:(数据,工作原理,磁盘,基金会,职工工资)