论文部分内容阅读
摘要:由于软件需求和版本的升级,软件代码的重构与演化成为软件维护的主要手段和关键技术需求。Hadoop分布式软件随着分布式大数据处理技术的不断发展,版本不断地升级,随之而来的是基于Hadoop平台的应用软件也需要升级。这种升级过程为软件演化技术的提出了新的挑战。该文针对基于Hadoop平台应用软件的演化方法和技术进行讨论,结合具体实例探讨演化方法实现的技术过程,验证演化方法和技术的有效性。该文主要讨论Hadoop平台应用软件演化中的功能移植和计算速度提升问题。在功能移植方面,研究了Hadoop1.0到升级到版本2.0的基础类库的映射关系,包括MapRe-duce的演化过程,并分析了Hadoop版本演化代码复杂度;在速度提升方面,针对MapReduce任务进行演化,并给出了Ma-preduce磁盘读写操作到内存操作改进算法,以及MapReduce作业如何转换成Spark作业的算法。最后,对企业ETL处理中InnerJoin应用进行案例研究,详细分析MapReduce和Spark编程模式下,InnerJoin的应用差异。
关键词:大数据;Hadoop;Spark;MapReduce;软件演化
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2019)31-0059-02
1研究背景
IDC最近的一份报告声称数字世界每两年增加一倍,并在2013年至2020年间增加10倍;从4.4万亿千兆字节到41万亿千兆字节。近年来,由于社交游戏和地理空间应用程序的普及,数据生成和分析取得了巨大的飞跃。在任何给定的时间,大约有一千万人登录他们最喜欢的社交游戏,如来自King的Candv Crush Saga或来自Supercell的Clash of Clans。Poke-non GO最近的热潮更是说明了数据增长的必然性以及在最高存储要求下更快处理的必要性。换句话说,在不久的将来,大数据处理过程中,各种组件的技术必定会进步。
在过去十年中,Apache Hadoop平台已经成为处理大数据分析的最著名的开源框架之一,Hadoop分布式文件系统(HDFS)是Hadoop的底层存储引擎。当前的Hadoop生态系统包含传统的批处理框架,如Mapmduce,以及基于内存的DAG执行框架,如Spark,用于迭代和交互式处理。HDFS以其可扩展性和可靠性而闻名,为这些处理框架提供存储功能。随着信息时代的到来,Hadoop和HDFS等大数据系统正在高性能计算(HPC)集群中广泛部署。
Hadoop版本从之前的1.x版本更新到2.x、3.x,其中对HDFS、MapReduce、任务管理、资源分配、拓展性都进行了升级演化,更好的支持和满足现在大数据处理中储存的速度大小、计算的速度和耗费资源、资源管理、其它组件的支持性和扩展性的需求。
2Hadoop版本演化复杂度分析
Hadoop作为一个开源的挂架,其源码可以从gRhub克隆到本地进行分析。目前Hadoop一共有191名代码开发人员,发布了315个小版本、273个分支、22000次代码提交,不断提升Ha-doop的计算性能和扩展性支持。
使用eclipse的JDT API来获取Hadoop中各个类和包的关系。结合UML建模原则,类之间的关系主要包括继承、关联、依赖和实现。根据软件架构质量度量指标对Hadoop1.0.3、Ha-doop2.2.0、Hadoop2.4.0、Hadoop2.6.0、Hadoop2.7.3等版本源码进行分析。先分别求出hadoop-client-common和core包中各个类代码行数的平均值,这个指标是一个维度指标,对于开发者而言,代码行数越多,类越难读懂,从而增加软件架构的复杂度。从下图分析得出,Hadoop随着版本的演化,其复杂度是在降低的。
3MapReduce任务演化
在Hadoop 2.0中引入了Yarn框架,Yarn框架中将Job-Tracker资源分配和作业控制分开,分为Resource Manager(RM)以及Application Master(AM),而Yarn框架作为一个通用的资源调度和管理模块,同时支持多种其它的编程模型,比如最出名的sDark。
Yarn的主要三个组件如下:
Resource Manager:ResourceManager包含两个主要的组件:定时调用器(Scheduler)以及应用管理器(ApplieationManager)。
Application Master:每个应用程序的ApplicationMaster负责从Scheduler申请资源,以及跟踪这些资源的使用情况以及任务进度的监控。
Node Manager:NodeManager是ResourceManager在每台机器的上代理,负责容器的管理,并监控他们的资源使用情况(cpu,内存,磁盘及网络等),以及向ResourceManager/Scheduler提供这些资源使用报告。
在MapReduce编程模型中,Mapper、Reducer中封装了应用程序的数据处理逻辑。MapReduce要求所有储存在HDFS上的数据解释成键值对,经过map、reduce函数处理,形成新的键值对。Hadoop1.0中,Mapper和Reducer类体系非常相似,其中包括四个方面的演化:Mapper由接口变成抽象类,且不再继承JobConffigurable和Closeable兩个接口,而是直接在类中添加set-up和cleanup两个方法进行初始化和清理工作;将参数封装到Context对象中,这使得接口具有良好的扩展性;去掉MapRun-nable接口,在Mapper中添加run方法,以便用户定制mapf)方法的调用;Reducer遍历value的迭代器类型编程java.lang.Iter-able,使得用户可以参用foreach形式遍历所有value。
4ETL中InnerJoin任务编程模型演化
在企业ETL处理中,对两个数据集根据key进行inner join,是数据处理中常见的需求。MapReduce编程和Spark编程方面有很大的区别,MapReduce采用Java语言编程,Spark主要使用Scala语言进行编程,如图所示,MapReduce中的Mapper类转变成Spark编程中map、flatMap、filter等算子,Reducer类转变成re-duceByKey、groupBykey等算子,FileOutputFormat.setOutputPath(job,outDir)转变成value3.saveAs TextFile(outPath)。
Spark对两个文件进行inner join操作的算法步骤:
在实际计算时,spark会基于streamIter来遍历,每次取出streamlter中的一条记录RowA,根据Join条件计算KeyA,然后根据该KeyA去buildIter中查找所有满足Join条件fKeyB=KeyA)的记录RowBs,并将RowBs中每条记录分别与RowAjoin得到join后的记录,最后根据过滤条件得到最终join的记录。
根据不同大小的数据集,每个数据集分别测试运行5次,MapReduce和Spark平均计算时间统计结果如下表:
结果表明,在InnerJoin任务模型上,MapReduce任务演化为Spark任务之后,在不改变运行结束的前提下,离线计算速度提升10倍,大大的节省了集群资源开销。
5总结
Hadoop2.x版本对MapReduce向前兼容,hadoop2.x的client包中既有基于1.x版本编写程序所需要的包和类,也有新的Ma-pReduce包和类。基于1.x版本MapReduce任务可以直接在YARN上运行;通过实验表明Spark计算速度比MapReduce要快10倍以上。从编程角度而言,Scala语言比Java语言编写的时候要简明许多。
关键词:大数据;Hadoop;Spark;MapReduce;软件演化
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2019)31-0059-02
1研究背景
IDC最近的一份报告声称数字世界每两年增加一倍,并在2013年至2020年间增加10倍;从4.4万亿千兆字节到41万亿千兆字节。近年来,由于社交游戏和地理空间应用程序的普及,数据生成和分析取得了巨大的飞跃。在任何给定的时间,大约有一千万人登录他们最喜欢的社交游戏,如来自King的Candv Crush Saga或来自Supercell的Clash of Clans。Poke-non GO最近的热潮更是说明了数据增长的必然性以及在最高存储要求下更快处理的必要性。换句话说,在不久的将来,大数据处理过程中,各种组件的技术必定会进步。
在过去十年中,Apache Hadoop平台已经成为处理大数据分析的最著名的开源框架之一,Hadoop分布式文件系统(HDFS)是Hadoop的底层存储引擎。当前的Hadoop生态系统包含传统的批处理框架,如Mapmduce,以及基于内存的DAG执行框架,如Spark,用于迭代和交互式处理。HDFS以其可扩展性和可靠性而闻名,为这些处理框架提供存储功能。随着信息时代的到来,Hadoop和HDFS等大数据系统正在高性能计算(HPC)集群中广泛部署。
Hadoop版本从之前的1.x版本更新到2.x、3.x,其中对HDFS、MapReduce、任务管理、资源分配、拓展性都进行了升级演化,更好的支持和满足现在大数据处理中储存的速度大小、计算的速度和耗费资源、资源管理、其它组件的支持性和扩展性的需求。
2Hadoop版本演化复杂度分析
Hadoop作为一个开源的挂架,其源码可以从gRhub克隆到本地进行分析。目前Hadoop一共有191名代码开发人员,发布了315个小版本、273个分支、22000次代码提交,不断提升Ha-doop的计算性能和扩展性支持。
使用eclipse的JDT API来获取Hadoop中各个类和包的关系。结合UML建模原则,类之间的关系主要包括继承、关联、依赖和实现。根据软件架构质量度量指标对Hadoop1.0.3、Ha-doop2.2.0、Hadoop2.4.0、Hadoop2.6.0、Hadoop2.7.3等版本源码进行分析。先分别求出hadoop-client-common和core包中各个类代码行数的平均值,这个指标是一个维度指标,对于开发者而言,代码行数越多,类越难读懂,从而增加软件架构的复杂度。从下图分析得出,Hadoop随着版本的演化,其复杂度是在降低的。
3MapReduce任务演化
在Hadoop 2.0中引入了Yarn框架,Yarn框架中将Job-Tracker资源分配和作业控制分开,分为Resource Manager(RM)以及Application Master(AM),而Yarn框架作为一个通用的资源调度和管理模块,同时支持多种其它的编程模型,比如最出名的sDark。
Yarn的主要三个组件如下:
Resource Manager:ResourceManager包含两个主要的组件:定时调用器(Scheduler)以及应用管理器(ApplieationManager)。
Application Master:每个应用程序的ApplicationMaster负责从Scheduler申请资源,以及跟踪这些资源的使用情况以及任务进度的监控。
Node Manager:NodeManager是ResourceManager在每台机器的上代理,负责容器的管理,并监控他们的资源使用情况(cpu,内存,磁盘及网络等),以及向ResourceManager/Scheduler提供这些资源使用报告。
在MapReduce编程模型中,Mapper、Reducer中封装了应用程序的数据处理逻辑。MapReduce要求所有储存在HDFS上的数据解释成键值对,经过map、reduce函数处理,形成新的键值对。Hadoop1.0中,Mapper和Reducer类体系非常相似,其中包括四个方面的演化:Mapper由接口变成抽象类,且不再继承JobConffigurable和Closeable兩个接口,而是直接在类中添加set-up和cleanup两个方法进行初始化和清理工作;将参数封装到Context对象中,这使得接口具有良好的扩展性;去掉MapRun-nable接口,在Mapper中添加run方法,以便用户定制mapf)方法的调用;Reducer遍历value的迭代器类型编程java.lang.Iter-able,使得用户可以参用foreach形式遍历所有value。
4ETL中InnerJoin任务编程模型演化
在企业ETL处理中,对两个数据集根据key进行inner join,是数据处理中常见的需求。MapReduce编程和Spark编程方面有很大的区别,MapReduce采用Java语言编程,Spark主要使用Scala语言进行编程,如图所示,MapReduce中的Mapper类转变成Spark编程中map、flatMap、filter等算子,Reducer类转变成re-duceByKey、groupBykey等算子,FileOutputFormat.setOutputPath(job,outDir)转变成value3.saveAs TextFile(outPath)。
Spark对两个文件进行inner join操作的算法步骤:
在实际计算时,spark会基于streamIter来遍历,每次取出streamlter中的一条记录RowA,根据Join条件计算KeyA,然后根据该KeyA去buildIter中查找所有满足Join条件fKeyB=KeyA)的记录RowBs,并将RowBs中每条记录分别与RowAjoin得到join后的记录,最后根据过滤条件得到最终join的记录。
根据不同大小的数据集,每个数据集分别测试运行5次,MapReduce和Spark平均计算时间统计结果如下表:
结果表明,在InnerJoin任务模型上,MapReduce任务演化为Spark任务之后,在不改变运行结束的前提下,离线计算速度提升10倍,大大的节省了集群资源开销。
5总结
Hadoop2.x版本对MapReduce向前兼容,hadoop2.x的client包中既有基于1.x版本编写程序所需要的包和类,也有新的Ma-pReduce包和类。基于1.x版本MapReduce任务可以直接在YARN上运行;通过实验表明Spark计算速度比MapReduce要快10倍以上。从编程角度而言,Scala语言比Java语言编写的时候要简明许多。