基于云计算和大数据的图书馆 应用系统建设设计

1 序言

随着世界的发展,人们对计算机性能的要求越来越高。以前人们把重点都放到了提升单台计算机性能上面,但如今单台计算机的性能已经到达了瓶颈,而人们对计算机性能的需求却越来越强烈。近几年,随着新技术的出现和发展,尤其是云计算技术的出现,以及大数据的运用,对网络技术带来了革命的转变,如何顺应时代发展并将新技术应用于信息化建设中,改变传统的教学模式和学习模式至关重要。面对网络建设长期存在几个难题:建设成本高、管理维护困难、更新换代快,我们应该如何应用云计算技术巧妙的应对呢?

 本设计将以网络建设和大数据分析为目标,将云计算技术合理运用到图书馆系统网络建设中,合理、高效地完成实践教学,解决整个图书馆应用系统在运行维护中出现的各种问题。


2 设计目的

2.1非分布式集群的不足

互联网的相关技术不断向前发展,人们日益习惯于经由互联网查阅和获得信息资源,传统图书馆的业务范畴是以纸质资源为基础的,而在数字图书馆领域中,信息有着林林总总的表现形式:图像、文档、音频、视频等等,在数字图书馆中,此类多媒体信息是不可缺少的。因此数字图书馆要管理的数据量越来越大,加之网络技术获得了前所未有的高速发展,移动宽带网络走进人们的视野,移动智能终端得到了广泛的普及,与互联网相连接的移动设备也越来越多。由此对互联网而言,它的系统负载也越来越大,这就要求它务必拥有大量地消化和整理数据的超强能力。

然而,传统的数字图书馆服务构建模式明显不能响应这样的需求。如果通过高性能的设备来解决问题,那样成本太高。即使在舍得花大成本的情况下,传统非分布集群依旧不能很好的处理网络管理维护困难、更新换代快的问题。然而这一切问题,分布式系统都能够很好的解决。


2.2 分布式集群介绍

分布式集群系统(distributedsystem)是建立在网络之上的软件系统。同时也是云计算实现的基础。云计算是计算模型的一种,是由并行处理(Parallel Computing)、网格计算(Grid Computing)、分布式处理(Distributed Computing)等发展而来的。从云计算的本质上来讲,大部分的计算任务被分布在由计算机组成的资源池之上,这样一来,客户就可以用户根据自己的需要得到相关的服务,这包括了计算能力、信息服务和存储空间等。云计算作为一种IT基础设施与服务的交付和使用模式,将会深刻地影响未来互联网的运作和服务模式,同时为传统图书馆和数字图书馆未来的发展,提供了全方位的指导和启发,也为传统图书馆提供了一种新的运营模式。

在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。系统中存在一个以全局的方式管理计算机资源的分布式操作系统。分布式系统是以全局方式管理系统资源的,它可以为用户任意调度网络资源,并且调度过程是“透明”的。当用户提交一个作业时,分布式系统能够根据需要在系统中选择最合适的处理器,将用户的作业提交到该处理程序,在处理器完成作业后,将结果传给用户。在这个过程中,用户并不会意识到有多个处理器的存在,这个系统就像是一个处理器一样。


2.3 分布式集群的优势

2.3.1 相比于集中系统

1、经济。倾向于分布式系统的主要原因是它可以潜在地得到比单个的大型集中式系统好得多的性价比。实际上,分布式系统是通过较低廉的价格来实现相似的性能的。无论是要以低价格获得普通的性能还是要以较高的价格获得极高的性能,分布式系统都能够满足。

2、速度。对分布式系统和并行系统进行对比之后可以发现,分布式系统可以达到并行系统所追求的目标,即用最快的速度完成一个任务。

        3、固有的分布性。建立分布式系统的另一原因在于一些应用本身是分布式的。

        4、高可靠性。同集中式系统相比较,分布式系统的另一个潜在的优势在于它的高可靠性。通过把工作负载分散到众多的机器上,单个芯片故障最多只会使一台机器停机,而其它机器不会受任何影响。理想条件下,某一时刻如果有5%的计算机出现故障,系统将仍能继续工作,只不过损失5%的性能。

        5、渐增。渐增式的增长方式也是分布式系统优于集中式系统的一个潜在的重要的原因。许多公司在发展的过程中,对设备的需求是逐渐增长的,这个时候如果采用分布式系统,仅给系统增加一些处理机就可能解决问题。

  从长远的角度来看,主要的驱动力将是大量个人计算机的存在和人们共同工作与信息共享的需要,这种信息共享必需是以一种方便的形式进行的,而不受地理或人员、数据,机器的物理分布的影响。


2.3.2 相比于独立PC

1、数据共享。在实际的工作生活当中,许多用户都需要共享数据,共享数据是许多应用的基础,所以计算机间必须互联,而计算机互联就产生了分布式系统。

        2、设备共享。共享并不只是仅仅涉及数据。昂的外,例如彩色激光打印机,照相排版机以及大型存储设备(如自点唱机)都是共享

        3、通信。分布式系可以增人与人之的沟通。件比信件、电话真有更多的人之。它比信件快的多,不像电话需要两人同都在,也不像真,它所生的文件可在算机中编辑、重排和存,也可以由文本处理程序来处理

        4、灵活性。分布式系可能比每个用一个独立的算机更灵活。分布式系统可以使工作负荷能更有效地在计算机系统中进行分配。系统中某些计算机的失效也可以通过使其工作在其它计算机上进行而得到补偿。


2.4 分布式集群的必要性

分布式集群可以做到以更低的经济成本收获更好的计算机技能,在可靠性上较之非分布式系统也有更明显的优势,部分计算机故障不会影响整个系统的运作,系统仍然可以继续工作,只是减少了少部分的性能而已。同时,分布式集群更能满足用户渐增的需求……较之独立的PC机更是有实现数据共享、设备共享、用户通信、高灵活性等优势。总之,分布式集群这些显著的优势已经形成了分布式集群广泛应用的强大趋势。出于人们对高效工作,便捷生活的一致性追求,分布式集群的应用已经变成了无需言说的必然需求。

分布式集群给现有计算资源和使用模式带来的巨大变化。尤其引出的云计算更是以一切皆服务的理念也将使数字图书馆的方方面面受益。毫无疑问,云计算将会在数字图书馆的发展建设中产生深远的影响, 云计算技术应用在数字图书馆建设中也具有广阔的前景。


3可行性分析

3.1图书馆基本模式于不足

分布式集群可以做到以更低的经济成本收获更好的计算机技能,在可靠性上较之非分布式系统也有更明显的优势,部分计算机故障不会影响整个系统的运作,系统仍然可以继续工作,只是减少了少部分的性能而已。同时,分布式集群更能满足用户渐增的需求……较之独立的PC机更是有实现数据共享、设备共享、用户通信、高灵活性等优势。总之,分布式集群这些显著的优势已经形成了分布式集群广泛应用的强大趋势。出于人们对高效工作,便捷生活的一致性追求,分布式集群的应用已经变成了无需言说的必然需求。

分布式集群给现有计算资源和使用模式带来的巨大变化。尤其引出的云计算更是以一切皆服务的理念也将使数字图书馆的方方面面受益。毫无疑问,云计算将会在数字图书馆的发展建设中产生深远的影响, 云计算技术应用在数字图书馆建设中也具有广阔的前景。


 3.2 云计算和大数据趋势

 3.2.1 云计算基本介绍

云计算是一种在互联网上将分布式处理(Distributed Computing)、并行处理(ParallelComputing)和网格计算(Grid Computing)结合起来的超级计算模式,它将计算和存取集中于网络中的集群服务器中,通过云计算,只要用户联接到互联网,就能使用这些基于Web2.0的、分布式的、不需要任何软件支持和用户存储设备的资源和应用服务。这些服务逐渐引领了一种由全新的计算模式所驱动的浪潮:企业或个人将不再需要在电脑中安装大量套装软件,而是通过Web2.0浏览器接入到一种大范围的、按需定制的服务用户只需要操作客户端软件,就能实现自己需求的分布在各种服务器、个人电脑、甚至移动电话和其他设备上的大量软硬件资源和应用服务,还能把这些资源和应用服务集中在一起协同工作。

这一特点使个人计算机能以最小化的性能完成最大化的功能,这样的搜索效率正是数字图书馆需要想实现的。用户用最简便的操作满足最复杂的需求,而这些需求应该是用户定制的,非结构化的,同时能够把用户需要的结果在最短的时间内传递给用户最方便访问的网络设备上,这就要求数字图书馆做到应用的复杂性和使用的便利性两者的完美结合,即放弃传统的系统架构,采用云计算的模式。基于云计算架构的数字图书馆可以称为“云图书馆”。


3.2.1云计算应用于图书馆的优势

1、超强的计算能力

通过一定的协调调度。云计算模式可以通过数万乃至百万的普通计算机之间的联合来提供超强的、可以与超级计算机相抗衡的计算能力。使用户完成单台计算机根本无法完成的任务。在“云”中,使用者只要输入简单指令即能得到大量信息。因为在云计算模式中,人们不是从自己的计算机上,也不是从某个指定的服务器上,而是从互联网络上,通过各种设备(如移动终端等)获得所需的信息,因此其速度得到了质的飞跃。  

2、以用户为中心

在云计算模式中,相关的数据存储在“云”之中,用户可以在任何时间、任何地点都可以以某种便捷、方便、安全的方式获得云中的相关的信息或服务。虽然在“云”里有成千上万台计算机为其提供服务,但对于“云”外的用户来说,他看到只是一个统一的接口界面,用户使用云服务就如通过互联网使用本地计算机一样的方便。  

3、实现绿色数据计算

人们需要监管能力更强的计算模型,来充分提高计算效率,不仅仅是计算资源的利用率,而且是从物理上降低设备能耗。云计算的出现大大加快了实现绿色数据计算的步伐。   

4、降低了数据外泄的可能性

这也是云计算服务商讨论最多的一个优点。在云计算之前,数据容易被盗,而随着云计算的推广以后。用户可以把自己的数据放在“云”中,只要用户能够接入互联网就能够根据需要随时存取,为网络应用提供了几乎无限多的可能,为存储和管理数据提供了几乎无限的空间。   

5、经济实惠

云计算中,用户只需花少量的钱来租用相关的云服务商所提供的相关服务即可。它可以让用户利用很少的投资获得较大的回报。不必担心自己所购买的IT产品被淘汰,因为具体的硬件配置和更新都是由云服务提供商来提供的。用户所需做的只是通过各种设备享受云服务所提供自己需求的信息、知识、服务等。


3.2.3 云计算关键技术

云计算是超级计算方式的一种新型体现,以数据为中心,是超级计算中数据密集型的表现。它具备自身独特的技术,主要体现在数据管理,编程模式,数据存储等方面。

云计算采用分布式的存储方式和冗余存储方式来保证其经济性,高可用和高可靠的性能。此外,云计算系统可以满足大量用户的同时需求,云计算系统向用户提供高效的服务必须对大数据进行处理,分析和计算。所以数据管理技术管理大数据集必须要做到高效。其次,云计算数据管理技术所必须解决的问题是如何找到隐藏在规模巨大的数据中的特定的数据。云计算的编程必须十分简单,后太复杂的任务调度和并行执行必须想用户透明,以让用户能轻松享受云计算为用户带来的服务,并让用户能轻松编写程序以为其服务。云计算的编程模式采用类似于Map-Reduce的编程模式,并且现在所有的IT厂商提供的云计划都采用此种编程工具。这种编程模型不但在云计算中被广泛采用,在多核和多核处理器,异构机群等上同样效果良好。改编成模式仅适用于编写能够高度并行化和任务内部松耦合的程序,Map-Reduce的发展方向是使得程序员能够轻松的编写运行时能高效的调度和执行任务,紧耦合的程序。

下面从文件系统、并行数据处理和虚拟化技术方面介绍三类相关技术。

1、  文件系统技术

云计算采用的文件技术系统严格意义上来说是分布式的文件系统。其包括从硬件到软件的整套解决方案。包含大规模的故障检测技术,集群安装技术,节点动态加入和节能等技术。大规模集群安装技术以其动辄上万台的数据中心迅速安装,部署文件系统;故障检测技术是指由于云计算文件系统构建在多类型计算机上,在短时间内确定故障的相关检测技术。节点动态加入是将裸机加入到文件系统,获取系统并安装;节能技术是指采用多养机制降低消耗,例如修改服务器主板等技术来提高电量的利用率。 

2、  并行数据处理技术

相对于传统的分布式程序设计,云计算采用的是封装了并行处理,本地化计算,容错处理等细节的分布式数据处理技术。并且提供了一个可以大尺度的计算分布执行和自动并发的接口让编程变得容易。用户和机构选择合适云资源可以根据投资的多少和自身的需要来选择,完善自身的应用管理可以根据不同的运行模式来选择不同的封装编程语言,这是并行处理技术为用户提供的很大的方便。

3、  虚拟化技术

虚拟化技术是调配计算资源的一种方法,它将不同层面的应用系统(硬件,软件,数据,网络存储等)隔离起来,使得打破服务器,存储,数据中心和物理设备之间的划分,实现架构动态化成为可能。并集中资源和动态使用物理资源和虚拟资源,提高了系统结构的灵活性和弹性,降低了成本和管理风险,并改进了服务。我们所说的云计算就是虚拟化技术推广到互联网的概念。云计算能够给企业带来获得应用所需足够的计算能力和购买计算能力两大价值。解决了企业无法负担基础设施建设的高额投资成本和以往计算能力不足的问题。现在很多企业都需要处理大数据量的计算能力,他们迫切需要云计算存在的现实。云计算改变了对IT的应用建设模式,也改变了企业对计算资源的使用和采购方式。


4 物理结构设计

4.1 基于云计算的数字图书馆基本架构

目前数字图书馆多为静态部署的、传统B/S三层结构计算机检索系统,即用户通过图书馆终端或者浏览器访问图书馆网站(接口层),进行查询、借还书等操作请求,接口层的Web服务器把这些用户请求发送到中间应用层服务器,应用层服务器再对数据库进行操作,实现用户需求,这种方式需要每一个图书馆都安装一套这样的系统,才能让用户使用。

然而,基于云计算的数字图书馆,是以云计算服务器为核心、部署动态的和虚拟化的硬件服务器为组成部分的云计算系统。用户在使用云计算图书馆时,通过应用层的操作接入云计算系统, 用户动态请求能驱动云计算服务器动态部署虚拟硬件提供存储和计算能力,从而实现以云计算服务器为平台层的“无处不在”的访问,可以同时与应用层的所有用户共享数据流量和计算能力,用户间也可以动态地提供请求和反馈信息。这些存储信息资源的的服务器集群根据云计算服务器的控制任务,提供用户需要的信息,这种强大的分布式计算和存储能力的复杂网络让用户省去考虑如何获取和管理数据的麻烦,只需要考虑最终使用这些结果即可,从而大大提升搜索效率。


4.2网络物理结构图


(图4.2.1 基于云计算的数字图书馆网络物理结构图)


5 分布式基础架构

5.1Hadoop简介

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的硬件上。同时,它还提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问文件系统中的数据。

Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。


5.2Hadoop优势

Hadoop是一个能够对大量数据进行分布式处理的软件框架。 Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。Hadoop 还是可伸缩的,能够处理 PB 级数据。此外,Hadoop 依赖于社区服务,因此它的成本比较低,任何人都可以使用。Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。


5.2.1主要优点

1、  高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。

2、  高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。

3、  高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。

4、  高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。

5、  低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。


5.2.2大数据处理优势

Hadoop得以在大数据处理应用中广泛应用得益于其自身在数据提取、变形和加载(ETL)方面上的天然优势。

Hadoop的分布式架构,将大数据处理引擎尽可能的靠近存储,对例如像ETL这样的批处理操作相对合适,因为类似这样操作的批处理结果可以直接走向存储。Hadoop的MapReduce功能实现了将单个任务打碎,并将碎片任务(Map)发送到多个节点上,之后再以单个数据集的形式加载(Reduce)到数据仓库里。


5.3 分布式部署

Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS(对于本文)的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce的处理实现对数字图书馆的分布式部署。

基于云计算的数字图书馆,旨在利用云计算相关技术,实现一个“云图书馆”平台,在虚拟存储池上构建高校图书馆之间电子资源的共享存储架构,达到高校图书馆之间存储设备的共享的目的。这不仅可以消除地域分布、系统异构等问题造成的共享困难,有助于实现资源的统一组织和调度,还可以大大减少存储设备的重复投入,提高设备和资源的利用率。           

从用户角度,基于云计算的数字图书馆,使用户只需通过终端设备即可访问各个资源库,在“云图书馆”平台上,可同时检索到来自中国知网、万方等不同的数据库中的文献资源,避免了分库检索的繁琐;用图书馆建设的角度,加入“云图书馆”联盟使各个图书馆不再需要购买大量的数据库资源,大大减少了资金投入和存储设备的额重复投入等,从而节约出资金去购买那些费用昂贵的数据库资源。  

“云图书馆”平台由一个联合服务平台和多个 本地图书馆云平台构成。联合服务平台将不同的本地图书馆云平台集成起来,针对各个本地图书馆云平台提供的不同的OpenAPI,联合服务平台采用一个统一的API托管服务中心,以统一服务接口方式提供给各个图书馆并且以统一的界面和操作方式为读者提供服务。本地图书馆云平台是指各个图书馆根据本馆已有的大量廉价的硬件设施,将现有设备通过云计算的集群技术连接起来,构成一个运算能力、存储能力巨大的图书馆应用服务器。

图书馆云平台采用Hadoop框架,该集群环境包括一个主节点NameNode和多个子节点DataNode,NameNode采用元数据和副本的方式实现容错,DataNode则以副本的方式实现容错,并且采用节点动态加入技术来减少扩展系统的工作量。各个图书馆将放入云环境中的资源载入到分布式文件系统中,当用户发起请求时,将会生成用于搜索的MapReduce函数,并行的在DataNode中进行任务搜索,最后输出最终结果。

(图5.3.1 部署模型图)



6 详细设计方案以及架构

6.1 基于云计算的图书馆系统架构设计

基于云计算数字图书馆设计方案的逻辑结构将其分为四层。第一层是服务层,提供账户监管、门户监管、部署服务和用户监管等;第二层是管理层,指出资源监管服务和运行调度职能;第三层是虚拟化层,指出硬件虚拟化和数据资源虚拟化;第四层是资源层,包含物理服务器、互联网络和存储设置。图书馆系统并通过运用分布式技术、虚拟化、并行计算等技术,拓展硬件和软件设施职能,将不相同远程操作平台的数字图书馆硬件和软件资源有效地共同结合起来。

6.1.1 基础设施服务层

基础设施服务层是基于云计算数字图书馆提供云服务。在整个框架最底部,它是集成硬件资源虚拟化技术和有关监管作用的联合。它主要包括两方面内容,一方面,通过主机、存储设备、网络等硬件设置,采取分布式集群、抽象化和虚拟化处理,它的虚拟化集群为一体,组成了整个云计算和云服务根本设施,使外界看起来像一致性整体,在使用时,用户不必担心具体使用的哪台设备,只需发出商定的设备调用指令,既可以得到自己想要的“云”硬件资源。另一方面,在基础设施硬件分布式集群、抽象化和虚拟化的根本上,指出可提供调用的数据存储监管、计算服务监管、负荷监管和备份监管等接口服务职能,为数字图书馆服务提供灵活动态的基础设备层。

6.1.2 平台服务层

数字图书馆云服务的框架第二层是平台服务层[24],也被称为“管理中间件层”。负责信息资源管理、程序运行监管、读者监管和网络安全监管等工作。当中,信息资源监管负责均衡使用云计算信息资源节点,监控信息资源节点发生故障,倘若节点发生故障,中间件层将使其恢复或实行屏蔽,针对资源使用状况,采取统计程序的运行监管,实行读者或提交任务的应用程序,包含达成读者任务映像部署与监管、程序调度,程序执行、程序回馈监管等读者监管,是体现云计算数字图书馆一个不可缺少的内容,包含提供用户交互界面、监管和辩别用户身份、读者程序执行监管、针对读者运用计费监管等网络安全监管,主要是确保云计算设备的安全性,防止黑客攻击,包含读者身份识别验证、访问控制、病毒防护以及其他内容。

6.1.3 应用服务层

在数字图书馆中,应用服务层处于云计算服务系统架构第三层,是全部数字图书馆云服务系统的重点。采取服务层提供应用软件和服务,即为数字图书馆所需。数字图书馆采用应用软件服务进行开展,依据用户需要,通过租赁使用途径,把软件或应用程序提供给联盟厅和读者运用。提供数字图书馆核心服务项目,这些服务主要包含书籍监管、数字资产监管、公共信息服务查询、个性化信息服务咨询、全文讯息搜索、统一资源搜索、主题订阅推送服务、原文传递服务、代查代检服务、科技查新服务、技术评估服务、企业竞争情报服务、参考咨询服务、信息服务及统计分析等。用户权限计费接口模块重点达成支付接口的支持,其对象包括用户监管、权限论证、平台计费和平台支付接口支持。系统监管和业务支持重点达成系统监管和业务支持,以确保体系的正常稳定运行。

6.1.4 访问服务层

访问层是个终端进入数字图书馆云平台的入口,是架构的最高层。任何一个授权用户都可以通过标准的公用应用接口来登录,享受云图书馆服务。云图书馆界面采用Web形式,向用户提供统一的服务界面,并根据用户的不同提供相应的API实现注册、验证等功能。


 6.2基于云计算的图书馆系统总体架构图


(图6.1.4-1 基于云计算的图书馆系统总架构图)


6.3 基于云计算的图书馆系统架构实现
在对基于云计算的图书馆系统总体架构的实现上,我们考虑图书馆图书信息录入、图书检索以及图书浏览数据统计三个环节。下面分别应用HDFS以及MapReduce编程模型来实现图书信息录入过程中的数据去重,利用二分查找实现图书检索前的数据排序以及图书馆管理员在分类别进行图书浏览量统计时的取平均数操作。

基于云计算的图书馆采用HDFS进行数据存储,HDFS作为一种新兴的并行文件系统,和现有的分布式文件系统相似,他们都是运行在普通硬件之上的分布式文件系统,然而HDFS与其他分布式文件系统也存在着一些差别。如HDFS具有高容错性,可以部署在低成本的硬件之上,同时放松了对POSIX的需求,使其可以以流的形式访问文件数据,非常适合大数据集的应用程序。

同时,在基于云计算的图书馆架构中的图书信息录入环节,我们考虑利用MapReduce方法来进行数据去重。

6.3.1图书信息的HDFS存储描述

基于云计算的图书馆采用HDFS进行数据存储,HDFS的体系框架是Master/Slave结构,一个典型的HDFS通常由单个NameNode和多个DataNode组成。NameNode是一个中心服务器,负责文件系统的名字空间的操作,比如打开、关闭、重命名文件或目录,它负责维护文件路径到数据块的映射,数据块到DataNode的映射,以及监控DataNode的心跳和维护数据块副本的个数。集群中的DataNode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组DataNode上。DataNode负责处理文件系统客户端的读写请求。在NameNode的统一调度下进行数据块的创建、删除和复制。


6.3.2 图书信息录入时的数据去重

数据去重的最终目标是让原始数据中出现次数超过一次的数据在输出文件中只出现一次。我们要求同一本书不能重复的录入到图书馆信息,所有我们自然而然会想到将同一个数据的所有记录都交给一台 reduce 机器,无论这个数据出现多少次,只要在最终结果中输出一次就可以了。具体就是 reduce 的输入应该以数据作为 key,而对 value-list则没有要求。当 reduce接收到一个<key,value-list>时就直接将 key 复制到输出的 key 中,并将 value 设置成空值。

在 MapReduce 流程中,map 的输出<key,value>经过 shuffle 过程聚集成<key,value-list> 后会交给 reduce。所以从设计好的 reduce 输入可以反推出 map 的输出 key 应为数据,value 任意。继续反推,map 输出数据的 key 为数据,而在这个实例中每个数据代表输入文件中的 一行内容,所以 map 阶段要完成的任务就是在采用Hadoop 默认的作业输入方式之后,将value 设置为 key,并直接输出(输出中的 value 任意)。map 中的结果经过 shuffle过程之后 交给 reduce。reduce 阶段不会管每个 key 有多少个 value,它直接将输入的 key 复制为输出 的 key,并输出就可以了(输出中的 value 被设置成空了)。

package com.hebut.mr;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class Dedup {
    //map将输入中的value复制到输出数据的key上,并直接输出
    public static class Map extends Mapper
   
   
    
    {
        private static Text line=new Text();//每行数据
        //实现map函数
        public void map(Object key,Text value,Context context)
        throws IOException,InterruptedException{
            line=value;
            context.write(line, new Text(""));
        }
    }
    //reduce将输入中的key复制到输出数据的key上,并直接输出
    public static class Reduce extends Reducer
    
    
     
     {
        //实现reduce函数
        public void reduce(Text key,Iterable
     
     
      
       values,Context context)
        throws IOException,InterruptedException{
            context.write(key, new Text(""));
        }
    }
    
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.set("mapred.job.tracker", "192.168.1.2:9001");
        Job job = new Job(conf, "Data Deduplication");
        job.setJarByClass(Dedup.class);
        // 设置Map、Combine和Reduce处理类
        job.setMapperClass(Map.class);
        job.setCombinerClass(Reduce.class);
        job.setReducerClass(Reduce.class);
        // 设置输出类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        // 设置输入和输出目录
        FileInputFormat.addInputPath(job, new Path("/home/zhaojing/input1.txt"));
        FileOutputFormat.setOutputPath(job, new Path("/home/zhaojing/output1"));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

     
     
    
    
   
   

6.3.3图书检索前的数据排序

这个实例仅仅要求对输入数据进行排序,熟悉 MapReduce 过程的读者会很快想到在 MapReduce 过程中就有排序,是否可以利用这个默认的排序,而不需要自己再实现具体的排序呢?答案是肯定的。

但是在使用之前首先需要了解它的默认排序规则。它是按照 key 值进行排序的,如果 key 为封装 int 的 IntWritable 类型,那么 MapReduce 按照数字大小对 key 排序,如果 key 为封装为 String 的 Text 类型,那么 MapReduce 按照字典顺序对字符串排序。

了解了这个细节,我们就知道应该使用封装 int 的 IntWritable 型数据结构了。也就是在 map 中将读入的数据转化成 IntWritable 型,然后作为 key 值输出(value 任意)。reduce 拿到 <key,value-list>之后,将输入的 key 作为 value 输出,并根据 value-list 中元素的个数决定 输出的次数。输出的 key(即代码中的 linenum)是一个全局变量,它统计当前 key 的位次。 需要注意的是这个程序中没有配置 Combiner,也就是在 MapReduce 过程中不使用 Combiner。 这主要是因为使用 map 和 reduce 就已经能够完成任务了。

package com.hebut.mr;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class Sort {
    // map 将输入中的 value 化成 IntWritable 类型,作为输出的 key
    public static class Map extends Mapper
   
   
    
    
    {
        private static IntWritable data = new IntWritable();
        // 实现 map 函数
        public void map(Object key,Text value,Context context)
        throws IOException,InterruptedException
        {
            String line = value.toString();
            data.set(Integer.parseInt(line));
            context.write(data, new IntWritable(1));
        }
    }
    // reduce 将输入中的 key 复制到输出数据的 key 上,
    //然后根据输入的 value‐list 中元素的个数决定 key 的输出次数
    //用全局linenum来代表key的位次
    public static class Reduce extends Reducer
    
    
     
     {
        private static IntWritable linenum = new IntWritable(1);
        // 实现 reduce 函数
        public void reduce(IntWritable key,Iterable
     
     
      
       values,Context context)throws IOException,InterruptedException
        {
            for (IntWritable val : values) {
                context.write(linenum, key);
                linenum = new IntWritable(linenum.get() + 1);
            }
        }
    }
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.set("mapred.job.tracker","192.168.1.2:9001");
        Job job = new Job(conf, "Data Sort");
        job.setJarByClass(Sort.class);
        // 设置 Map 和 Reduce 处理类
        job.setMapperClass(Map.class);
        job.setReducerClass(Reduce.class);
        // 设置输出类型
        job.setOutputKeyClass(IntWritable.class);
        job.setOutputValueClass(IntWritable.class);
        // 设置输入和输出目录
        FileInputFormat.addInputPath(job, new Path("/home/zhaojing/input2.txt"));
        FileOutputFormat.setOutputPath(job, new Path("/home/zhaojing/output2"));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

     
     
    
    
   
   

6.3.4 各类别图书平均浏览量统计

计算学生平均成绩是一个仿“WordCount”例子,用来重温一下开发 MapReduce 程序的 流程。程序包括两部分的内容:Map部分和Reduce部分,分别实现了map和reduce的功能。

Map 处理的是一个纯文本文件,文件中存放的数据时每一行表示一个学生的姓名和他相应一科成绩。Mapper 处理的数据是由 InputFormat 分解过的数据集,其中 InputFormat 的 作用是将数据集切割成小数据集 InputSplit,每一个 InputSlit 将由一个 Mapper 负责处理。此 外,InputFormat 中还 供了一个 RecordReader 的实现,并将一个 InputSplit 解析成<key,value>对 供给了 map 函数。InputFormat 的默认值是 TextInputFormat,它针对文本文件,按行将 文本切割成 InputSlit,并用 LineRecordReader 将 InputSplit 解析成<key,value>对,key 是行在 文本中的位置,value 是文件中的一行。

Map 的结果会通过 partion 分发到 Reducer,Reducer 做完 Reduce 操作后,将通过以格 式 OutputFormat 输出。

Mapper 最终处理的结果对<key,value>,会送到 Reducer 中进行合并,合并的时候,有相同 key 的键/值对则送到同一个 Reducer 上。Reducer 是所有用户定制 Reducer 类地基础, 它的输入是 key 和这个 key 对应的所有 value 的一个迭代器,同时还有 Reducer 的上下文。 Reduce 的结果由 Reducer.Context 的 write 方法输出到文件中。

package com.hebut.mr;
import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class PageView{
    public static class Map extends Mapper
   
   
    
     {
        // 实现 map 函数
        public void map(LongWritable key, Text value, Context context)
        throws IOException,InterruptedException
        {
            // 将输入的纯文本文件的数据转化成 String
            String line = value.toString();
            // 将输入的数据首先按行进行分割
            StringTokenizer tokenizerArticle = new StringTokenizer(line, "\n");
            // 分别对每一行进行处理
            while (tokenizerArticle.hasMoreElements()) {
                // 每行按空格划分
                StringTokenizer tokenizerLine = new StringTokenizer(
                                                                    tokenizerArticle.nextToken());
                String strName = tokenizerLine.nextToken();// 名称部分
                String strPageView = tokenizerLine.nextToken();//浏览量部分
                Text name = new Text(strName);
                int pageviewInt = Integer.parseInt(strPageView);
                // 输出书名和浏览量
                context.write(name, new IntWritable(pageviewInt));
            }
        }
    }
    public static class Reduce extends Reducer
    
    
     
      {
        // 实现 reduce 函数
        public void reduce(Text key, Iterable
     
     
      
       values,Context context)throws IOException,InterruptedException
        {
            int sum = 0;
            int count = 0;
            Iterator
      
      
       
        iterator = values.iterator();
            while (iterator.hasNext()) {
                sum += iterator.next().get();// 计算总浏览量
                count++;// 统计总的图书本数 }
                int average = (int) sum / count;// 计算平均成绩
                context.write(key, new IntWritable(average));
            }
        }
        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            conf.set("mapred.job.tracker", "192.168.1.2:9001");
            Job job = new Job(conf, "PageView Average");
            job.setJarByClass(PageView.class);
            // 设置 Map、Combine 和 Reduce 处理类
            job.setMapperClass(Map.class);
            job.setCombinerClass(Reduce.class);
            job.setReducerClass(Reduce.class);
            // 设置输出类型
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            // 将输入的数据集分割成小数据块splites, 供一个RecordReder的实现
            job.setInputFormatClass(TextInputFormat.class);
            // 供一个 RecordWriter 的实现,负责数据输出
            job.setOutputFormatClass(TextOutputFormat.class);
            // 设置输入和输出目录
            FileInputFormat.addInputPath(job, new Path("/home/zhaojing/input3.txt"));
            FileOutputFormat.setOutputPath(job, new Path("/home/zhaojing/output3"));
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }

      
      
     
     
    
    
   
   


7 设计总结

7.1内容总结

本次课程设计针对网络建设长期存在的建设成本高、管理维护困难、更新换代快等难题,以基于云计算和大数据的图书馆应用系统建设设计为例,分析讲解了分布式集群相比于非分布式集群的优势以及应用趋势,同时对基于云计算的图书馆应用系统的可行性进行了详细的分析,列出了云计算技术应用于图书馆的明显优势;基于现有的图书馆基本架构进行了基于云计算的图书馆应用系统物理结构设计,并绘制了相应的网络物理结构图;从分布式基础架构Hadoop的主要优点以及大数据处理优势开始着手基于云计算的图书馆应用系统的详细设计方案;其中,分别对系统架构的基础设施服务层、平台服务层、应用服务层以及访问服务层进行了详细了设计描述,同时绘制了清晰了的图书馆系统总体架构图;最后应用HDFS和MapReduce编程模型针对图书馆系统中图书信息录入、图书检查以及图书浏览量统计三个环节进行了示例性的编码实现,成功的完成了本次课程设计的全部内容。

7.2 工作总结

本次课程设计的完成主要依赖于云计算机基础课程老师讲授的相关知识,再加上适当的相关参考文献的阅读,才得以将整个基于云计算的图书馆应用系统建设设计很好的完成。在最后的示例性编码实现环节,主要从MapReduce的映射、归于核心思想入手,简要的抽取出图书馆应用系统中相应的使用环节,应用云计算基础课程中实验课上学习到的MapReduce编程模式的使用方法加以编码实现。

通过本次基于云计算的图书馆应用系统建设设计,加深了我对云计算大数据的理解,通过实际的应用系统建设设计,提高了我的分析设计以及解决问题的能力。同时也让我清晰的认识到了云计算以及大数据的明显优势和应用趋势。

除了对云计算机基础相关知识的进一步提高,本次课程设计还引导我对基于云计算的图书馆应用系统进行了深入分析,由此,我对基于云计算的图书馆设计还有如下看法。

云计算数字图书馆实现以用户为核心的理念,极大地改善用户的体验。云计算在IT行业的应用正处在发展阶段。在图书馆的应用,先进性可从云终端的应用体现出来,云计算的出现,给图书馆的发展带来发展的空间,云计算技术的应用给图书馆的发展也带来了创新发展的机遇,任何一项技术都不是完美无缺的, 在应用的过程中,技术的不足就和技术的先进性一样能激发人们改进和完善的想象力和创造力,技术是给人服务的,而图书馆的服务也同样因为新技术而发生变化,在科学的研究和合理的应用后,技术必然会给我们的服务带来巨大的推动作用。

云计算技术的魅力, 在图书馆的服务中尤其能得到展示和认可,云服务改变了图书馆服务的模式,给图书馆的服务带来了积极的影响,特别是给读者带来了极大的方便,但是图书馆人不能仅仅只是依赖、依靠技术,技术是我们服务的手段,只有在图书馆的服务中,才能去检验其带给我们的发展和变化,技术本身也才能得到完善和发展。

 

 

 参考文献

[1]李军.大数据:从海量到精准[M].北京:清华大学出版社,2014

[2]赵勇.架构大数据-大数据技术及算法解析[M].北京:电子工业出版社,2015.6

[3]王宏志.大数据算法[M].北京:机械工业出版社,2015.7

[4]Alex Holmes.Hadoop硬实战[M].北京:电子工业出版社,2015.1

[5]万川梅,谢正兰.Hadoop应用开发实战详解[M].北京:中国铁道出版社,2014.8
[6]郭红英.云计算环境下高校图书馆用户服务模式发展研究.图书馆理论与实践[J].2011年第2 期:84-85. 

[7]李永先,栾旭伦,李森森.云计算技术在图书馆中的应用探讨[J].江西图书馆学刊.2009(1):105-106. 

[8]胡小菁,范并思.云计算给图书馆管理带来挑战.大学图书馆学报,2009(4)

[9]卢晓娟.云计算与未来图书馆数字信息资源建设[J].四川图书馆学报.2009(2):23-24 

[10]陈康,郑纬民.云计算:系统实例与研究现状[J].软件学报.2009.20(5 ): 1337-1348








  • 10
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Summer tree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值