摘要:由于互联网具有海量信息并且快速增长,提高搜索引擎的信息采集器Web Spider的数据采集和更新速度有重要意义。本文利用ProActive网格网络并行分布计算中间件提供的主动对象(Active Object)技术、网络并行计算技术、自动部署机制等设计和实现了一个名为P-Spider的分布式并行Web Spider,实验表明该Web Spider方便管理和部署,并且比多线程Web Spider具有更高的采集速率。
关键字:Web Spider,ProActive,并行,分布式
0 引 言
Web Spider是一种自动下载网页的程序,一般用于搜索引擎。Web Spider在搜索引擎中负责采集信息,它依靠网页之间的链接关系遍历互联网,把分散存储在互联网上的信息下载到本地,以便于搜索引擎对这些数据进行分类索引。由于互联网信息量快速增长,这就要求Web Spider要有更快的采集和更新速度。在单机上使用多线程技术能够在一定程度上提高采集速度,但由于单机计算资源有限,通过多线程技术提高速率也是有限的。采用多机分布式并行结构,增加处理机和网络接口数量,能比单机多线程更加显著地提升Web Spider的采集效率。
在分布式并行计算方面,传统的基于MPI的技术具有程序可移植性差和配置复杂等不足。如果直接用java开发,在多线程和分布式java应用程序之间还存在很大的缝隙,而且为了在多线程应用程序上构建分布式应用程序而禁止了代码重用,例如javaRMI和javaIDL。为了实现把本地对象转化成可用的远程对象,要求编程人员对库中现有代码做较大修改,这给编程人员增加了很大的负担。ProActive中间件是一个基于java的分布并行软件包,具有java良好的兼容性和面向对象的可重用性,用其设计开发分布式并行程序可以很好的弥补这些不足。ProActive还提供了使用各种网络网格中间件的接口,能方便的在网络网格环境下进行部署,使得ProActive在开发分布式并行Web Spider方面更具有独特的优势。
我们利用ProActive网格网络并行分布计算中间件的主动对象(Active Object)技术、网络并行计算技术、自动部署机制等设计和实现了一个名为P-Spider的基于ProActive的分布式并行Web Spider,实验表明该Web Spider方便管理和部署,并且比多线程Web Spider具有更高的采集速率。
1 ProAcitive
ProActive是一个由法国的INIRA的Denis Caromel教授带领的开发小组开发的适合并行、分布和并发计算,在统一框架具有的移动性和安全性的java开源开发包,是ObjectWeb consortium 开源中间件的一部分,具有如下主要特性:
1.1 主动对象
主动对象(Active Object, AO)是ProActive计算概念的核心。它包括一个远程对象和一个线程。这个线程控制主动对象的活动,以及和其他已经部署好的主动对象协同工作。主动对象是在标准对象的基础上增加了位置透明、活动透明和同步三种功能。主动对象的通讯默认是异步模式的。一个主动对象包括一个主要的对象、一个线程、待处理请求队列。
1.2异步调用
ProActive对主动对象的异步调用是通过Future对象来实现的。Future对象是ProActive中为方法调用时自动产生表示调用的返回结果的对象。ProActive采用一种Wait-by-necessity方式来解决内部对象的同步,其思想如下:生成Future对象后可继续往下执行,除非是直接对Future对象的引用,才会自动停下等待,直到Future对象得到具体数值。Future对象的值变为可用时,会自动得到更新。
1.3 Type Group
所谓Type Group就是具有相同类型的主动对象的群,可以向普通对象一样调用其中的群方法。Typed Group群通信是建立在ProActive异步远程方法调用基础之上的,可以实现一次调用多个AO操作。如果有返回值,结果也是一个群。
1.4节点的部署
开发分布式应用程序的时候,计算节点的部署往往是比较麻烦的。ProActive开发包提供了强大的XML部署描述器,可方便的开发实现计算节点的部署。ProActive的部署文件是一个XML类型文件,它主要由三个部分构成:componentDefinition、deployment及infrastructure。用来提供虚拟节点(VirtualNode,简称VN)、 Java虚拟机(JVM)及节点(Node)的映射关系信息。ProActive在程序运行时从部署文件获取结点部署信息。
2 P-Spider的设计与实现
2.1 P-Spider的系统框架
P-Spider采用分布式并行设计方案。整个系统包括一个中心节点和若干个计算节点。中心节点作为协调器(SpiderCoordinator),计算节点作为多个爬行器(SpiderWorker)。协调器负责对整个系统的部署,管理和维护URL队列。爬行器(SpiderWorker)负责网页采集,分析和报告发现的URL等工作。协调器和爬行器通过高速局域网进行通信。整个系统框架如图1所示。
P-Spider的协调器(SpiderCoordinator)由两个部分组成,这两个部分分别被设计成Spider和SpiderWorkload两个主动对象。每个SpiderWorker也被设计成是一个主动对象。
Spider负责对系统进行部署和管理。首先根据配置文件创建虚拟节点(VN),在每台计算机上对应创建一个虚拟机(JVM)和一个节点(Node),然后,在各个作为计算节点的计算机上远程创建多个SpiderWorker主动对象,并且把所有的SpiderWorker定义为一个Type Group,接着用群方法调用启动所有的SpiderWorker,最后在采集任务结束后对各个SpiderWorker返回的统计数据进行汇总。SpiderWorkload负责维护URL队列。它接收SpiderWorker报告的URL,去除重复,并且把URL分派给各个SpiderWorker进行采集。SpiderWorker维护的URL队列是用Hash散列实现的。
每个计算节点上分派了多个SpiderWorker主动对象。SpiderWorker根据读取到的URL下载页面,然后解析页面的HTML,提取出其中包含的URL。将提取出来的URL链接按照预先定义的统一的格式补充完整(页面链接中给出的URL可以是多种格式的,可能是完整的、包括协议、站点和路径的,也可能是省略了部分内容的,或者是一个相对路径)。对这些URL进行过滤,如去除带“?”的搜索产生的URL等。最后,统计下载URL数量,报告新发现的URL。
由于主动对象具有的特性,对这些主动对象的方法调用,在形式上和对普通对象的方法调用是一致的。在调用的时候根本不用考虑对象在哪台计算机,哪个JVM和哪个Node上。设置好服务规则(默认是FIFO)后,也不用考虑具体的实现细节。因为主动对象提供服务是根据规则有序的,所以也不必考虑同步问题。
P-Spider的Spider类和SpiderWorker类主要算法描述如下:
public class Spider{
public void init(){
proActiveDescriptor = ProActive.getProactiveDescriptor("file:"+".//descriptors//spider.xml");
//为ProActiveDescriptor指定具体的部署文件,spider.xml为部署文件名
proActiveDescriptor.activateMappings();
//根据部署文件,启动虚拟机,创建Node
ProActive.turnActive(this);
// 将对象Spider变为主动对象
spiderworkgroup=(SpiderWorker)ProActiveGroup.newGroup(SpiderWorker.class.getName(),params,nodes);
//以数组params中的数据作为参数,生成SpiderWorker类的主动对象,主动对象个数等于params中的参数的组数。并且把这些主动对象部署到nodes中指定的各个节点上去。同时定义名为spiderworkgroup的Type Group。
IntWrapper pageCount=spiderworkgroup.startwork ();
//调用spiderworkgroup中每个主动对象的startwork()方法。定义返回值为pageCount。
ProActiveGroup.waitAll(pageCount);
//阻塞线程,等待群pageCount全部成员返回。
}
}
public class SpiderWorker {
public IntWrapper startwork(){
int count=0;//统计下载的URL数
while ((curUrl = dequeue(urlQueue))!=null) par-do{
//各个节点并行工作
page=downloadPage(formatUrl(curUrl));//下载
foundUrls=extractUrls(page);
//发现页面包含的URL
reportUrl(foundUrls);
//报告发现的URLs
count++;
}
return new IntWrapper(count);
//ProActive异步调用条件,要求返回包装类型(wrapper)
}
}
P-Spider在XML部署文件中的ComponentDefinition部分把整个系统定义成一个名为SpiderNode的VN。在Deployment部分为VN指定映射的JVM,中心节点和每个计算节点都映射一个JVM,每个JVM有一个Node。在Infrastructure中为每个JVM设置相关参数,指定中心节点JVM运行在本地,各个计算节点运行在远程机器,为本地JVM定义本地进程并指定org.objectweb.proactive.core.process.JVMNodeProcess为具体的执行类,为每个计算节点上运行JVM定义一个ssh远程进程,它引用了一个本地进程,执行类指定为org.objectweb.proactive.core.process.ssh.SSHProcess。中心节点通过ssh完成远程节点的部署。
这样的部署简单灵活,程序只要在中心节点读取部署文件就可以自动完成各个节点的部署,而不需要人工到各个计算节点去做任何工作。如果要增加或者减少计算节点的个数,只要对应修改部署文件就可以了。从而使P-Spider具有良好的可扩展性。
P-Spider在实现中引用了Jeff Heaton的bot包, bot包是单机环境下的一个多线程的Web Spider。为了验证P-Spider系统架构的有效性和分布并行的效果,我们用单机多线程的Spider和P-Spider做了对比实验。实验环境如下:4台CPU为Pentium4 2.4GHz,内存512MB的计算机,通过百兆局域网链接到Internet。软件环境为Linux Red Hat9、JDK1.5和ProActive3.1。
首先,我们使用一台计算机,用不同的线程数对校园网进行采集,根据得到的数据计算出下载速度和每秒下载URL数。实验程序使用bot包中的程序。在不同的时间重复实验两次取平均值,结果如表1所示。
然后,我们使用4台计算机,其中1台作为中心节点运行协调器,另外3台作为计算节点运行爬行器,对广西大学校园网进行采集实验,并使用ProActive提供的图形化监控工具IC2D对这个系统进行监视,监视结果如图2所示。与单机实验同样在不同的时间重复实验两次取平均值,结果如表2所示。
图2 P-Spider运行时IC2D监视结果 |
从实验结果可以看出,单机Spider并不能简单地通过增加线程数量而显著提高Spider的采集效率。这是因为,单机多线程并不是真正的并行,单机cpu的计算能力和内存等系统资源也十分有限,而且同步方法和一些独占资源也成了效率的瓶颈。分布式并行的P-Spider的测试采集效率是单机最好情况的2.2倍,之所以采集效率比单机多线程的Spider有显著的提高,主要有两个方面的原因,一方面是得益于处理机和网络接口数量的增加;另一方面得益于基于ProActive的系统架构,主动对象这种用Future对象来实现的异步调用机制在一定程度上减少了线程的等待,提高了P-Spider的采集效率。
本文结合ProActive中间件的特点介绍了由我们设计开发的分布式并行的P-Spider系统。ProActive使得P-Spider的设计和开发更加简单、方便、灵活,大大降低了设计开发的代价。通过实验证明了,基于ProActive的P-Spider对Web Spider的采集效率有较大提高,整体架构简洁有效。