分布式搜索引擎設計與實現
 
  一、分布式爬蟲設計
 
  本研究中,分布式爬蟲采用mater-slave模式,通過mater對slaves的主機進行信息傳遞與資源分配。首先Slave需要爬取網頁的源代碼,并從中取出需要爬取的url加人爬取隊列中;其次對爬取到的url進行去重,保證沒有重復的爬取。通過對master和slaves的分工設定,可以很好地解決這個資源搶占的矛盾。
 
分布式爬蟲的工作流程
  分布式爬蟲的工作流程如圖1所示。首先,事先設定需要爬取的起始網頁url;然后將起始url寫人隊列srq中,供slave讀取分析。slave的工作流程如下:
 
  1、從、rq隊列中爬取到url。
 
  2、對url進行訪問,如果url的服務器能夠訪問,下載網頁文本,并將網頁文本存儲到數據庫中。
 
  3、對網頁文本內容進行分析,抓取其中格式正確并且符合預先設定的抓取要求的url,將這些url寫入nrq隊列中。
 
  master工作流程的步驟有:①nrq隊列中取出一個url;②對url進行去重(使用Bloom filter) ;③對url格式進行判斷;④如果②、③的判斷都通過,則將該url寫人srq隊列中。
 
  二、分布式索引構建
 
  本研究以分布式方式構建索引,其思路是利用Redis隊列對數據進行并行運算,但與爬蟲的儲存控制有所不同。
 
  由于數據庫已經事先儲存了網頁信息,所以需要分析時爬蟲直接從數據庫讀取數據到一個隊列中,不再需要master對隊列進行控制。在slave中,slave利用分詞模塊對網頁進行分析,將網頁中某詞出現的網頁url編號,該詞在網頁中出現的頻度,打包成預定好的數據格式,存儲到分析結果隊列中,然后由master讀取。再由master統一對數據進行存儲操作以避免多主機對數據庫操作時造成的數據沖突。slave的核心結構如圖2所示。
slave的核心結構
 
 
  其中,salve首先通過隊列srq獲取需要進行分詞操作的文本;再通過隊列trq獲取唯一tag保證不予其它slave發生沖突;然后利用jieba分詞模塊對文本進行分詞;最后將分詞統計結果儲存在<key, value>數據塊中,并將該數據塊加人nrq隊列中,由master自行獲取。
Master的核心結構
 
  Master的核心結構如圖3所示。
 
  其中,master直接從nrq隊列獲取由slave運算得到的<key, value>數據塊,將其匯總到了數據庫。在本文研究中將Map-reduce思想應用到排序索引中,實現了分布式構建索引。
 
  三、分布式排序算法運算設計
 
  鏈接分析算法在運算時需要占用大量內存與時間,通過分布式系統的設計可以加快運算速度,以提高計算分析效率。本文研究利用了Map-reduce的思想以及基于Re-dis的隊列數據傳輸設計分布式排序算法。
 
  排序算法采用的是Pagerank,是通過計算網站間的相關度進行排序。如果一個網站被外鏈接的次數越多,說明這個網站越重要。Pagerank算法首先需要生成網站出度網址的矩陣,然后生成設定每個網址的初始rank,最后通過迭代運算得到最終排名圖。將Pagerank算法用到Map-reduce的思想中也能提高計算分析效率,分為兩個步驟:
 
  1、Map:將每次需要運算的數據打包成約定格式的數據。需要打包的數據有:PAGERANK每輪對應站點的運算結果;對應站點的url編號;對應站點的出度網頁編號。然后將這些數據包發送給slave運算。
 
  2、reduce;slave對收到的數據包進行解析,將Pager-ank值與其對應的url編號返回,由master對運算結果進行匯總,完成該輪的Pagerank運算。