设为首页 收藏本站
查看: 1633|回复: 0

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

[复制链接]

尚未签到

发表于 2018-11-1 08:43:08 | 显示全部楼层 |阅读模式
  在硬盘存储容量快速增加的同时,访问速度,即数据从硬盘读取的速度未能快速提高.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函数中过滤掉丢失、不可靠或错误的气象数据。
  以下面的几行示例作为输入数据(一些未使用的列已经去除,为了符合页面宽度,用省略号表示):
DSC0000.jpg

  关键值是文件中的行偏移,而这往往是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所示,
DSC0001.jpg

  图1  MapReduce逻辑数据流
DSC0002.jpg

  图2 HDFS的构成
  NameNode上的文件名称空间信息存储在FsImage文件中,NameNode上还有一个事务日志文件EditLog,这两个文件要有备份,以防文件损坏或者NameNode宕机导致系统不可恢复,NameNode的作用主要有以下3个:一是文件映射,把一个文件映射到一批数据block,把文件数据映射到DataNode上;二是集群的配置管理,数据块的管理和复制;三是日志处理,
  2职工工资统计的实现
  根据前面的Hadoop架构及其MapReduce实现机制和HDFS低层存储,我们将一个公司所有员工的工资按照员工姓名、月工资存放于不同的文本文件中,并通过编写统计工资的map和reduce函数,将计算输出的员工姓名、员工年工资存放在结果文件中,如图3所示。
DSC0003.jpg

  图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,
DSC0004.jpg

  表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.
DSC0005.jpg

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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629170-1-1.html 上篇帖子: [Hadoop In Action]学习笔记-Hadoop中的Streaming 下篇帖子: FreeBSD下安装配置Hadoop集群(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表