SRP结题报告基于分布式存储的实验数据采集和管理系统学院电子信息工程班级2012级电信3班姓名唐伟志学号201230283014指导老师徐向民实施时间2014.1-2014.111.绪论1.1研究背景在信息技术不断发展下,人们认识到了数据本身的价值,“大数据”在商业应用中取得了巨大的成功。在智能信息处理的研究中,我们主要通过算法对数据进行理解和感知,在研究过程中会采集和产生大量数据,如声音、视频、算法结果等,以往这些数据大部分会被作为无用数据丢弃,只保留部分实验结果。本项目拟使用当前非关系数据库、分布式文件系统等技术,建立智能信息处理中实验产生数据的采集及存储平台,将数据存储,以便后续更强大的算法和计算资源进行分析处理。1.2学生参与研究主要内容开发基于分布式存储的实验数据采集和管理系统,用于采集和存储各类试验中产生的数据,方便随时获取和查阅,同时为后续更大规模的算法统计和处理做准备,详细包括:(1)、智能信息处理相关研究中各个环节数据的高效、方便的采集;(2)、采集到数据的智能化处理,如标记、分类、压缩等;(3)、搭建分布式存储系统,用于存储相关数据,并尽量能适应未来大规模并行算法的一些需求特点;(4)、开发Web应用,能进行方便的数据查阅和获取。1.3预期目标搭建基于分布式存储的实验数据采集和管理系统的小规模示范系统。2.分布式文件系统概述2.1分布式文件系统简介分布式文件系统(DistributedFileSystem)是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。在这样的文件系统中,客户端并非直接访问底层的数据存储区块,而是通过网络,以特定的通信协议和服务器沟通。借由通信协议的设计,可以让客户端和服务器端都能根据访问控制列表或是授权,来限制对于文件系统的访问。相对地,在一个分享的磁盘文件系统中,所有节点对数据存储区块都有相同的访问权,在这样的系统中,访问权限就必须由客户端程序来控制。分布式文件系统可以包含的功能有:透通的数据复制与容错。也就是说,即使系统中有一小部份的节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。综上所述,分布式文件系统所拥有的透通的数据复制以及可靠的容错性,十分适合用于实验数据采集和管理系统。2.2分布式文件系统的选择当前比较流行的分布式文件系统包括:Lustre:lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护。该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数量存储系统。Hadoop:hadoop并不仅仅是一个用于存储的分布式文件系统,而是设计用来在由通用计算设备组成的大型集群上执行分布式应用的框架。NFS:网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS。NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件一样访问远端系统上的文件。在实际搭建中,主要考虑使用ApacheHadoop,Hadoop可以配合云计算处理OpenStack使用,开源,文档资料比较丰富,现在已经广泛投入生产使用,也能够满足项目后续更大规模的算法统计和处理的要求。3.ApacheHadoop简述及安装3.1关于ApacheHadoopApacheHadoop是一款支持数据密集型分布式应用并以Apache2.0许可协议发布的开源软件框架。它支持在商品硬件构建的大型集群上运行的应用程序。Hadoop是根据Google公司发表的MapReduce和Google档案系统的论文自行实作而成,由开源社区维护。Hadoop框架透明地为应用提供可靠性和数据移动。现在普遍认为整个ApacheHadoop“平台”包括Hadoop内核、MapReduce、Hadoop分布式文件系统(HDFS)以及一些相关项目,有ApacheHive和ApacheHBase等等。3.2Hadoop基础架构Hadoop被定位为一个易于使用的平台,以HDFS、MapReduce为基础,能够运行上千台PCServer组成的系统集群,并以一种可靠、容错的方式分布式处理请求。下图显示Hadoop部署结构示意图在Hadoop的系统中,会有一台master,主要负责NameNode的工作以及JobTracker的工作。JobTracker的主要职责就是启动、跟踪和调度各个Slave的任务执行。还会有多台slave,每一台slave通常具有DataNode的功能并负责TaskTracker的工作。TaskTracker根据应用要求来结合本地数据执行Map任务以及Reduce任务。3.3Hadoop处理流程Hadoop主要靠MapReduce进行处理处理。MapReduce是由Google在一篇论文中提出并广为流传的。它最早是Google提出的一个软件架构,用于大规模数据集群分布式运算。任务的分解(Map)与结果的汇总(Reduce)是其主要思想。Map就是将一个任务分解成多个任务,Reduce就是将分解后多任务分别处理,并将结果汇总为最终结果。下图所示Hadoop处理流程:上图就是MapReduce大致的处理流程。在Map之前,可能还有对输入数据的Split过程以保证任务并行效率;在Map之后可能还有Shuffle过程来提高Reduce的效率以及减小数据传输的压力。3.4Hadoop的安装安装环境:ubuntu13.10+Hadoop2.3.0+java1.7.0首先通过虚拟机VirtualBox搭建ubuntu13.10,然后根据Hadoop官方文档,安装好伪分布式Hadoop2.3.0,即可使用jps命令进行安装检测。若jps命令可以检测出NodeManager、NameNode、SeconderyNameNode、DataNode、ResourceManager等Hadoop相关组件成功启动,即表示Hadoop安装成功。4.使用MapReduce进行数据处理4.1关于MapReduceMapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组。4.2分布和可靠性MapReduce通过把对数据集的大规模操作分发给网络上的每个节点实现可靠性;每个节点会周期性的把完成的工作和状态的更新报告回来。如果一个节点保持沉默超过一个预设的时间间隔,主节点记录下这个节点状态为死亡,并把分配给这个节点的数据发到别的节点。每个操作使用命名文件的不可分割操作以确保不会发生并行线程间的冲突;当文件被改名的时候,系统可能会把他们复制到任务名以外的另一个名字上去。(避免副作用)。由于MapReduce的分布和可靠性,非常适合运用在Hadoop中进行数据处理。Hadoop发展到现在,已经将MapReduce算法的相关API封装好,可以根据官方文档,使用java编写具体的程序以进行相应的数据处理。4.3MapReduce实现倒排索引假设有一文本文件,其中存放着一批通话理论,分为两列存储,第一列数据是用户A的手机号码,第二列数据是用户B的手机号码,由用户A拨给用户B,实例数据如下:135999999991008613526548965120135333333331230613655555555100861374444444413562535265152365899991356253526508546860451120085468672561230613965486666120现在需要对这批数据进行处理,实现一个倒排索引,记录拨打给某一用户B的所有用户A。参考官方文档,Map()函数如下实现:publicstaticclassMapextendsMapperLongWritable,Text,Text,Text{publicvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException{Stringline=value.toString();//readsourcelinetry{String[]lineSplit=line.split();Stringnums0=lineSplit[1];Stringnums1=lineSplit[0];context.write(newText(nums0),newText(nums1));}catch(java.lang.ArrayIndexOutOfBoundsExceptione){context.getCounter(Counter.LINESKIP).increment(1);return;}}}Map()函数使用java.string中的split()函数进行数据切割,每行切割后的两个数据分别存入nums0和nums1,这样Map()所做的工作完成,后面的context.write只不过是设定一定的格式,将nums0和nums1传到下一步,接下来进行的Reduce()函数。Reduce()函数接受到数据后,将对拆分好的数据进行输出前的处理,我们将在这里设定输出的样式,具体代码如下:publicstaticclassReduceextendsReducerText,Text,Text,Text{publicvoidreduce(Textkey,IterableTextvalues,Contextcontext)throwsIOException,InterruptedException{Stringvaluestring;Stringout=;for(Textvalue:values){valuestring=value.toString();out+=valuestring+|;}context.write(key,newText(out));}}这个MapReduce就这样完成了,这也是整个程序的核心,将程序完善后,可以得到如下数据:可以看到已经成功得到了倒排索引的结果,虽然这一程序可以不用MapReduce实现,因为数据量足够小,不过若是在大数据处理方面,使用代码直接处理与MapReduce处理的性能相差甚远。4.4Hadoop的总结根据上面对于Hadoop的介绍,以及Hadoop中使用MapReduce进行数据处理的实例,我们说搭建出来的这一数据存储和数据处理有着分布式、容错性和可靠性等优点,适用于实验数据存储、处理和管理平台。至此,基于分布式存储的实验数据采集和管理系统的基本框架已经搭建完成,也进行了一定的数据处理测试,大体让人满意。5.关于openstack5.1使用openstack虽然Hadoop在数据存储和处理方面已经足够优秀,通过上面的分析也知道能够满足要求,但是数据的采集方面仍然没有更好的进行优化,还是使用传统的输入,所以使用openstack这一云端计算服务,方便数据的存储、离线和本地化。而且,也可以基于openstack拓展更多的功能。5.2openstack架构OpenStack提供了一个部署云的操作平台或工具集。旗下包含了一组由社区维护的开源项目,他们分别是OpenStackCompute(Nova),OpenStackObjectStorage(Swift),以及OpenStackImageService(Glance)。三个项目的基本关系如下图:解读一下图示内容:Openstack隔离用户层和供应商,中间通过镜像Image来连接,即供应商提供镜像,其中包含着相应的服务交由用户层使用,同时还向开发人员暴露API,可以方便进行更多的功能拓展。5.3openstack的安装Openstack发展到如今已经有了很大的改变,不过它的安装还是比较复杂的,要想了解openstack安装的相关信息以保障有步骤、有保障