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