李彥辰 艾慶忠 王少非
摘要:
針對(duì)互聯(lián)網(wǎng)網(wǎng)內(nèi)信息搜索效率低下問(wèn)題,設(shè)計(jì)了以Redis數(shù)據(jù)庫(kù)以及Mapreduce思想為核心的分布式搜索引擎框架。為了應(yīng)對(duì)互聯(lián)網(wǎng)信息時(shí)效性強(qiáng)、更新快、難以被準(zhǔn)確檢索的特點(diǎn),基于該框架設(shè)計(jì)了分布式爬蟲(chóng)、分布式索引建立、分布式鏈接分析算法。該框架明顯提高了信息處理的效率,為分布式搜索引擎的搭建提供有效模板。經(jīng)過(guò)測(cè)試,與以基于其它主流框架搭建分布式搜索引擎相比,基于Redis的分布式搜索引擎在爬蟲(chóng)爬取、索引生成、鏈接分析性能方面均有提升。
關(guān)鍵詞:
分布式搜索引擎;Redis數(shù)據(jù)庫(kù);Mapreduce思想
DOIDOI:10.11907/rjdk.172561
中圖分類號(hào):TP393
文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào)文章編號(hào):16727800(2018)003020104
英文摘要Abstract:To tackle the inefficiency of searching information through the Internet, a distributed search engine based on the Redis Data Base and mapreduce pattern was devised. To better adapt to the situation of the Internet at present, which is characterized by timesensitive,fastupdate and searching timeconsuming features, three techniques including distributed crawler, distributed index construction and distributed link analysis algorithm is applied within our distributed search engine. The framework greatly elevate the efficiency of the information processing and provide an effective template for the construction of the distributed search engine. After testing, compared with the search engines based on the other prevalent frameworks, the performances of three aspects including crawling, index generation and link analysis of the distributed search engine based on the Redis Data Base all have a obvious elevation.
英文關(guān)鍵詞Key Words:distributed search engine;redis data base;Mapreduce pattern
0引言
2015年2月發(fā)布的《第35次中國(guó)互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告》顯示,截至2014年12月,中國(guó)網(wǎng)站總數(shù)已達(dá)335萬(wàn)個(gè),年增長(zhǎng)4.6%;域名總數(shù)增至2 060萬(wàn)個(gè),年増長(zhǎng)11.7%;網(wǎng)頁(yè)數(shù)量為1899億個(gè),年増長(zhǎng)26.6%[1];網(wǎng)頁(yè)長(zhǎng)(總字節(jié)數(shù))達(dá)到8.468PB。如此巨大的互聯(lián)網(wǎng)數(shù)據(jù),使網(wǎng)絡(luò)爬蟲(chóng)對(duì)頁(yè)面采集性能與效率的要求也越來(lái)越高,因此,對(duì)網(wǎng)頁(yè)采集與鏈接關(guān)系的處理必須由多機(jī)并行完成。目前,國(guó)內(nèi)外大型互聯(lián)網(wǎng)公司與相關(guān)研究機(jī)構(gòu)(如Google、百度)在此問(wèn)題上已有一些較為成熟的解決方案,但是出于商業(yè)機(jī)密等因素考慮,這些方案一般只能為用戶提供一種不可定制的搜索服務(wù),且并未公開(kāi)。
本文通過(guò)研究搜索引擎基本體系機(jī)構(gòu)及分布式的思路與技術(shù),介紹了基于Redis的分布式搜索引擎框架,主要貢獻(xiàn)有:①總結(jié)了基于Mapreduce原理的分布式搜索引擎工作原理;②設(shè)計(jì)了基于Redis的高效分布式搜索引擎框架;③設(shè)計(jì)了基于該框架的分布式爬蟲(chóng)算法、索引算法、排序算法;④實(shí)驗(yàn)證明了該框架的可行性。
1搜索引擎相關(guān)性技術(shù)
1.1Mapreduce相關(guān)性研究
Mapreduce(映射/規(guī)約)理念在于將計(jì)算分為Map、reduce兩個(gè)過(guò)程,通過(guò)
1.2分布式網(wǎng)絡(luò)爬蟲(chóng)
分布式網(wǎng)絡(luò)爬蟲(chóng)整體設(shè)計(jì)重點(diǎn)在于爬蟲(chóng)如何進(jìn)行通信。目前按通信方式不同,分布式網(wǎng)絡(luò)爬蟲(chóng)可以分為主從模式、自治模式與混合模式3種[45],其中主從模式是搜索引擎常用模式。主從模式是指由一臺(tái)主機(jī)作為控制節(jié)點(diǎn)負(fù)責(zé)對(duì)所有運(yùn)行網(wǎng)絡(luò)爬蟲(chóng)的主機(jī)進(jìn)行管理,爬蟲(chóng)只需要從控制節(jié)點(diǎn)那里接收任務(wù),并把新生成任務(wù)提交給控制節(jié)點(diǎn)。在整個(gè)過(guò)程中不必與其它爬蟲(chóng)通信,這種方式實(shí)現(xiàn)簡(jiǎn)單,利于管理。而控制節(jié)點(diǎn)則需要與所有爬蟲(chóng)進(jìn)行通信,并用一個(gè)地址列表保存系統(tǒng)中所有爬蟲(chóng)信息。當(dāng)系統(tǒng)中爬蟲(chóng)數(shù)量發(fā)生變化時(shí),協(xié)調(diào)者需要更新地址列表里的數(shù)據(jù),這一過(guò)程對(duì)于系統(tǒng)中的爬蟲(chóng)是透明的。
1.3倒排索引
倒排索引(Inverted index)常被稱為反向索引、置入檔案或反向檔案,是一種索引方法,被用來(lái)存儲(chǔ)全文搜索中某個(gè)單詞在一個(gè)文檔或者一組文檔中存儲(chǔ)位置的映射[6]。它是文檔檢索系統(tǒng)中最常用的數(shù)據(jù)結(jié)構(gòu),通過(guò)倒排索引,可以根據(jù)關(guān)鍵詞快速獲取包含這個(gè)單詞的文檔列表。倒排索引主要由“單詞詞典”與“倒排文件”兩個(gè)部分組成。其主要思想是處理器得到一個(gè)網(wǎng)頁(yè)后,對(duì)該網(wǎng)頁(yè)進(jìn)行分析,對(duì)網(wǎng)頁(yè)中所有去停用詞后的詞語(yǔ)進(jìn)行分析,將其出現(xiàn)次數(shù)以及該網(wǎng)頁(yè)的url一同存儲(chǔ)入數(shù)據(jù)庫(kù),最終在數(shù)據(jù)庫(kù)中得到一個(gè)關(guān)鍵字key。其出現(xiàn)在網(wǎng)頁(yè)的url以及次數(shù)為value的數(shù)據(jù)庫(kù)文件,從而實(shí)現(xiàn)對(duì)所抓取網(wǎng)頁(yè)關(guān)鍵字的倒排索引構(gòu)建。
2分布式搜索引擎設(shè)計(jì)框架
本搜索引擎主要基于Redis,采用python編寫的主從模式分布式搜索引擎,利用Redis內(nèi)存高速存儲(chǔ)讀取信息的特點(diǎn)[78],通過(guò)Redis進(jìn)行各個(gè)主機(jī)進(jìn)程之間的信息通信,達(dá)到mater對(duì)slaves的命令傳輸控制。
本搜索引擎采用主從模式的分布式結(jié)構(gòu)。其中master命令主要以數(shù)據(jù)包的形式存儲(chǔ)在Redis數(shù)據(jù)庫(kù)中,slave通過(guò)對(duì)數(shù)據(jù)包的讀取分析,完成大量的數(shù)據(jù)運(yùn)算,降低mater的工作負(fù)擔(dān),然后將運(yùn)算結(jié)果傳遞給master。master只需要對(duì)slaves傳遞的信息進(jìn)行篩選與匯總,進(jìn)行任務(wù)的再分配,充分利用各個(gè)機(jī)器的性能,達(dá)到分布式運(yùn)算分析的目的,避免資源浪費(fèi),且構(gòu)成一個(gè)準(zhǔn)確高效的分布式整體[5]。
數(shù)據(jù)在redis服務(wù)器中以隊(duì)列的形式存儲(chǔ),master向隊(duì)列尾部添加數(shù)據(jù),slave從隊(duì)列頭部讀取數(shù)據(jù)。通過(guò)這樣的形式,一方面可以避免因資源競(jìng)爭(zhēng)而導(dǎo)致分布式系統(tǒng)死鎖,保證了程序的可行性;另一方面確保了資源能在有限的時(shí)間內(nèi)被讀取到,避免資源浪費(fèi)的情況發(fā)生。在redis數(shù)據(jù)庫(kù)中時(shí)常存在這樣3個(gè)隊(duì)列:
nrq= RedisQueue();
srq= RedisQueue();
trq=RedisQueue();
其中,nrq是需要被處理的數(shù)據(jù)隊(duì)列,sqr是已經(jīng)被處理的數(shù)據(jù)隊(duì)列,trq是存儲(chǔ)共享的tag隊(duì)列。Slave通過(guò)讀取trq隊(duì)列獲得當(dāng)前唯一的工作序號(hào)tag,nrq隊(duì)列中的數(shù)據(jù)出隊(duì)讓salve獲取,這樣的工作流程避免了資源搶占的沖突;然后slave運(yùn)算的結(jié)果會(huì)入隊(duì)存儲(chǔ)在srq中,再出隊(duì)到master,讓master進(jìn)行數(shù)據(jù)匯總,完成分布式系統(tǒng)的工作。通過(guò)以上系統(tǒng)機(jī)制,Mapreduce的實(shí)現(xiàn)也成為可能。master對(duì)數(shù)據(jù)進(jìn)行Map操作,將
3分布式搜索引擎設(shè)計(jì)與實(shí)現(xiàn)
3.1分布式爬蟲(chóng)設(shè)計(jì)
本研究中,分布式爬蟲(chóng)采用materslave模式,通過(guò)mater對(duì)slaves的主機(jī)進(jìn)行信息傳遞與資源分配。首先Slave需要爬取網(wǎng)頁(yè)的源代碼,并從中取出需要爬取的url加入爬取隊(duì)列中;其次對(duì)爬取到的url進(jìn)行去重,保證沒(méi)有重復(fù)的爬取。通過(guò)對(duì)master和slaves的分工設(shè)定,可以很好地解決這個(gè)資源搶占的矛盾。
分布式爬蟲(chóng)的工作流程如圖1所示。首先,事先設(shè)定需要爬取的起始網(wǎng)頁(yè)url;然后將起始url寫入隊(duì)列srq中,供slave讀取分析。slave的工作流程如下:
(1)從srq隊(duì)列中爬取到url。
(2)對(duì)url進(jìn)行訪問(wèn),如果url的服務(wù)器能夠訪問(wèn),下載網(wǎng)頁(yè)文本,并將網(wǎng)頁(yè)文本存儲(chǔ)到數(shù)據(jù)庫(kù)中。
(3)對(duì)網(wǎng)頁(yè)文本內(nèi)容進(jìn)行分析,抓取其中格式正確并且符合預(yù)先設(shè)定的抓取要求的url,將這些url寫入nrq隊(duì)列中。
master工作流程的步驟有:①nrq隊(duì)列中取出一個(gè)url;②對(duì)url進(jìn)行去重(使用Bloom filter);③對(duì)url格式進(jìn)行判斷;④如果②、③的判斷都通過(guò),則將該url寫入srq隊(duì)列中。
3.2分布式索引構(gòu)建
本研究以分布式方式構(gòu)建索引,其思路是利用Redis隊(duì)列對(duì)數(shù)據(jù)進(jìn)行并行運(yùn)算,但與爬蟲(chóng)的儲(chǔ)存控制有所不同。
由于數(shù)據(jù)庫(kù)已經(jīng)事先儲(chǔ)存了網(wǎng)頁(yè)信息,所以需要分析時(shí)爬蟲(chóng)直接從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)到一個(gè)隊(duì)列中,不再需要master對(duì)隊(duì)列進(jìn)行控制。在slave中,slave利用分詞模塊對(duì)網(wǎng)頁(yè)進(jìn)行分析,將網(wǎng)頁(yè)中某詞出現(xiàn)的網(wǎng)頁(yè)url編號(hào),該詞在網(wǎng)頁(yè)中出現(xiàn)的頻度,打包成預(yù)定好的數(shù)據(jù)格式,存儲(chǔ)到分析結(jié)果隊(duì)列中,然后由master讀取。再由master統(tǒng)一對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)操作以避免多主機(jī)對(duì)數(shù)據(jù)庫(kù)操作時(shí)造成的數(shù)據(jù)沖突。slave的核心結(jié)構(gòu)如圖2所示。
其中,salve首先通過(guò)隊(duì)列srq獲取需要進(jìn)行分詞操作的文本;再通過(guò)隊(duì)列trq獲取唯一tag保證不予其它slave發(fā)生沖突;然后利用jieba分詞模塊對(duì)文本進(jìn)行分詞;最后將分詞統(tǒng)計(jì)結(jié)果儲(chǔ)存在
Master的核心結(jié)構(gòu)如圖3所示。
其中,master直接從nrq隊(duì)列獲取由slave運(yùn)算得到的
3.3分布式排序算法運(yùn)算設(shè)計(jì)
鏈接分析算法在運(yùn)算時(shí)需要占用大量?jī)?nèi)存與時(shí)間,通過(guò)分布式系統(tǒng)的設(shè)計(jì)可以加快運(yùn)算速度,以提高計(jì)算分析效率。本文研究利用了Mapreduce的思想以及基于Redis的隊(duì)列數(shù)據(jù)傳輸設(shè)計(jì)分布式排序算法。
排序算法采用的是Pagerank,是通過(guò)計(jì)算網(wǎng)站間的相關(guān)度進(jìn)行排序。如果一個(gè)網(wǎng)站被外鏈接的次數(shù)越多,說(shuō)明這個(gè)網(wǎng)站越重要。Pagerank算法首先需要生成網(wǎng)站出度網(wǎng)址的矩陣,然后生成設(shè)定每個(gè)網(wǎng)址的初始rank,最后通過(guò)迭代運(yùn)算得到最終排名[9]。將Pagerank算法用到Mapreduce的思想中也能提高計(jì)算分析效率,分為兩個(gè)步驟:
(1)Map:將每次需要運(yùn)算的數(shù)據(jù)打包成約定格式的數(shù)據(jù)。需要打包的數(shù)據(jù)有:PAGERANK每輪對(duì)應(yīng)站點(diǎn)的運(yùn)算結(jié)果;對(duì)應(yīng)站點(diǎn)的url編號(hào);對(duì)應(yīng)站點(diǎn)的出度網(wǎng)頁(yè)編號(hào)。然后將這些數(shù)據(jù)包發(fā)送給slave運(yùn)算。
(2)reduce:slave對(duì)收到的數(shù)據(jù)包進(jìn)行解析,將Pagerank值與其對(duì)應(yīng)的url編號(hào)返回,由master對(duì)運(yùn)算結(jié)果進(jìn)行匯總,完成該輪的Pagerank運(yùn)算。
4分布式搜索引擎性能檢驗(yàn)
4.1分布式爬蟲(chóng)性能檢驗(yàn)
為了測(cè)試分布式爬蟲(chóng)的性能,在本研究中通過(guò)給定爬取起始網(wǎng)頁(yè)以及爬取深度,測(cè)試不同數(shù)量的slave對(duì)于爬蟲(chóng)性能提升的額度。
在開(kāi)啟1個(gè)slave的情況下,起始種子url為http://zsb.jlu.edu.cn/list/45.html,數(shù)據(jù)在MYSQL數(shù)據(jù)庫(kù)中存儲(chǔ)。其中,網(wǎng)頁(yè)id為INT型,占4字節(jié);網(wǎng)頁(yè)url為VARCHAR類型;網(wǎng)頁(yè)內(nèi)容為L(zhǎng)ONGTEXT類型。
對(duì)于深度為2的爬取設(shè)定,爬取708個(gè)網(wǎng)頁(yè),占25 600KB,平均速度為5.385個(gè)/s;在開(kāi)啟2個(gè)slave的情況下,速度達(dá)到了10.992 個(gè)/s;在開(kāi)啟3個(gè)slave的情況下,速度達(dá)到了14.118個(gè)/s;在開(kāi)啟4個(gè)slave的情況下,速度達(dá)到了17.079 個(gè)/s。由此可以看出網(wǎng)頁(yè)的爬取速度與slave的數(shù)量成正比,但是,隨著slave數(shù)量的增加,爬取速度增加的速率也會(huì)降低。當(dāng)slave的數(shù)量增加到一定大小時(shí),繼續(xù)增加slave的數(shù)量將不會(huì)加快爬取速度。由于本研究使用2臺(tái)主機(jī)導(dǎo)致爬去速度相對(duì)較慢,在實(shí)際應(yīng)用中,slave分布在多個(gè)主機(jī)上,爬取速度會(huì)比實(shí)驗(yàn)中的更快。slave的上限數(shù)是由master主機(jī)性能決定的,master主機(jī)的性能越強(qiáng)大,slave數(shù)的上限也會(huì)越大。
4.2分布式索引生成性能檢驗(yàn)
通過(guò)觀察固定數(shù)量網(wǎng)頁(yè)文本量,不同slave數(shù)量對(duì)于檢驗(yàn)索引生成速度存在差異。如4.2中所述,數(shù)據(jù)量為25 600KB,對(duì)于不同數(shù)量的slave分析文本速度進(jìn)行統(tǒng)計(jì)。在1個(gè)slave的情況下,速度為4.262個(gè)/s;2個(gè)slave的情況下速度為6.661個(gè)/s;3個(gè)slave的情況下速度為7.775個(gè)/s;4個(gè)slave的情況下速度為8.514個(gè)/s。由此可以看出對(duì)于索引生成的速度圖線平均斜率比爬蟲(chóng)的要小,主要原理是此算法對(duì)master的運(yùn)算負(fù)擔(dān)比較大,使用性能較強(qiáng)大的主機(jī)可以改善該問(wèn)題。
4.3PAGERANK分布式算法性能檢驗(yàn)
本研究以jlu.edu域名下的網(wǎng)站為分析源,分析Pagerank算法的性能。共有35 602個(gè)站點(diǎn),同樣使用不同數(shù)量的slave分析其分布式排序性能。在1個(gè)slave的情況下使用963.955s計(jì)算;在2個(gè)slave的情況下使用754.473s;在3個(gè)slave的情況下使用648.617s;在4個(gè)slave的情況下使用584.876s。由此可以看出隨著slave數(shù)量的增加,在網(wǎng)頁(yè)總數(shù)一定的情況下,Pagerank的計(jì)算速度有較為明顯的提高,說(shuō)明本研究的分布式系統(tǒng)能夠有效加快排序算法的運(yùn)算速度。
4.4兩種引擎效果對(duì)比
Apache Nutch是以Hadoop為基礎(chǔ)實(shí)現(xiàn)的分布式系統(tǒng),具有以Hadoop為基礎(chǔ)編寫的分布式搜索引擎的代表性[11]。因此通過(guò)與基于Apache Nutch的分布式搜索引擎進(jìn)行對(duì)比,分析本研究的框架優(yōu)勢(shì)。
在該實(shí)驗(yàn)中,分別對(duì)網(wǎng)頁(yè)爬蟲(chóng)爬取的IO密集型操作及Pagerank計(jì)算的運(yùn)算密集型操作進(jìn)行實(shí)驗(yàn),實(shí)驗(yàn)主機(jī)數(shù)量均為3臺(tái)。
由此可以觀察到兩者的速度不相上下,證明了基于Redis的分布式系統(tǒng)在爬蟲(chóng)上的速度與基于Hadoop的分布式系統(tǒng)在爬蟲(chóng)上的速度是可以相提并論的。爬蟲(chóng)速度如圖4所示。
在Pageranke算法的計(jì)算上,運(yùn)算結(jié)果如圖5所示。
可見(jiàn)在Pagerank算法上計(jì)算Redis分布式優(yōu)于基于Hadoop集群分布式,Redis分布式在構(gòu)建分布式搜索引擎上比Hadoop集群更有優(yōu)勢(shì)。
5結(jié)語(yǔ)
本文主要研究了基于Redis的分布式搜索引擎,討論了在實(shí)際互聯(lián)網(wǎng)環(huán)境中的實(shí)踐效果以及可行性,包括基于Redis數(shù)據(jù)庫(kù)的分布式搜索引擎的框架設(shè)計(jì)、主從模式分布式爬蟲(chóng)的設(shè)計(jì)框架、排序索引的分布式生成、基于Mapreduce思想的分布式的Pagerank計(jì)算的實(shí)現(xiàn)框架,并實(shí)驗(yàn)證明了運(yùn)用分布式搜索引擎后在抓取網(wǎng)頁(yè),建立搜索引擎索引,Pagerank鏈接分析算法運(yùn)算在這幾個(gè)方面的性能提升,證明了本系統(tǒng)在分布式搜索引擎系統(tǒng)上的應(yīng)用優(yōu)于Hadoop集群系統(tǒng)。未來(lái)基于該框架應(yīng)當(dāng)能夠發(fā)展出更加完善的分布式搜索引擎。
參考文獻(xiàn)參考文獻(xiàn):
[1]BRIN S, PAGE L. Reprint of the anatomy of a largescale hypertextual web search engine[J]. Computer networks, 2012,56(18):38253833.
[2]李明,唐軼.基于移動(dòng)Agent的分布式Web搜索模型的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2016,33(4):1821.
[3]DEAN J, GHEMAWAT S. MapReduce simplified data processing on large clusters[J]. Communications of the ACM, 2008,51(1):107113.
[4]蘇旋.分布式網(wǎng)絡(luò)爬蟲(chóng)技術(shù)的研究與實(shí)現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2006.
[5]詹恒飛,楊岳湘,方宏.Nutch分布式網(wǎng)絡(luò)爬蟲(chóng)研究與優(yōu)化[J].計(jì)算機(jī)科學(xué)與探索,2011,5(1):6874.
[6]周海松,劉建明,李龍.基于Lucene的垂直搜索引擎研究與實(shí)現(xiàn)[J].桂林電子科技大學(xué)學(xué)報(bào),2014,34(3):226229.
[5]史寶明,賀元香,吳崇正.主題搜索引擎中爬蟲(chóng)搜索策略的研究[J].計(jì)算機(jī)工程與應(yīng)用,2014,50(2):116119.
[6]林子皓.主題爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2014(8):99102.
[7]成功,李小正,趙全軍.一種網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)中URL去重方法的研究[J].中國(guó)新技術(shù)新產(chǎn)品,2014(12):2323.
[8]吳寶貴,丁振國(guó).基于Map/Reduce的分布式搜索引擎研究[J].數(shù)據(jù)分析與知識(shí)發(fā)現(xiàn),2007,2(8):5255.
[9]PAGE L, BRIN S, MOTWANI R, et al. The pagerank citation ranking: bringing order to the web[J]. Stanford Digital Libraries Working Paper, 1998,9(1):114.
[10]HAVELIWALA T H. Topicsensitive pagerank[C]Proceedings of the 11th International Conference on World Wide Web. ACM, 2002.
[11]BORTHAKUR D. The hadoop distributed file system: architecture and design[J]. Hadoop Project Website, 2007,11: 21.
責(zé)任編輯(責(zé)任編輯:劉亭亭)