摘要:各個(gè)爬蟲(chóng)的節(jié)點(diǎn)通過(guò)注冊(cè)到從而實(shí)現(xiàn)爬蟲(chóng)集群的管理。是一款基于等框架實(shí)現(xiàn)的通用爬蟲(chóng)框架。爬蟲(chóng)集群的監(jiān)控包含了和。用于實(shí)現(xiàn)爬蟲(chóng)的業(yè)務(wù)邏輯,可以添加到,由來(lái)管理各個(gè)的生命周期。
ZooKeeper
ZooKeeper 是一個(gè)開(kāi)源的分布式協(xié)調(diào)服務(wù),ZooKeeper框架最初是在“Yahoo!"上構(gòu)建的,用于以簡(jiǎn)單而穩(wěn)健的方式訪問(wèn)他們的應(yīng)用程序。 后來(lái),Apache ZooKeeper成為Hadoop,HBase和其他分布式框架使用的有組織服務(wù)的標(biāo)準(zhǔn)。 例如,Apache HBase使用ZooKeeper跟蹤分布式數(shù)據(jù)的狀態(tài)。ZooKeeper 的設(shè)計(jì)目標(biāo)是將那些復(fù)雜且容易出錯(cuò)的分布式一致性服務(wù)封裝起來(lái),構(gòu)成一個(gè)高效可靠的原語(yǔ)集,并以一系列簡(jiǎn)單易用的接口提供給用戶(hù)使用。
ZooKeeper 通常用于:命名服務(wù)、配置管理、集群管理、分布式協(xié)調(diào)/通知、分布式鎖和分布式隊(duì)列等等。
各個(gè)爬蟲(chóng)的節(jié)點(diǎn)通過(guò)注冊(cè)到 ZooKeeper 從而實(shí)現(xiàn)爬蟲(chóng)集群的管理。NetDiscovery 正是借助了 ZooKeeper 的特性來(lái)監(jiān)控爬蟲(chóng)集群。
爬蟲(chóng)集群的監(jiān)控NetDiscovery 是一款基于 Vert.x、RxJava 2 等框架實(shí)現(xiàn)的通用爬蟲(chóng)框架。它包含了豐富的特性。
NetDiscovery 包含了 Spider 和 SpiderEngine。 Spider 用于實(shí)現(xiàn)爬蟲(chóng)的業(yè)務(wù)邏輯,Spider 可以添加到 SpiderEngine,由 SpiderEngine 來(lái)管理各個(gè) Spider 的生命周期。
但是 SpiderEngine 部署到每一個(gè)節(jié)點(diǎn)之后,SpiderEngine 如何進(jìn)行監(jiān)控和管理呢?
可以將 SpiderEngine 在運(yùn)行時(shí),先注冊(cè)到 ZooKeeper。(需要事先在 ZooKeeper 集群創(chuàng)建 /netdiscovery 節(jié)點(diǎn))
/**
* 啟動(dòng)SpiderEngine中所有的spider,讓每個(gè)爬蟲(chóng)并行運(yùn)行起來(lái)。
*
*/
public void run() {
if (Preconditions.isNotBlank(spiders)) {
registerZK();
......
}
}
/**
* 將當(dāng)前 SpiderEngine 注冊(cè)到 zookeeper 指定的目錄 /netdiscovery 下
*/
private void registerZK() {
if (Preconditions.isNotBlank(zkStr) && useZk) {
log.info("zkStr: {}", zkStr);
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
CuratorFramework client = CuratorFrameworkFactory.newClient(zkStr, retryPolicy);
client.start();
try {
String ipAddr = InetAddress.getLocalHost().getHostAddress() + "-" + defaultHttpdPort + "-" + System.currentTimeMillis();
String nowSpiderEngineZNode = "/netdiscovery/" + ipAddr;
client.create().withMode(CreateMode.EPHEMERAL).forPath(nowSpiderEngineZNode,nowSpiderEngineZNode.getBytes());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
另外,需要使用 NetDiscovery Monitor 的 CuratorManager 類(lèi)。 它借助 Zookeeper 的 Watcher 機(jī)制,監(jiān)聽(tīng)已經(jīng)注冊(cè)到 /netdiscovery 這個(gè)父 zNode 下的各個(gè)子 zNode ,也就是各個(gè) SpiderEngine。
Watcher機(jī)制是指 ZooKeeper 客戶(hù)端向 ZooKeeper 服務(wù)器注冊(cè) Watcher 的同時(shí),會(huì)將 Watcher 對(duì)象存儲(chǔ)在客戶(hù)端的 WatchManager 中。ZooKeeper 服務(wù)器觸發(fā) Watcher 事件后,會(huì)向客戶(hù)端發(fā)送通知,客戶(hù)端線程從 WatchManager 中回調(diào) Watcher 執(zhí)行相應(yīng)的功能。
/**
* 當(dāng)前所監(jiān)控的父的 zNode 下若是子 zNode 發(fā)生了變化:新增,刪除,修改
*
* 下述方法都會(huì)觸發(fā)執(zhí)行
*
* @param event
*/
@Override
public void process(WatchedEvent event) {
List newZodeInfos = null;
try {
newZodeInfos = client.getChildren().usingWatcher(this).forPath("/netdiscovery");
//根據(jù)初始化容器的長(zhǎng)度與最新的容器的長(zhǎng)度進(jìn)行比對(duì),就可以推導(dǎo)出當(dāng)前 SpiderEngine 集群的狀態(tài):新增,宕機(jī)/下線,變更...
//哪個(gè)容器中元素多,就循環(huán)遍歷哪個(gè)容器。
if (Preconditions.isNotBlank(newZodeInfos)) {
if (newZodeInfos.size()>allZnodes.size()){
//明確顯示新增了哪個(gè) SpiderEngine 節(jié)點(diǎn)
for (String nowZNode:newZodeInfos) {
if (!allZnodes.contains(nowZNode)){
log.info("新增 SpiderEngine 節(jié)點(diǎn){}", nowZNode);
}
}
}else if (newZodeInfos.size()// 宕機(jī)/下線
// 明確顯示哪個(gè) SpiderEngine 節(jié)點(diǎn)宕機(jī)/下線了
for (String initZNode : allZnodes) {
if (!newZodeInfos.contains(initZNode)) {
log.info("SpiderEngine 節(jié)點(diǎn)【{}】下線了!", initZNode);
// 如果有下線的處理,則處理(例如發(fā)郵件、短信等)
if (serverOfflineProcess!=null) {
serverOfflineProcess.process();
}
}
}
}else {
// SpiderEngine 集群正常運(yùn)行;
// 宕機(jī)/下線了,當(dāng)時(shí)馬上重啟了,總的爬蟲(chóng)未發(fā)生變化
}
}
} catch (Exception e) {
e.printStackTrace();
}
allZnodes = newZodeInfos;
}
所以需要多帶帶運(yùn)行一個(gè)進(jìn)程,例如:
public class TestCuratorManager {
public static void main(String[] args) {
CuratorManager curatorManager = new CuratorManager();
curatorManager.start();
}
}
下圖反映了 ZooKeeper 如何監(jiān)控 SpiderEngine 集群。
總結(jié)
爬蟲(chóng)框架 github 地址:github.com/fengzhizi71…
本文介紹了如何使用 ZooKeeper 來(lái)監(jiān)控爬蟲(chóng)的集群。未來(lái),NetDiscovery 還會(huì)增加更為通用的功能。
Java與Android技術(shù)棧:每周更新推送原創(chuàng)技術(shù)文章,歡迎掃描下方的公眾號(hào)二維碼并關(guān)注,期待與您的共同成長(zhǎng)和進(jìn)步。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7884.html
摘要:分布式爬蟲(chóng),分發(fā)網(wǎng)址是基于地址。注意要使用管理同一個(gè)集群,爬蟲(chóng)項(xiàng)目名稱(chēng)須一致,同時(shí)集群中配置相同任務(wù)瀏覽器訪問(wèn)啟動(dòng)爬蟲(chóng)時(shí)即可看見(jiàn)兩個(gè)集群配置,啟動(dòng)同名爬蟲(chóng)開(kāi)始分布式爬蟲(chóng)啟動(dòng)分布式爬蟲(chóng)后狀態(tài) Scrapy-cluster 建設(shè) 基于Scrapy-cluster庫(kù)的kafka-monitor可以實(shí)現(xiàn)分布式爬蟲(chóng) Scrapyd+Spiderkeeper實(shí)現(xiàn)爬蟲(chóng)的可視化管理 環(huán)境 IP...
摘要:極大地降低了平臺(tái)的復(fù)雜度,更加方便企業(yè)開(kāi)發(fā)人員實(shí)現(xiàn)各種業(yè)務(wù)應(yīng)用,幫助企業(yè)輕松打造基于云計(jì)算的軟件基礎(chǔ)設(shè)施。本文將從實(shí)際案例出發(fā),結(jié)合不同的使用場(chǎng)景,為各位介紹的這些特性。是未來(lái)數(shù)據(jù)中心操作系統(tǒng)的核心。 0.前言 隨著 Docker 技術(shù)的日漸火熱,本就火爆的云計(jì)算行業(yè)進(jìn)入了一個(gè)加速階段。云計(jì)算最大的特點(diǎn)是彈性和靈活,幫助企業(yè)應(yīng)對(duì)復(fù)雜的業(yè)務(wù)需求。由于云計(jì)算的IT構(gòu)架和上一代的IT構(gòu)架有很...
摘要:可靠性一旦數(shù)據(jù)更新成功,將一直保持,直到新的更新。這是一種主動(dòng)的分布式數(shù)據(jù)結(jié)構(gòu),能夠在外部情況發(fā)生變化時(shí)候主動(dòng)修改數(shù)據(jù)項(xiàng)狀態(tài)的數(shù)據(jù)機(jī)構(gòu)。如果監(jiān)視節(jié)點(diǎn)狀態(tài)發(fā)生變化,則跳轉(zhuǎn)到第步,繼續(xù)進(jìn)行后續(xù)的操作,直到退出鎖競(jìng)爭(zhēng)。 題外話:從字面上來(lái)看,ZooKeeper表示動(dòng)物園管理員,而Hadoop生態(tài)系統(tǒng)中,許多項(xiàng)目的Logo都采用了動(dòng)物,比如Hadoop采用了大象的形象,所以可以ZooKeepe...
摘要:量化派是一家數(shù)據(jù)驅(qū)動(dòng)的科技金融公司,通過(guò)人工智能大數(shù)據(jù)機(jī)器學(xué)習(xí)等前沿技術(shù)提供消費(fèi)信貸撮合及消費(fèi)場(chǎng)景下的白條服務(wù),每年處理千萬(wàn)級(jí)用戶(hù)信用及信用消費(fèi)申請(qǐng)。 「小楊」最近裝修房子,準(zhǔn)備去銀行貸款,但是聽(tīng)說(shuō)好多人會(huì)因?yàn)閭€(gè)人征信問(wèn)題被銀行拒絕貸款!于是,他先查了一下自己的央行征信,發(fā)現(xiàn)竟然沒(méi)有自己的征信信息,「小楊」陷入了沉思,自己經(jīng)常在淘寶、jd 上買(mǎi)東西,也有淘寶花唄和京東白條,怎么會(huì)沒(méi)有征...
閱讀 1468·2021-11-25 09:43
閱讀 2606·2021-09-24 10:30
閱讀 3675·2021-09-06 15:02
閱讀 3613·2019-08-30 15:55
閱讀 3312·2019-08-30 15:53
閱讀 1707·2019-08-30 15:52
閱讀 2153·2019-08-30 14:21
閱讀 2022·2019-08-30 13:55