爬虫那些事儿-任务调度系统设计

前言

       对于一家资讯媒体公司而言,爬虫可以说是第一道,也是最重要的补给线与产品线。爬虫聚焦于开发与维护各类网络信息抓取工具,通过获取到数量大、质量高的数据,为运营、算法、大数据等各个部门提供数据支持,保证公司的业务良好运行,而调度则是许多抓取程序中比较重要的一环。

一 、任务调度系统设计的重要性

    分布式系统中比如Hadoop、MapReduce编程模型、还有其它大数据系统都会设计到任务调度。搜索引擎爬虫、新闻聚合公司爬虫面对的抓取url种子都是几十万、上百万甚至更多,这么多网页种子需要去抓取资源如果没有一个较好的调度系统,整个系统将会一片混乱。调度系统可以解决以下问题:


试想想如果一会一大堆种子要抓取,一会很长时间没有任务这就导致,闲的时候机器是空闲的,忙的时候特别忙网络请求非常频繁。

好的任务调度,能够更有效的利用机器资源,达到负载均衡 ,同时提高抓取效率,也能保证数据的平均。

二、设计思路


             图2-1


  图2-2


  图2-3

此调度系统是慢慢迭代开发,如图2-1,之前的话种子不是特别多,就通过linux crontab 指令0 */5 * * * sh /data/get_xpath/start.sh 去执行,这样的话无法做到去区分种子,随着种子数据变多,这种机制完全不符合需求了。后来就采取区别对待如图2-2,就是多个 crontab 多个程序分别调度不同周期的程序。这样的解决方法也真是easy啊,当然还可以用另外一种方式进行处理,利用并发包中的Executors.newScheduledThreadPool(1);方式,执行多个scheduleWithFixedDelay方法去实现:代码如下,

private  ScheduledExecutorService scheduExec = Executors.newScheduledThreadPool(1);
MyTask fifteenMinuTask = new MyTask(60*15);
scheduExec.scheduleWithFixedDelay(fifteenMinuTask, 0, 15, TimeUnit.MINUTES);
MyTask oneHourTask = new MyTask(60*60);
scheduExec.scheduleWithFixedDelay(oneHourTask, 0 , 1, TimeUnit.HOURS);
MyTask fourHourTask = new MyTask(60*60*4);
scheduExec.scheduleWithFixedDelay(fourHourTask, 0, 4, TimeUnit.HOURS);
MyTask twelveHourTask = new MyTask(60*60*12);
scheduExec.scheduleWithFixedDelay(twelveHourTask, 0, 12, TimeUnit.HOURS);

定义了四个任务调度方法,分别15分钟,1小时,4小时和12小时调度一次~  


图2-3是最终的调度实现方式,上面的方法不能满足需求,一个是经常性的对数据库进行操作,操作效率不高,另外一个就是想修改调度频率还是需要重新修改代码,也不能达到数据的平均化。最终形成图2-3的模式,引入缓存redis,通过定义一个list队列和hash存储结构来满足需要,可以把起想象成多个环。按抓取周期分布在这个周期的环里,如



假设一组任务调度周期是10分钟,让这组数据平均分配到这600秒这个圆环上,然后不断的轮询这个圆 ,正常情况下就能保证相同周期的抓取任务能够平均的推送到抓取系统中。

数据结构实现是不断循环list,pop一条然后放到列尾,然后去hash去判断是否应该推送:now() -last_push_time > = crawler_internal 当当前时间减去上一次推送时间就推送到抓取队列中。


另外说明:当程序运行久了之后,调度可能不那么均衡,就有隔一段时间进行初始化的操作,删除redis 相关数据,重新加载最新数据。另外还有就是对数据进行更新,因为数据库中的种子表是不断新增以及更新,同时也会涉及到种子下架和调度周期调整。这些都需要考虑的。

以上就是爬虫中调度系统的实现方案,通过这种土办法最终达到需求。~ 






  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

house.zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值