资讯专栏INFORMATION COLUMN

基于 ZooKeeper 实现爬虫集群的监控

Backache / 2397人阅读

摘要:各个爬虫的节点通过注册到从而实现爬虫集群的管理。是一款基于等框架实现的通用爬虫框架。爬虫集群的监控包含了和。用于实现爬虫的业务逻辑,可以添加到,由来管理各个的生命周期。

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技术栈:每周更新推送原创技术文章,欢迎扫描下方的公众号二维码并关注,期待与您的共同成长和进步。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/7884.html

相关文章

  • Scrapy-Cluster结合Spiderkeeper管理分布式爬虫

    摘要:分布式爬虫,分发网址是基于地址。注意要使用管理同一个集群,爬虫项目名称须一致,同时集群中配置相同任务浏览器访问启动爬虫时即可看见两个集群配置,启动同名爬虫开始分布式爬虫启动分布式爬虫后状态 Scrapy-cluster 建设 基于Scrapy-cluster库的kafka-monitor可以实现分布式爬虫 Scrapyd+Spiderkeeper实现爬虫的可视化管理 环境 IP...

    bingo 评论0 收藏0
  • DCOS应用案例-不同场景应用上云迁移

    摘要:极大地降低了平台的复杂度,更加方便企业开发人员实现各种业务应用,帮助企业轻松打造基于云计算的软件基础设施。本文将从实际案例出发,结合不同的使用场景,为各位介绍的这些特性。是未来数据中心操作系统的核心。 0.前言 随着 Docker 技术的日渐火热,本就火爆的云计算行业进入了一个加速阶段。云计算最大的特点是弹性和灵活,帮助企业应对复杂的业务需求。由于云计算的IT构架和上一代的IT构架有很...

    PumpkinDylan 评论0 收藏0
  • ZooKeeper学习笔记之扫盲

    摘要:可靠性一旦数据更新成功,将一直保持,直到新的更新。这是一种主动的分布式数据结构,能够在外部情况发生变化时候主动修改数据项状态的数据机构。如果监视节点状态发生变化,则跳转到第步,继续进行后续的操作,直到退出锁竞争。 题外话:从字面上来看,ZooKeeper表示动物园管理员,而Hadoop生态系统中,许多项目的Logo都采用了动物,比如Hadoop采用了大象的形象,所以可以ZooKeepe...

    sarva 评论0 收藏0
  • 人工智能帮助千万用户完成「隐形征信」计算

    摘要:量化派是一家数据驱动的科技金融公司,通过人工智能大数据机器学习等前沿技术提供消费信贷撮合及消费场景下的白条服务,每年处理千万级用户信用及信用消费申请。 「小杨」最近装修房子,准备去银行贷款,但是听说好多人会因为个人征信问题被银行拒绝贷款!于是,他先查了一下自己的央行征信,发现竟然没有自己的征信信息,「小杨」陷入了沉思,自己经常在淘宝、jd 上买东西,也有淘宝花呗和京东白条,怎么会没有征...

    Developer 评论0 收藏0

发表评论

0条评论

Backache

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<