爬虫任务调度

背景介绍

爬虫系统:一台是control server,其他的100台做crawler。server每天定时分发采集任务。

问题出现:由于目标采集任务比较大,准备增加10台crawler。期望在不改变原有任务分配规

则的基础上,同时优先分配任务少的机器上,而且能够对任务较少的机器进行平均分配(尽可

能保证机器有任务而不空跑)。

解决方案

方案一:对已经分配任务的每台机器统计任务数和task_sum,加上待分配任务数dis_num,平均分到

每一台机器,得到一个分发任务后的平均任务数avg_task_num,对于已分配任务数少于avg_task_num

的机器,就分配。分配数为avg_task_num减去每台机器上的已分配任务数。如果任务数足够,就会优先

分配给任务数少的机器。

分析:这个方案乍一看是很合适的,任务会合适的分发完,而且分发量也会被合适的计算到,不会

出现任务集中分发在某台机器上的情况。

但是,如果任务量不够多的情况下,就会出现不能平均分发的情况。假设下面五台机器的任务数量为

[50,50,50,0,0],机器4和5为新加入crawler系统的机器,任务数和task_sum为150,在待分配任务数

dis_num分别为200,100,50,10的情况下每台机器分配后的任务数情况如下:


待分配任务数
dis_num


分配后平均任务数avg_task_num

机器1 机器2 机器3 机器4 机器5
200 70 50+20 50+20 50+20 0+70 0+70
100 50 50+0 50+0 50+0 0+50 0+50
50 40 50+0 50+0 50+0 0+40 0+10
10 32 50+0 50+0 50+0 0+10 0+0

上表中,每台机器的任务数情况表示为a+b的形式,其中a为该机器上已分配的任务数,b为实际可分配到的

任务数。当待分配任务数(dis_num)为200和100的时候,我们发现这个方案还可以优先并平均分配任务;

但是当待分配任务数(dis_num)为50的时候,我们可以发现,该方案可以优先为没有任务的机器4和5分配

任务,但是任务数量有一定的偏差;当待分配任务数(dis_num)为50的时候,我们发现由于分配的先后顺

序,机器5分配到任务数为0。这样并不是我们期望的结果,我们期望的是,如果待分配任务数(dis_num)为

10,为了不让机器空跑,我们希望对机器4和5各分配5个任务。这个问题该怎么解决呢?

此时,可能你更容易想到的就是,添加条件判断,如果有数量为0的机器,优先处理,并且平均分配。但是,

如果待分配任务量足够多,我们又该怎么确定给这些任务数为0的机器优先分配多少?如果优先分配多了,最后

其他机器就少了,crawler的负载不够均衡,如果优先分配少了,剩下很多怎么办?难道再执行一次分配么?

这样的思路似乎总是存在一些瑕疵,如果转换成代码,最后都要加一些额外的if语句来判断,如果考虑的不够全

面,我们的任务调度可能就会有很大的隐患。

 

方案二:我们可以简单的把问题转换一下:

图一:正常情况下理想的任务分配

图二:新加机器情况下的理想任务分配

我们把任务分配比做连通的水桶加水的过程,假设水桶是相连通的(理想的任意情况下都连通),水桶中或多或

少的有一些冰块(理想冰块不会浮动,并且冰和水的体积仍为1:1)。在加水后,最后的水平面肯定是水桶中最低

的位置(读者自行脑补,人往高处走,水往低处流!)。

如果把水桶视为我们crawler机器上的任务池,冰块视为已经分配给crawler机器的任务,加水就可以视为我们的

任务分配,加水后的水平面就完全可以等价于任务分配完成后的最少任务数,我称之为最低水准线(min_line)。

对于上面的任务分配示意图,如果我们在分配前可以计算出这个最低水准线(min_line),我们就能很容易实现理

想的任务分配。每台机器的实际分配任务量为最低水准线min_line与已分配任务数的差值,如果差值为负数,则不

进行任务分配。这个min_line能计算出来吗?这个嘛,当然是可以的。

 

min_line计算过程描述

total_sum:参与分配的机器上已经分配的任务数之和(假设所有的机器参与了分配,初始化为所有机器的任务数和)

dis_num:待分配的任务数

t_num:实际参与任务分配的机器数量(假设所有的机器参与了分配,初始化为所有机器数)

avg_num:参与分配的机器在完成分配后的任务数

思路:

1.min_line实际上就是 最后真正参与分配的avg_num=(total_sum+dis_num)/t_num,假设所有机器参与了分配。

2.首先检查假设参与分配的机器的已分配任务数是否全部比avg_num小遍历每台机器,把每台机器的已分配任务和avg_num比较,

如果有机器的已分配任务数大于avg_num,那么可以说明这台机器肯定没有参与最后的分配,需要需要把这台机器剔除掉。

否则min_line=avg_num。在完成一次遍历后,重新计算avg_num,重新执行本步骤。

 

总结

我只是在尝试一种可以更好的调度任务的规则而已,就像流水一样,真正优先、均衡地分配任务(至少理论上是这样)!

爬虫任务调度,布布扣,bubuko.com

时间: 2024-10-19 12:14:21

爬虫任务调度的相关文章

java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫

获取[下载地址]   QQ: 313596790   [免费支持更新] 三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A 集成代码生成器(开发利器)+快速构建表单;            QQ:313596790 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块 B 集成阿里巴巴数据库连接池druid;

java sql编辑器 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫 java代码生成器

A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势D 集成安全权限框架shiro  Shiro 是一个用 Java 语言

quartz定时任务调度 自定义表单 java图片爬虫

获取[下载地址]   QQ: 313596790A 调用摄像头拍照,自定义裁剪编辑头像 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:313596790 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩

网络爬虫的相关综述

前言:对网络爬虫很感兴趣 —————————————————————————————————————————————— 一.网络爬虫的工作原理 1.1等同于浏览器访问网页的工作原理.(详细情况见本文末尾博文链接) (1)是一种真人的行为驱动 (2)通过浏览器来自动执行人为的动作,将动作自动程序化. 1.2网络爬虫就是将浏览器访问网页的过程,再次抽象成了程序. 二.网络爬虫的分类 2.1通过链接的访问层次先后来分:宽度优先和广度优先 宽度优先:在下载网页链接时,是一层一层的通过链接来爬取: 广度优

基于Redis的三种分布式爬虫策略

前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够"健壮"的情况下实现起来越简单/方便越好 最好支持"断点续爬"功能 Python分布式爬虫比较常用的应该是scrapy框架加上Redis内存数据库,中间的调度任务等用scrapy-redis模块实现. 此处简单介绍一下基于Redis的三种分布式策略,其实它们之间还是很相似

开源通用爬虫框架YayCrawler-运行与调试

本节我将向大家介绍如何运行与调试YayCrawler.该框架是采用SpringBoot开发的,所以可以通过java –jar  xxxx.jar的方式运行,也可以部署在tomcat等容器中运行. 首先让我们介绍一下运行环境: 1.jdk8 2.安装mysql数据库,用作存储解析规则等数据 3.安装redis,用作任务队列 4.安装mongoDB用于存放结果数据 5.安装ftp服务器软件ftpserver(可选,用于存放下载图片) 一.运行发布包 首先从https://github.com/liu

网络爬虫研发重点介绍

一.网络爬虫的一般作法 1.1 基于Socket通信编写爬虫1.2 基于HttpURLConnection类编写爬虫1.3 基于apache的HttpClient包编写爬虫1.4 基于phantomjs之类的无头(无界面)浏览器1.5 基于Selenium之类的有头(有界面)浏览器 二.系统设计 2.1 模块划分:任务管理的UI交互层.任务调度层.网络爬取层.数据解析层.数据持久化层 2.2 项目划分数据采集/下载项目(download)数据解析项目(parser)数据持久化(persisten

bootstrap后台框架源码 java图片爬虫 自定义表单

获取[下载地址]   [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A 集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块B 集成阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Dr

伪分布式网络爬虫框架的设计与自定义实现

[项目愿景]系统基于智能爬虫方向对数据由原来的被动整理到未来的主动进攻的转变的背景下,将赋予”爬虫”自我认知能力,去主动寻找”进攻”目标.取代人工复杂而又单调的重复性工作.能够实现在人工智能领域的某一方向上独当一面的作用. [项目进展]项目一期基本实现框架搭建,对数据的处理和简单爬取任务实现. [项目说明]为了能够更好理解优秀框架的实现原理,本项目尽量屏蔽优秀开源第三方jar包实现,自定义实现后再去择优而食,形成对比. [设计原则]依据形式跟进新技术,不断积累在不同业务场景下对各个开源技术的驾驭