将云计算技术引入到大规模数据处理过程中,提出在集中或分布管理的大量廉价计算机集群上构建动态的、可扩展的、高性价比的、易使用的高性能计算平台,创建一种基于云计算的大规模数据处理的框架模型。论述在这一环境下的大规模数据处理的方法和应用,通过搭建相应的计算平台,验证计算机集群及框架模型的可行性。
This paper introduces a large-scale data processing method based on cloud computing, builds a dynamic, scalable, cost-effective, easy to use and high-performance computing platform on a large of centralized or distributed inexpensive computer cluster, and creates a cloud computing-based framework for large-scale data processing model. It also discusses the methods and applications in this large-scale data processing environment. The computing platform is set up to verify the computing cluster and the feasibility of this model.
随着互联网时代信息与数据的飞速增长,从地理数据分析、海洋信息监控、天文信息计算处理等科学研究,到DNA信息分析、医疗影像处理、海量病例存储分析等医学分析,再到商业贸易、人口普查、交通业务等日常事务[ 1],数据规模都可以轻易地达到GB、TB、PB,如:沃尔玛在全球每天产生的交易记录数达2.67亿笔;美国Square Kilometer Array工作时每秒产生的测量数据为200GB[ 2],而这些学科专业及社会领域似乎都需要针对这些大规模的数据信息进行大量的计算,遥感学科研究组织需要计算机来计算和处理海量的航空影像;交通行业需要计算机来对大规模的铁路运输、航空运输和航海运输的货票信息进行处理和分析;经济学家对某个国家/省份/城市/企业的发展方向做出宏观调控,需要用计算机来分析和处理几万种情况下的各种因素的数据信息。因此,现代社会和科学的发展,越来越离不开计算,对高性能计算能力、存储能力和大规模数据处理能力的要求也越来越高。
传统的分布式计算、并行计算在一定程度上满足了人们对大规模数据处理的技术需求,但是由于其技术应用的局限性、彼此分割的应用格局、及对计算平台的硬件设备和存储能力的高要求(如美国斯坦福大学的Pande生物研究机构,为了模拟蛋白质折叠的过程,花费大量的时间和精力来研究对应的分布式计算的服务器和客户端),客观上要求一种比这些技术更易使用、部署以及扩展性更好的新的框架和技术,用来处理大规模数据信息。
本文将计算机网络和云计算[ 3]技术引入大规模数据处理,提出在集中或分布管理的大量廉价计算机(如PC)集群上构建动态的、可扩展的、高性价比的、易使用的高性能计算平台,创建了一种基于云计算的大规模数据处理的框架模型,论述了在这一环境下的大规模数据处理的方法和应用,并搭建了相应的计算平台,验证了计算机集群及框架模型的可行性。
针对大规模数据信息和计算资源的特征及其数据处理要求,可以将闲置的计算机资源组建成大规模廉价集群计算平台,在原有的云计算研究基础上整合Hadoop,采用MapReduce编程模型[ 4],将大规模数据处理任务分成很多细粒度的子任务,分布式地在多个计算节点上进行处理和计算,从而在云计算环境下获得对大规模数据的处理能力。
大规模廉价计算平台的实现是通过虚拟化技术来实现的,其虚拟化的实体是各种各样的服务资源,包括计算虚拟化、存储虚拟化、网络虚拟化及应用程序虚拟化等。底层的硬件虚拟化构建主要是将虚拟化技术应用于单个节点的计算平台(如PC)上,通过虚拟化技术将闲置的计算平台进行有效的组织和利用,通过服务器虚拟化,可以将闲散的计算资源抽象为一个或多个虚拟服务器实例mi(i=1,2,……n), mi与mj(i≠j)之间完全独立,均可以独立执行数据处理的计算任务[ 4]。
这一体系的构建需要整合大规模数据处理所需的相应计算资源、网络资源和存储资源,构建虚拟资源池,同时通过构建的可扩展的计算节点资源池,使大规模数据处理服务提供者能够对大规模计算资源池中计算节点和虚拟计算流程进行集成管理,并且实现大规模数据子处理任务的部署、系统监控、计算资源的转换、数据的实时迁移等[ 5],而这些相应的管理过程则通过桌面虚拟化程序以Web方式在远程进行一体化管理[ 6],如图1所示:
当计算资源和存储资源虚拟化被创建、发布后,需要通过相应的虚拟化解决方案部署到虚拟计算节点资源池中才可以被管理和使用,因此大规模计算平台的建设过程[ 7]也是云计算环境下大规模数据处理的一个重要环节,而这一过程主要分为以下几个步骤:
(1)参数化配置数据处理所需资源,并依据需求定制。无论是数据处理用户还是计算资源及存储资源提供者,在部署和使用计算节点资源池之前,首先要选择需要部署的计算资源,并设置相应的参数,用户主要通过这一部署过程获得自己需要的计算资源以及存储资源,而提供者则在不同的操作模式中,部署底层的计算资源的相关属性,来为用户提供相应的参数服务。
(2)部署计算资源与存储资源。依据第一步定制的相关设置参数,来确立在大规模数据处理过程中的计算资源、存储资源的部署,以及相应的数据处理和计算流程的部署方案。
(3)保存定制化参数。步聚(1)产生的相关的参数设置信息写入到相应的计算资源、存储资源配置文件中,用来分配计算流程调度来启动相应的计算节点的计算资源和存储资源,或者对计算节点的定制的处理服务进行部署和管理。
(4)选择计算节点,并且配置计算流程。在对计算节点及大规模数据处理过程中所需软硬件资源(如:桌面虚拟化程序与大规模数据处理平台之间网络是否畅通、云存储的磁盘空间是否充足等)进行监测及管理的情况下,部署工具会通过网络连接到目标计算节点和配置对应的计算流程,成功后,开始执行大规模数据处理方案。同时,依据配置与部署方案,开始通过代码来执行分配计算资源和存储资源。
(5)部署及实施计算流程。在外部数据处理资源管理实施方案的监测下,在各个计算节点上,实现相应的大规模数据处理的部署过程和实施方案。
(6)启动计算节点,激活相应的计算资源、存储资源的虚拟化分配,同时激活整个计算流程。在完成监测之后,开始激活。在计算节点上启动部署后,通过网络,在各个计算节点发送一系列数据处理命令,完成计算流程的部署和调度工作,激活成功后,则在各个计算节点执行计算流程。
本文所研究的大规模数据处理是基于云计算环境的,其基本特征之一是利用大规模的廉价服务器集群来并行、分布式地完成数据的处理任务,因此,MapReduce并行、分布式编程模型也是本文研究的核心技术之一,它能够很好地把并行任务调度、任务容错处理、空间局部性优化以及计算节点间的负载均衡等在MapReduce模型内部实现。
MapReduce开发只需要通过定义Map和Reduce两个接口,读取大规模数据后,借助于计算机集群,运行用户编写的程序,将输入的大规模数据集合拆分成大量的数据片段,生成一系列的Key/Value(键值对)作为中间数据,将每一个数据片段分配给一个Map任务,而MapReduce框架将这些子任务分配到大规模计算集群中的节点,根据分配到的Key/Value(键值对)进行计算,生成中间结果Key/Value(键值对)集合,最后输出到Reduce阶段,其中含有相同Key(键值)的数据会在同一个节点运行产生一个新的二元组集合(K’,V’*)。
Map(input_key1,input_value1)—>List(output_key2,output_v2)
在Reduce函数中,每个Reduce任务会将被分配到到相应的二元组集合(K’,V’*)集合片段作为输入,运行Reduce函数,将二元组作为一个输出的键/值对(K,V),Map/Reduce框架会再一次将这些集群中的节点上的Reduce任务进行分发,然后将这些中间结果数据片段再次分配到每一个Reduce任务进行处理。
Reduce(output_key2,List(in_m_value2))—>List(output_v2)
在每个阶段的数据处理的执行都是由容错机制及负载均衡机制进行监测的,保证在数据处理过程中出现错误的任务会自动分配到计算平台的其他节点上,在运行过程中失败的数据处理任务会重新运行。
大规模数据处理的MapReduce实现过程如图2所示。
可以看出,对大规模数据处理的Map操作是高度并行的,这对于高效率的大规模数据处理非常重要,其在大规模数据处理中的主要优势体现在以下几点:
(1)支持大规模数据的计算和存储。在云计算环境下的大规模数据信息一般是GB或TB级别的,而Hadoop框架下的HDFS用来支持大规模数据,它能够提供高数据带宽并且能够扩展到大规模廉价计算集群中的成百上千个节点,实际上,在一个单独的HDFS实例中应该能够支持数千个文件。
(2)在大规模数据的长时间处理过程中的容错处理机制及计算节点失效处理机制,能够在某个数据处理任务失败时,也不会因为数据的丢失而导致整个计算的重新执行,这一点可以很好地满足大规模数据处理的准确性和完整性。
(3)数据复制机制和负载均衡机制。实际上在数据处理过程中,数据都是以数据块串序列的形式存储的,因此,从容错性方面考虑,数据块是被复制的,而在这一过程中,会涉及到负载均衡的问题,而云计算环境下的这一特征能够很好地满足大规模数据处理的需求。
针对一般的大规模数据资源和计算资源的特征及数据处理的要求,笔者将计算机网络和云计算技术引入到大规模数据处理中,提出在集中或分布管理的大量廉价计算机(如PC)集群上构建动态的、可扩展的、高性价比的、易使用的高性能计算平台,并提出基于云计算的大规模数据处理框架模型[ 9],如图3所示。
这一框架模型分为两级,第一级是底层的大规模廉价计算机集群及对应的虚拟资源体系;第二级是基于第一级的大规模数据处理与分析的基础架构、数据处理服务请求与处理及监测管理体系。其中,第一级的核心思想是,最底层的物理资源是由闲置的计算机资源组成的物理设备和虚拟资源层,该层通过虚拟化技术将相同类型的各种物理资源构成同构或接近同构的数据处理资源池,因此,可以在此基础上构建一种动态的、可扩展的、高性价比的高性能计算平台;软件体系的核心部分是第二级,在第一级构建的大规模廉价计算机集群及对应的虚拟资源体系的基础上,形成大规模数据处理所需的虚拟化资源的配置、回收、容错处理及负载均衡等功能体系,在虚拟资源被统一调度和管理的基础上,利用Hadoop的核心技术,通过编写数据处理接口,针对不同领域及学科的大规模数据处理的服务需求,为用户提供大规模数据处理的计算平台的软件支持,在各个虚拟计算节点之间完成分布式的并行数据处理的计算任务,并将最终的结果以对应的云服务形式提供给终端用户。提供给地理数据分析、天文信息计算、Web日志处理分析及DNA信息分析等大规模数据处理的用户接口,可以通过Web Service方式提供接口访问,从而获得用户大规模数据处理需求,以及反馈大规模数据处理的结果。
本文对此框架进行了初步的实现,利用分布式开源计算框架Hadoop,使用其分布式文件系统HDFS和MapReduce来协调和处理大规模数据处理的业务。
(1)大规模计算机集群环境搭建。通过映射,放置MapReduce任务在计算节点中,将大规模数据划分成多个子块,确定数据块的分块大小、数目等,HDFS能够智能地放置数据块的副本在每个计算节点,并设置每个节点的具体角色。
(2)载入大规模数据到Hadoop提供的分布式文件系统HDFS中,以允许Hadoop把MapReduce的数据处理任务转移到各个计算节点。
(3)大规模数据处理的分布化。即需要Map函数、Reduce函数和相关程序实现大规模数据处理,而Hadoop提供了一个API来运行MapReduce。
(4)反馈数据处理结果。通过用户验证接口,将大规模数据处理结果通过相应的云服务平台反馈到数据处理需求者。
在此框架模型的基础上,以大规模的Web日志数据信息处理为例,从多个站点的前端收集获取原始Web日志文件。选择大规模的Web日志文件作为研究对象,是考虑到日志文件的处理模式与许多电子商务的大规模商业数据的处理分析有相似之处,在这一处理过程中,数据信息主要经历以下几个步骤:
(1)从站点前端收集Web日志,将收集到的前端日志信息保存起来;
(2)由于收集到的Web日志文件来源较为复杂,对应的原始日志都有着不同的配置格式,因此需要对大规模的日志配置进行格式化,保证数据信息的格式统一并且内容完整;
(3)将大规模Web日志导入HDFS,利用HDFS的存储原理和备份机制,在各个节点间建立数据通信方式,配置相应的数据节点、数据备份的数目及对应的名称节点等信息;
(4)使用MapReduce模型,完成数据处理的规则设计和计算功能,这部分是在2.2节的理论分析的基础上进行的,是数据处理过程的重要部分;
(5)计算完成后,将计算结果导出,按照既定的输出格式和输出要求保存,并且在经过数据处理计算后,可以更加方便用户进行信息分析和处理;
(6)得到用户所需要的数据处理结果,并且清理垃圾数据以及垃圾文件。
在每一个过程进行中,都对其进行数据处理过程监控以及负载均衡处理,以便能够及时地监控模型框架运行的状况,从而发现问题并找出大规模数据处理过程中运行时的错误。
实验环境搭建在一个小型的计算机集群上,该集群由6台服务器组成(CPU Pentium4 2.4GHz,内存1.0GB,硬盘80GB),选择其中一台作为NameNode和MapReduce编程模型中的JobTracker,其他5台作为DataNode和对应JobTracker的TaskTracker,操作系统是Ubuntu 10.04。
实验环境的搭建需要涉及到很多的Linux常规操作,在此不再赘述,主要就云计算环境的大规模数据处理相关的配置进行描述[ 10]。
(1)SSH配置
Hadoop控制脚本通过SSH配置来执行计算机集群上的大规模数据处理操作,考虑到安全性及方便性,在登录集群中的计算机时,就不需要输入密码。实现这一功能,需要生成一个RSA密钥,然后通过第二条命令使得密钥在整个集群中共享。一旦成功地在所有机器上创建RSA密钥后,就可以开始在计算节点上部署Hadoop。设置命令如下:
% SSH -keygen -t rsa -f ~/.ssh.id_rsa
% cat ~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys
(2)Slaves和Master的配置管理
集群中每一个计算节点都有自己的配置文件集,而Hadoop允许配置一个文件集供所有的Master和Slaves使用。Master列出了NameNode和JobTracker运行的集群,而Slaves则列出了运行大规模数据处理任务的节点和TaskTracker的节点。
(3)主节点设置
主节点的数据处理环境要求比从节点高,因为它在内存中保存着整个Namespace的文件和文件块的元数据,因此,在本实例处理过程中,由于集群中运行着多个MapReduce数据处理任务,使得主节点的JobTracker会使用相当大的硬件资源。
(4)Hadoop环境设置
Hadoop默认分配多少内存给它运行的每个后台程序,通过变量HADOOP_HEAPSIZE来进行控制,而在TaskTracker上同一时间能够运行的Map数据处理任务的最大数量可以通过属性mapred.tasktracker.map.tasks.maximum来设置,其默认值为2;而Reduce数据处理任务的最大数量可以通过属性mapred.tasktracker.reduce.tasks.maximum来设置,其默认值为2。按照不同的大规模数据处理的特征,也可以动态分配每个子任务的虚拟计算节点的内存空间,这一特征通过mapred.child.java.opts属性来设置。
(5)其他较为重要的设置
在Hadoop文件夹下的conf目录中hadoop-default.xml文件中包含了Hadoop所有的默认配置项,但是这个文件不允许直接修改,可以通过修改hadoop-conf目录下的hadoop-site.xml文件来定义实际需要的配置方案,而覆盖掉原有的默认配置。
(6)开始启动集群
在配置完成后,可以启动整个计算机集群,开始大规模数据处理过程,启动命令如下:
$ HadoopBin/hadoop jar $ ShBin/WebLogManage.jar DataATMDaily.xml
其中WebLogManage.jar是已经编辑好的Web日志数据处理的事务包。
在部署完毕后,开始对在大量集中或分布管理的大量廉价计算机(如PC)集群上构建动态的、可扩展的、高性价比的、易使用的高性能计算平台这一构想进行验证,并且对得出的用于大规模数据处理而构建的云计算框架模型进行验证。
验证云计算框架模型及计算集群建设是否正确,最好的方法是基于经验测试:运行一些大规模数据处理任务并确认是否得到预期的结果。为了得到最好的测试结果,应该在没有其他计算任务干扰的情况下,单独在集群上进行测试。
大规模数据处理的测试程序被打包在LargeData.jar文件中,可以通过无参数的调用得到其相应的列表数据,命令如下:
% hadoop jar $HADOOP_INSTALL/hadoop-*-LargeData.jar
(1)测试HDFS的硬件设备性能,检查大规模廉价计算机集群是否可以支持云计算环境下的大规模数据处理。
选择将近10GB大小的Web日志文件作为分析对象,主要通过MapReduce作业来进行测试,每个数据信息的处理都在单独的Map或Reduce任务中进行,并且Map的输出可以用来统计刚刚处理过的数据信息。以下命令是将10GB大小的Web日志数据划分成5个子块,每个子块大小为2 000MB:
% hadoop jar $HADOOP_INSTALL/hadoop-*- LargeData.jar TestDFSIO -write
-nrFiles 5
-filesize 2000
运行成功后,测试结果被写入控制台中,同时也被写入到一个本地的文件中,如图4所示:
通过图4可知,计算过程顺利,没有出现异常,因此可以初步判断建立的计算机集群能够满足大规模数据处理的计算需求。
(2)使用Hadoop自带的排序算法,测试所建立的针对大规模数据处理的框架模型是否能够支撑大规模数据处理的计算。
该过程分为三步:生成随机数据,执行排序算法,验证排序结果。首先需要生成大规模的随机数据,在Hadoop中,通过RandomWriter来实现,然后以每个节点10个Map的方式来运行MapReduce的数据处理作业,每个Map生成5GB的随机数据,10个Map的处理任务将产生近50GB的随机数据,实现的命令如下:
①产生大规模的随机数据
% hadoop jar $HADOOP_INSTALL/hadoop-*-sorttest.jar randomwriter large-random-data
②执行排序算法
% hadoop jar $HADOOP_INSTALL/hadoop-*-sorttest.jar sort large-random-data large_sorted_data
③验证排序是否正确
% hadoop jar $HADOOP_INSTALL/hadoop-*-sorttest.jar testmapredsort sortInput large-random-data-sortOutput large_sorted_data
这条语句主要是对没有经过排序的大规模数据和经过排序的大规模数据进行一系列的测试,来确认数据的排序是否正确,运行的最终结果显示在控制台上,如下所示:
SUCCESS! Validated the MapReduce framework’s ‘sort’ successfully.
本文对云计算环境下的大规模数据处理技术进行了研究和初步实现,验证了云计算技术在涉及到大规模数据信息这一领域的可用性、可扩展性及可靠性。这一理论和实践的研究也将会对地理数据分析、海洋信息监控、天文信息计算处理、DNA信息分析、 医疗影像处理、 海量病例存储分析、医学分析、商业贸易、人口普查以及交通业务等大规模数据处理和分析领域,产生一定的影响,为其提供一定的应用价值和研究空间。
[1] |
|
[2] |
|
[3] |
|
[4] |
|
[5] |
|
[6] |
|
[7] |
|
[8] |
|
[9] |
|
[10] |
|