有這樣一個采集系統(tǒng)的需求,達(dá)成指標(biāo): 需要采集30萬關(guān)鍵詞的數(shù)據(jù) 、微博必須在一個小時采集到、覆蓋四大微博(新浪微博、騰訊微博、網(wǎng)易微博、搜狐微博)。為了節(jié)約客戶成本,硬件為普通服務(wù)器:E5200 雙核 2.5G cpu, 4 G DDR3 1333內(nèi)存,硬盤 500G SATA 7200轉(zhuǎn)硬盤。數(shù)據(jù)庫為mysql。在這樣的條件下我們能否實(shí)現(xiàn)這個系統(tǒng)目標(biāo)?當(dāng)然如果有更好的硬件不是這個文章闡述的內(nèi)容。現(xiàn)通過采集、存儲來說明一下如何實(shí)現(xiàn):
一、采集,目標(biāo)是在一個小時內(nèi)把30萬關(guān)鍵詞對應(yīng)的數(shù)據(jù)從四大微博采集下來,能夠使用的機(jī)器配置就是上面配置的普通服務(wù)器。采集服務(wù)器對硬盤沒有太多要求,屬于cpu密集型運(yùn)算,需耗費(fèi)一些內(nèi)存。評估下來硬件資源不是瓶頸,看下獲取數(shù)據(jù)的接口有什么問題?
1、通過各大微博的搜索api。就比如新浪微博API針對一個服務(wù)器IP的請求次數(shù),普通權(quán)限限制是一個小時1w次,最高權(quán)限合作授權(quán)一個小時4w次。使用應(yīng)用時還需要有足夠的用戶,單用戶每個應(yīng)用每小時訪問1000次,最高權(quán)限4w次需要40個用戶使用你的應(yīng)用。達(dá)到30w關(guān)鍵詞,至少需要8個應(yīng)用,如果每個關(guān)鍵詞需要訪問3頁,總共需要24個合作權(quán)限的應(yīng)用。實(shí)際操作我們是不可能為這個項(xiàng)目做到開發(fā)24個合作權(quán)限的應(yīng)用,所以這個方式不是很合適。新浪微博API限制參考鏈接。
2、通過各大微博的最新微博收集數(shù)據(jù),微博剛推出的時候,各大微博都有微博廣場,可以把最新的微博都收集下來,然后通過分詞,如果出現(xiàn)了30萬關(guān)鍵詞中的一個就留下,其他就丟棄掉。不過現(xiàn)在除了騰訊微博和搜狐微博有微博廣場類似的功能,新浪微博和網(wǎng)易微博已經(jīng)沒有這項(xiàng)功能了。另按照新浪微博之前公布的數(shù)據(jù),注冊用戶已經(jīng)超過5億,每小時超過1億條微博,如果全量采集對數(shù)據(jù)存儲是個大的考驗(yàn),也需要大量的系統(tǒng)資源,實(shí)際采集了一億條,也許就1000w條有用,浪費(fèi)了9000w條數(shù)據(jù)的資源。
3、通過各大微博的網(wǎng)頁搜索,可見即可抓的方式,結(jié)合反監(jiān)控系統(tǒng)模塊模擬人的正常行為操作,搜索30萬關(guān)鍵詞數(shù)據(jù),使資源最大化利用。為了保證在一個小時采集到,需要采用分布式多線程模式抓取,并發(fā)采集。并發(fā)的時候不能從同一個ip或者同一個ip網(wǎng)段出去,保證對方不會監(jiān)測到我們的爬蟲。
我們最后采用了第三種方式,目前運(yùn)行狀況為通過30w關(guān)鍵詞搜索得到的所有微博加在一起總量1000多w條每天,新浪和騰訊最多,新浪微博略勝一籌。使用了6臺普通PC服務(wù)器,就算一臺機(jī)器7000元,總共4萬元硬件設(shè)備解決采集硬件問題。整體部署圖為:

二、存儲,采集下來的數(shù)據(jù)如何處理?首先存儲采集數(shù)據(jù)是個密集寫的操作,普通硬盤是否能夠支持,mysql數(shù)據(jù)庫軟件能否支持,未來量突然增加如何應(yīng)對?再就是評估存儲空間,每天增量這么多需要耗費(fèi)大量的存儲資源,如何存放并且易擴(kuò)展。

1、如何存儲。正常來說我們上面配置的服務(wù)器,mysql使用myisam引擎一張表最多20w,使用innodb引擎最多400w,如果超過這個數(shù)量,查詢更新速度奇慢。這里我們采用一個比較取巧的做法,使用mysql的innodb存儲引擎做了一層緩存庫,這個緩存庫有兩個緩存表,每個表只存儲少于300w的數(shù)據(jù),有一張表多于300w的數(shù)據(jù)就切換到另一張表插入直到超過300w再切換回去。切換成功后,把多于300w數(shù)據(jù)的表truncate掉,記得一定要沒有數(shù)據(jù)插入的時候再truncate,防止數(shù)據(jù)丟失。這里一定要用truncate,不能使用delete,因?yàn)閐elete需要查詢,要用到索引讀寫,并且delete還會寫數(shù)據(jù)庫log耗費(fèi)磁盤IO,存儲空間也沒有釋放。truncate和drop是操作數(shù)據(jù)庫刪除數(shù)據(jù)比較好的做法。由于有兩個表作為數(shù)據(jù)插入表,使用數(shù)據(jù)庫表的自增id并不太合適,需要一個高速的唯一自增Id服務(wù)器提供生成分布式ID。另數(shù)據(jù)庫完全可以關(guān)閉寫事務(wù)日志 ,提高性能,因?yàn)樽ト〉臄?shù)據(jù)當(dāng)時丟失再啟動抓取就可以了, 這樣數(shù)據(jù)庫可以保持在一個比較高性能的情況完成插入操作。抓取緩存表結(jié)果如圖:
2、存儲空間。插入后的數(shù)據(jù)需要保存下來,不能在超過300w后被truncate掉了。我們需要有個程序在達(dá)到300萬時被truncate掉之前把數(shù)據(jù)同步走,存放到另外一個庫上(我們叫做結(jié)果庫,結(jié)果庫也是使用innodb引擎)。不過我們每天采集的數(shù)據(jù)1000多萬,按天遞增,mysql一張表一天就撐爆了,我們這個表不是寫操作密集型,所以結(jié)果庫可以存儲多點(diǎn)數(shù)據(jù),設(shè)定上限500w,但是500萬還是存不下1000萬數(shù)據(jù)。我們需要對mysql最終結(jié)果分庫分表。將數(shù)據(jù)先按照時間分機(jī)器分庫,再按照數(shù)據(jù)源分表,比如201301通過hash計算的數(shù)據(jù)存放在一個機(jī)器,201302通過hash計算在另一個機(jī)器。到了機(jī)器后再按照天或者半天分表,比如表名為 weibo_2013020101 、weibo_2013020112。weibo_2013020101表示2月1日上午一個表,weibo_2013020112表示2月1日下午一個表。光這樣分了還是不夠,1000w/2=500w,經(jīng)不起壓力擴(kuò)展。我們還需要把表再拆分,比如weibo_2013020101 拆成 weibo_2013020101_1(新浪微博)、weibo_2013020101_2(騰訊微博)、weibo_2013020101_3(網(wǎng)易微博)、weibo_2013020101_4(搜狐微博)。這樣一張表平均就存放 500w/4 = 125w 條數(shù)據(jù),遠(yuǎn)遠(yuǎn)小于500w上限,還可以應(yīng)對未來突發(fā)的增長。再從存儲空間來算,就算一條微博數(shù)據(jù)為1k,一天 1000w*1k=10G,硬盤500G最多存放50天的數(shù)據(jù),所以我們規(guī)劃機(jī)器的時候可以掛接多一點(diǎn)硬盤,或者增加機(jī)器。結(jié)果庫分表如圖:
按照這樣的架構(gòu),我們使用開源免費(fèi)軟件、低成本服務(wù)器搭建的千萬級數(shù)據(jù)采集系統(tǒng)在生產(chǎn)運(yùn)轉(zhuǎn)良好。
2013給力的棋牌游戲,火爆棋牌游戲.. ·胎記醫(yī)院 國內(nèi)十大胎記醫(yī)院 去胎記..
·減速機(jī)認(rèn)準(zhǔn)上海寶克 大量現(xiàn)貨 交貨.. ·成都化妝品加盟易美購 明星代言 連..
·優(yōu)質(zhì)路燈桿盡在迎輝照明路燈桿,路.. ·全國均可辦理貸款快速辦理,無抵押..

