摘" 要: 文中致力于開發(fā)一種基于資源感知的分布式爬蟲任務調(diào)度方法,以優(yōu)化分布式環(huán)境中各節(jié)點的系統(tǒng)資源利用,提升爬蟲任務的執(zhí)行效率。該方法通過引入資源感知調(diào)度算法和節(jié)點優(yōu)先級管理,實現(xiàn)對節(jié)點中CPU、內(nèi)存、網(wǎng)絡等資源的監(jiān)測,以便均衡調(diào)度爬蟲任務,即確保爬蟲任務在資源利用率較低的節(jié)點上執(zhí)行,從而有效減輕各個節(jié)點之間資源過度占用和不均衡問題。另外,該方法引入的Flask提高了可擴展性,實現(xiàn)了可視化爬蟲監(jiān)控平臺。實驗結果表明,文中提出的方法在提高爬蟲任務執(zhí)行效率和適應性方面取得了顯著效果,為分布式爬蟲系統(tǒng)的進一步優(yōu)化提供了有益指導。
關鍵詞: 分布式爬蟲; 任務調(diào)度; 資源感知; Flask; 數(shù)據(jù)采集; 資源利用率
中圖分類號: TN919?34; TP303; TP333""""""""""""" 文獻標識碼: A"""""""""""""""" 文章編號: 1004?373X(2024)09?0086?05
0" 引" 言
隨著互聯(lián)網(wǎng)的迅猛發(fā)展,數(shù)據(jù)量呈爆炸性增長。巨大的數(shù)據(jù)量是數(shù)字時代的寶貴信息資源,各行各業(yè)通過整理和分析自身數(shù)據(jù)倉庫以及外部數(shù)據(jù),以洞察行業(yè)趨勢,分析消費者行為,并利用數(shù)據(jù)解決問題[1]。為了有效獲取特定信息和精準數(shù)據(jù),“網(wǎng)絡爬蟲”(Web Crawler)[2]技術應運而生,它是一種數(shù)據(jù)采集技術,其目標是自動遍歷并提取互聯(lián)網(wǎng)上公開、合法的數(shù)據(jù)。
然而,隨著網(wǎng)頁數(shù)量和數(shù)據(jù)規(guī)模的指數(shù)級增長,傳統(tǒng)的單機爬蟲效率已經(jīng)無法滿足需求,因此需要將其擴展為分布式爬蟲以提高數(shù)據(jù)采集效率[3?4]。目前的分布式爬蟲框架主要采用主從模式設計,由一個主節(jié)點和多個子節(jié)點組成,主節(jié)點負責控制子節(jié)點并向其分發(fā)爬蟲任務。常見的分布式爬蟲框架包括PySpider、Scrapy?Redis[5]、Apache Nutch等,它們通常具備豐富的數(shù)據(jù)采集功能、完善的軟件生態(tài)和高度的可擴展性等優(yōu)勢。
在當前分布式爬蟲技術研究中,一些優(yōu)化方法已經(jīng)涌現(xiàn),如網(wǎng)絡負載均衡、分布式隊列優(yōu)化等。然而,節(jié)點的CPU、運行內(nèi)存等系統(tǒng)資源利用率也是影響爬蟲任務執(zhí)行效率的關鍵因素。因此,本文從節(jié)點的系統(tǒng)資源利用率出發(fā),提出了一種基于資源感知的分布式爬蟲任務調(diào)度方法。在該方法中,主節(jié)點會實時監(jiān)測子節(jié)點的CPU、運行內(nèi)存、網(wǎng)絡等資源利用率,并根據(jù)資源利用率對節(jié)點進行優(yōu)先級動態(tài)排序,資源利用率低的節(jié)點將優(yōu)先調(diào)度爬蟲任務。通過該方法實現(xiàn)各個節(jié)點的資源負載均衡。實驗證明,這種任務調(diào)度方法能夠提高分布式爬蟲任務的執(zhí)行效率。此外,本文還采用Flask[6]框架作為節(jié)點間的通信工具,并利用其RESTful API特性進一步將該任務調(diào)度方法擴展為一個可視化的分布式爬蟲控制平臺。
1" 相關工作
隨著互聯(lián)網(wǎng)的發(fā)展和數(shù)據(jù)量的增長,傳統(tǒng)分布式爬蟲執(zhí)行效率將面臨嚴峻的挑戰(zhàn),為了克服這些挑戰(zhàn),研究者們提出了各種創(chuàng)新性的方法和框架。
文獻[7]提出了使用AWS的混合P2P網(wǎng)絡分布式網(wǎng)絡爬蟲(Hybrid P2P Networking Distributed Web Crawler Using AWS, HP2PNC?AWS)。HP2PNC?AWS利用亞馬遜網(wǎng)絡服務(AWS)的云服務平臺,以應對傳統(tǒng)網(wǎng)絡爬蟲在面對高流量的挑戰(zhàn)。在收集新聞數(shù)據(jù)方面,HP2PNC?AWS表現(xiàn)出極佳的性能,比常規(guī)的Web爬蟲程序快,但是比服務器/客戶端分布式Web爬蟲程序略慢,特別是在爬蟲程序被服務端阻止的情況下。然而,HP2PNC?AWS有利于增強網(wǎng)絡爬蟲執(zhí)行效率。
文獻[8]提出了一種基于分布式的網(wǎng)絡爬蟲技術,以實現(xiàn)對大量數(shù)據(jù)在網(wǎng)頁上的自動收集、解析和格式化存儲。該技術采用了Nutch爬蟲框架、Zookeeper分布式協(xié)調(diào)服務和高性能的Key?Value數(shù)據(jù)庫Redis用于數(shù)據(jù)存儲,同時利用Solr引擎對抓取的信息進行索引和展示。通過優(yōu)化提取頁面信息算法和關鍵詞匹配算法,實現(xiàn)了對抓取的數(shù)據(jù)進行指標相關數(shù)據(jù)的提取。
文獻[9]提出了一種基于Django的分布式爬蟲框架設計方法,以優(yōu)化分布式爬蟲框架的性能并擴展其功能。該框架引入了爬蟲任務隊列技術,實現(xiàn)了在爬蟲運行過程中隨時更新爬蟲代碼時可自動重新載入的功能,同時能夠接著從中斷點繼續(xù)執(zhí)行任務,解決了重新載入程序過程中丟失之前數(shù)據(jù)的問題。
文獻[10]采用對等式架構的爬行器,使任務既是消費者又是生產(chǎn)者,提出了本地執(zhí)行任務的優(yōu)化方向。該方法借助雙緩沖技術實現(xiàn)動態(tài)負載均衡策略和基于高速緩存原理的URL(Uniform Resource Locator)判重方案,成功降低了通信頻次并提升了URL判重性能,使分布式系統(tǒng)的性能優(yōu)勢得到更充分的發(fā)揮。
文獻[11]探討了使用主題爬蟲的Web信息數(shù)據(jù)挖掘,介紹了Web信息搜索和數(shù)據(jù)挖掘的體系結構以及關鍵技術和操作原理。他們強調(diào)了爬蟲獨有的特性和應用,介紹了爬蟲的工作原理和實現(xiàn)方法,并對其性能進行了分析。實驗結果表明,該爬蟲能夠在萬維網(wǎng)上收集各種信息資源,有助于網(wǎng)絡文化內(nèi)容的監(jiān)控和管理。此外,他們利用爬蟲技術將整個網(wǎng)絡集成到數(shù)據(jù)倉庫,實現(xiàn)了全面的網(wǎng)絡內(nèi)容采樣、審計和監(jiān)控,以增強網(wǎng)絡文化中的安全性。
文獻[12]分析了在網(wǎng)絡上組織用戶搜索信息面臨的挑戰(zhàn),并深入探討了深度網(wǎng)絡層次的動態(tài)特性,提出了一種新的兩階段深度學習數(shù)據(jù)爬蟲框架(Novel and Efficient Two?phase Deep Learning Data Crawler Framewor,NTPDCF)。NTPDCF通過搜索引擎收集準確的鏈接,并使用自適應網(wǎng)站排名來探索相關網(wǎng)站鏈接,考慮了用戶偏好、動態(tài)特征和自適應權重,能夠進行有效的數(shù)據(jù)探索。
2" 研究框架
2.1" Scrapy?Redis
作為一種開源數(shù)據(jù)庫,Redis[13]支持多種豐富的數(shù)據(jù)結構存儲,包括字符串、哈希表、列表、集合、有序集合等。而Scrapy引擎(Scrapy Engine)負責管理整個爬蟲系統(tǒng)的數(shù)據(jù)流,根據(jù)不同的處理目標將任務分發(fā)給不同的組件。如圖1所示,Scrapy?Redis架構將Scrapy與Redis進行整合,并采用了類似主從模式的設計,實現(xiàn)了多個爬蟲節(jié)點之間的任務調(diào)度和協(xié)同工作。
圖1中,Redis被視為主節(jié)點,其他子節(jié)點從Redis中讀取爬蟲任務。調(diào)度器(Scheduler)負責接收來自Scrapy引擎的請求,并對這些請求進行隊列化。下載器(Downloader)負責從互聯(lián)網(wǎng)上獲取任務目標Web,并將其返回給Scrapy引擎進行處理。蜘蛛(Spiders)根據(jù)Scrapy引擎分發(fā)的Web執(zhí)行不同的數(shù)據(jù)采集功能,而項目管道(Item Pipeline)則負責處理蜘蛛采集的數(shù)據(jù),包括解析數(shù)據(jù)、清洗數(shù)據(jù)和存儲數(shù)據(jù)等操作。在Scrapy?Redis架構中,每個爬蟲節(jié)點都能獨立運行,從而提高了整個架構的伸縮性、可擴展性,以及數(shù)據(jù)采集效率。
2.2" Flask
Flask是一款輕量而靈活的Python Web框架,包括多個組件,比如路由、視圖函數(shù)以及Web服務器網(wǎng)關接口(Web Server Gateway Interface, WSGI)等,可以降低Web應用設計的成本,其框架如圖2所示。在該框架中,客戶端首先發(fā)起網(wǎng)絡請求,并由Werkzeug提供的WSGI進行處理;接著,F(xiàn)lask應用程序(由Python構建)處理請求;最后,通過WSGI將結果返回給客戶端。作為微框架,F(xiàn)lask并未引入過多的開發(fā)限制,而是提供了基本的Web構建工具,實現(xiàn)了Web應用的快速構建,同時保持了極大的自由度和靈活性。
3" 資源感知的任務調(diào)度設計
3.1" 設計動機
在每臺節(jié)點機器中,爬蟲任務通常是重復、多次、持久的應用程序。長時間運行的任務會導致系統(tǒng)的CPU、運行內(nèi)存、網(wǎng)絡等資源處于高負荷使用狀態(tài)。盡管網(wǎng)絡資源對于爬蟲任務的執(zhí)行效率至關重要,但其他系統(tǒng)資源也會顯著影響任務的執(zhí)行效率。例如,CPU和運行內(nèi)存限制了可并發(fā)執(zhí)行的線程數(shù)量,以及臨時數(shù)據(jù)存取或數(shù)據(jù)交換。與Scrapy?Redis這類分布式爬蟲框架類似,每個節(jié)點中的爬蟲系統(tǒng)負責執(zhí)行從Redis返回的任務。然而,在實際的分布式爬蟲任務執(zhí)行中,每個節(jié)點將承擔不同的資源負載[14?15],隨著時間推移,每個節(jié)點的資源負載可能存在較大差異,例如,某些節(jié)點可能長時間高負荷運行,而其他節(jié)點可能有相當一部分系統(tǒng)資源處于空閑狀態(tài)。
圖3展示了Scrapy?Redis運行時每個節(jié)點可能的系統(tǒng)資源使用情況。假設當前的主節(jié)點為Redis,并在4個子節(jié)點Node 1、Node 2、Node 3和Node 4上運行爬蟲任務。在[T1]時刻,Node 1和Node 4的平均資源利用率分別高達80%和91.7%,而Node 2和Node 3的平均資源利用率則保持在73.4%和76.7%。此時,Node 1和Node 4不應該再繼續(xù)執(zhí)行爬蟲任務,而應該等待這兩個節(jié)點正在執(zhí)行中的爬蟲任務結束后再進行爬蟲任務調(diào)度。在[T2]時刻,如果在Node 1和Node 4上保持爬蟲任務調(diào)度,它們的資源利用率會達到峰值,相反,Node 2和Node 3則保持較低的資源利用率,這會導致節(jié)點的資源負載嚴重不均衡。
本文模擬了類似的實驗環(huán)境,將Node 1和Node 2的平均資源利用率控制在99.8%和12.9%,然后讓這兩個節(jié)點執(zhí)行相同的100個爬蟲任務,并統(tǒng)計這些爬蟲任務的響應時間(單位:ms),如圖4所示。
實驗結果表明,與Node 1相比,Node 2任務響應效率平均提高了22.6%。Node 1的資源使用接近峰值,導致了響應爬蟲任務的時間波動非常明顯,相反,Node 2的響應時間相對平穩(wěn)。
3.2" 任務調(diào)度架構
資源感知的爬蟲任務調(diào)度設計集中在充分利用分布式環(huán)境中的節(jié)點資源,以提高爬蟲任務執(zhí)行效率和系統(tǒng)可用性。圖5展示了基于資源感知的分布式爬蟲任務調(diào)度系統(tǒng)架構。該架構實時監(jiān)測各節(jié)點的CPU利用率、內(nèi)存占用和網(wǎng)絡帶寬等資源狀態(tài),根據(jù)資源利用率為每個節(jié)點確定執(zhí)行優(yōu)先級,并優(yōu)先選擇低優(yōu)先級的節(jié)點來執(zhí)行任務。節(jié)點的優(yōu)先級定義依賴于每個節(jié)點的資源利用率反饋,因此引入了Flask作為通信工具,以構建高效的節(jié)點間通信機制,實現(xiàn)即時獲取各節(jié)點資源利用率信息的目的。這一信息將用于動態(tài)調(diào)整節(jié)點優(yōu)先級,系統(tǒng)將優(yōu)先選擇資源利用率較低的節(jié)點執(zhí)行爬蟲任務,以最大化資源利用效益,具體操作如算法1所示。
算法1:優(yōu)先級排序
// NodePriority用于排序優(yōu)先級,同時用于后續(xù)的功能擴展
class NodePriority:
def_init_(self, nodeName, nodePriority):
self. nodeName = nodeName
self. nodePriority = nodePriority
def_lt_(self, other):
return self. nodePriority lt; other. nodePriority
//使用公式(1)計算每個節(jié)點的平均資源利用率
np = [NodePriority (\"node1\", 80), NodePriority (\"node2\", 70), NodePriority (\"node3\", 95)]
//利用sorted的從小到大排序功能,隊列化一個優(yōu)先級隊列
sorted_tasks = sorted(np)
此外,本文為所有的節(jié)點引入了一個資源利用率閾值,該閾值是靜態(tài)的,根據(jù)實驗經(jīng)驗,當節(jié)點的資源利用率達到90%后,節(jié)點不應繼續(xù)調(diào)度新的爬蟲任務。相反,應等待執(zhí)行中的爬蟲任務結束,并且節(jié)點的資源利用率下降至90%以下,然后再調(diào)度新的爬蟲任務。
同時,引入具有高度靈活性的Flask也使系統(tǒng)更具可擴展性,可以進一步將其擴展為一個可視化的分布式爬蟲監(jiān)控平臺。這一平臺不僅能夠展示各節(jié)點的資源利用率,還能實現(xiàn)對爬蟲任務的實時管理。通過該平臺,用戶可以方便地啟動、暫停、終止爬蟲任務,甚至動態(tài)增加節(jié)點以適應數(shù)據(jù)采集的需求。此外,本文還設計了Flask與數(shù)據(jù)庫的連接,能夠檢索采集的數(shù)據(jù)進行臨時審查,以及進行其他的數(shù)據(jù)操作。這種可視化監(jiān)控平臺將提供全面的任務管理和實時監(jiān)控功能,使得整個分布式爬蟲系統(tǒng)智能化程度更高且更具可操作性。
4" 資源感知的任務調(diào)度實驗
4.1" 實驗環(huán)境設置
本文搭建了一個爬蟲環(huán)境,以實現(xiàn)基于資源感知的分布式爬蟲任務調(diào)度系統(tǒng),其中涉及的算法和爬蟲均采用Python開發(fā)。為了更貼近實際的爬蟲任務運行環(huán)境,并與常規(guī)的分布式爬蟲架構進行區(qū)分,本文實驗將每個節(jié)點的初始平均資源利用率控制在一定范圍內(nèi),具體如表1所示。
4.2" 實驗結果與分析
本文對比了未優(yōu)化和采用資源感知任務調(diào)度的Scrapy?Redis,實驗對象的數(shù)據(jù)采集目標一致,執(zhí)行了多組爬蟲任務,每組包含多個子爬蟲任務,結果如圖6、圖7所示。
由圖6可知,對于目標網(wǎng)絡延遲較低、網(wǎng)頁解析較快、對CPU和內(nèi)存的依賴程度不高的情況,優(yōu)化后的效果并不明顯,大約提高了5%。
由圖7可知,對于目標網(wǎng)絡延遲較高、網(wǎng)頁解析較慢,對CPU、內(nèi)存資源的依賴程度更高的情況,基于資源感知的爬蟲任務調(diào)度顯著降低了爬蟲任務的執(zhí)行時間,大約提高了37%。
4.3" 可視化監(jiān)控平臺
Flask框架在基于資源感知的分布式爬蟲任務調(diào)度方法中有著不可或缺的作用。在本文方法中,F(xiàn)lask不僅是各個節(jié)點通信的重要工具,還為分布式爬蟲管理者提供了一個直觀、實時、全面了解各個節(jié)點的資源利用和數(shù)據(jù)采集情況的強大工具。該平臺的可視化界面如圖8所示??梢暬O(jiān)控平臺不僅僅是一個簡單的監(jiān)控系統(tǒng),更是一個智能化的分布式爬蟲工具,能夠展示各節(jié)點的CPU使用率、內(nèi)存占用率和網(wǎng)絡帶寬利用率等多維度性能指標。
可視化監(jiān)控平臺還提供了全部暫停、全部啟動、數(shù)據(jù)庫查詢、增加節(jié)點等功能。特別是節(jié)點增加功能,提高了本文提出的分布式爬蟲系統(tǒng)的可擴展性。在擴展時,本文采用了Docker容器技術[16],利用Docker實現(xiàn)了遠程啟動和一鍵部署爬蟲環(huán)境等功能。同時,可視化監(jiān)控平臺的所有請求也經(jīng)過修改后的AES加密[17],實現(xiàn)了密文傳輸。
5" 結" 論
本文提出了基于資源感知的分布式爬蟲任務調(diào)度方法,旨在有效利用分布式環(huán)境中各個節(jié)點的系統(tǒng)資源,提高爬蟲系統(tǒng)的性能和效率。通過采用資源感知的爬蟲任務調(diào)度算法和節(jié)點的優(yōu)先級管理,本文實現(xiàn)了各個節(jié)點的CPU、內(nèi)存、網(wǎng)絡等資源的合理負載,以確保爬蟲任務在資源利用率較低的節(jié)點上執(zhí)行,一定程度上緩解了節(jié)點資源過度占用和不均衡的情況。同時,本文還結合了Flask,確保了各個節(jié)點之間的連接通信,并且實現(xiàn)了可視化操作平臺,提高了該方法的可擴展性。實驗結果證明,該方法可以顯著提高分布式爬蟲任務執(zhí)行的效率。此外,該方法還可以與多線程和多進程等異步并發(fā)方案結合,進一步提高爬蟲任務調(diào)度的效率。
注:本文通訊作者為魏繼楨。
參考文獻
[1] 馬捷,郝志遠,李麗華,等.數(shù)字化轉型視域下的數(shù)據(jù)價值研究綜述:內(nèi)涵闡述、作用機制、場景應用與數(shù)據(jù)創(chuàng)新[J].圖書情報工作,2023,67(15):4?13.
[2] 李培.基于Python的網(wǎng)絡爬蟲與反爬蟲技術研究[J].計算機與數(shù)字工程,2019,47(6):1415?1420.
[3] 潘曉英,陳柳,余慧敏,等.主題爬蟲技術研究綜述[J].計算機應用研究,2020,37(4):961?965.
[4] 曾健榮,張仰森,鄭佳,等.面向多數(shù)據(jù)源的網(wǎng)絡爬蟲實現(xiàn)技術及應用[J].計算機科學,2019,46(5):304?309.
[5] 韓貝,馬明棟,王得玉.基于Scrapy框架的爬蟲和反爬蟲研究[J].計算機技術與發(fā)展,2019,29(2):139?142.
[6] 牛作東,李捍東.基于Python與flask工具搭建可高效開發(fā)的實用型MVC框架[J].計算機應用與軟件,2019,36(7):21?25.
[7] KIM Y Y, KIM Y K, KIM D S, et al. Implementation of hybrid P2P networking distributed web crawler using AWS for smart work news big data [J]. Peer?to?peer networking and application, 2020, 13(1): 659?670.
[8] 馬蕾,馮錫煒,竇予梓,等.分布式爬蟲的研究與實現(xiàn)[J].計算機技術與發(fā)展,2020,30(2):192?196.
[9] 趙宸,劉建華.基于Django的分布式爬蟲框架設計與實現(xiàn)[J].計算機與數(shù)字工程,2020,48(10):2495?2498.
[10] 盧照,師軍,張耀午,等.基于雙緩沖的分布式爬蟲調(diào)度策略的設計與研究[J].計算機與數(shù)字工程,2022,50(8):1686?1690.
[11] GUO H J. Research on Web data mining based on topic crawler [J]. Journal of Web engineering, 2021, 20(4): 1193?1205.
[12] MURUGUDU M R, REDDY L S S. Efficiently harvesting deep web interfaces based on adaptive learning using two?phase data crawler framework [J]. Soft computing, 2023, 27(1): 505?515.
[13] 張杰,劉凱,周立軍.采用Redis高并發(fā)應用系統(tǒng)設計與實現(xiàn)方法[J].計算機與數(shù)字工程,2020,48(5):1222?1226.
[14] 曾磊,白金明,劉琦.多群落粒子群優(yōu)化供應鏈數(shù)據(jù)中心任務調(diào)度[J].應用科學學報,2023,41(3):419?430.
[15] 吳傳峰,朱偉.一種面向完成時間與負載均衡的任務調(diào)度算法[J].指揮控制與仿真,2023,45(2):82?87.
[16] 吳逸文,張洋,王濤,等.從Docker容器看容器技術的發(fā)展:一種系統(tǒng)文獻綜述的視角[J].軟件學報,2023,34(12):5527?5551.
[17] 李昭容.數(shù)據(jù)加密技術在計算機網(wǎng)絡安全中的應用研究[J].信息與電腦(理論版),2023,35(15):13?16.
Method of distributed crawler task scheduling based on resource awareness
ZHANG Jun, WEI Jizhen, LI Yubin
(School of Information Engineering, East China University of Technology, Nanchang 330013, China)
Abstract: This paper aims to develop a distributed crawler task scheduling method based on resource awareness, so as to optimize the system resource utilization of each node in a distributed environment and improve the execution efficiency of crawler task. By introducing resource awareness scheduling algorithm and node priority management, the monitoring of resources of CPU, memory and network in nodes is achieved to balance the scheduling of crawler task, that is, to ensure that crawler tasks are executed on nodes with low resource utilization, so as to effectively relieve the excessive resource occupation and imbalance among nodes. In addition, the introduction of Flask has improved the scalability of the method and achieved a visual crawler monitoring platform. Experimental results show that the proposed method can achieve significant results in improving the efficiency and adaptability of crawler task execution, which provides useful guidance for the further optimization of distributed crawler systems.
Keywords: distributed crawler; task scheduling; resource awareness; Flask; data collection; resource utilization rate
DOI:10.16652/j.issn.1004?373x.2024.09.016
引用格式:張軍,魏繼楨,李鈺彬.基于資源感知的分布式爬蟲任務調(diào)度方法[J].現(xiàn)代電子技術,2024,47(9):86?90.
收稿日期:2024?01?17"""""""""" 修回日期:2024?02?05
基金項目:國家自然科學基金資助項目(62162002);國家自然科學基金資助項目(61662002);江西省自然科學基金資助項目(20212BAB202002)
張" 軍,等:基于資源感知的分布式爬蟲任務調(diào)度方法
張" 軍,等:基于資源感知的分布式爬蟲任務調(diào)度方法
作者簡介:張" 軍(1978—),男,湖南常德人,博士,教授,主要研究方向為處理器/存儲器性能功耗優(yōu)化、大數(shù)據(jù)技術原理與應用、自然語言處理。
魏繼楨(1998—),男,江西吉安人,碩士研究生,研究方向為GPGPU微體系結構、并行計算。
李鈺彬(1998—),女,廣東韶關人,碩士研究生,研究方向為學圖像處理、自然語言處理。