- A+
下面是一个超级计算机的排行榜,如果我们能拥有其中任意一个,那么我们就不需要搞什么分布式系统。可是我们买不起,即使买得起,也交不起电费,所以我们只好费脑子搞分布式。
Rank |
System |
Cores |
Rmax |
Rpeak |
Power (kW) |
1 |
Tianhe-2 China |
3,120,000 |
33,862.7 |
54,902.4 |
17,808 |
2 |
Titan US |
560,640 |
17,590.0 |
27,112.5 |
8,209 |
3 |
Sequoia US |
1,572,864 |
17,173.2 |
20,132.7 |
7,890 |
4 |
K Japan |
705,024 |
10,510.0 |
11,280.4 |
12,660 |
5 |
Mira US |
786,432 |
8,586.6 |
10,066.3 |
3,945 |
架构概述
与第二期介绍的通用爬虫架构不同,下面是一个聚焦爬虫的架构图,与前者相比,它不仅要保存网页,还要提取出网页中的指定内容。
流程控制 – 任务
Scheduler_manager定时读取Mysql中的任务信息,根据任务的周期等配置进行调度,下面是一个最基本的任务启停流程。
流程控制 – 数据
现在每个Crawler_core实例都有了待处理的任务,接下来就要对每个任务的url进行处理了。继续使用Redis作为公共缓存来存放URLs,多个Crawler_core实例并行存取todo集合。
流程控制 – 状态
taskId:flag:crawler:info |
||
Filed |
value |
说明 |
totalCnt |
10000 |
抓取的url总数:抓取完成,不管成功失败,都加1 |
failCnt |
0 |
抓取的url失败数:抓取失败,加1 |
switch |
1 |
任务状态:0:停止,1:启动,2:暂停,3:暂停启动 |
priority |
1 |
任务优先级 |
retryCnt |
0 |
重试次数 |
status |
0 |
任务执行状态:1:进行中,2:完成 |
Ref |
0 |
url引用数:每消费一个url,减1;生成一个url,加1。等于0则任务完成 |
maxThreadCnt |
100 |
任务的最大线程数 |
remainThreadCnt |
10 |
剩余可用线程数 |
lastFetchTime |
1496404451532 |
上一次抓取时间 |
taskId:flag:parser:info |
||
Filed |
value |
说明 |
totalCnt |
10000 |
解析总数:解析完成,不管成功失败,都加1 |
failCnt |
0 |
解析失败数:解析失败,加1 |
crawlerStatus |
0 |
爬取状态:0:进行中,2:完成 |
ref |
10 |
url引用数:crawler每保存一个网页,加1;parser每解析完成一个网页,减1。等于0不说明任务完成。若crawlerStatus等于2,ref等于0,则任务完成。 |
taskId:flag:filter:info |
||
Filed |
value |
说明 |
totalCnt |
10000 |
清洗总数:清洗完成,不管成功失败,都加1 |
failCnt |
0 |
清洗失败数:清洗失败,加1 |
crawlerStatus |
0 |
解析状态:0:进行中,2:完成 |
ref |
10 |
url引用数:parser每保存一条数据,加1;filter每清洗完成一条数据,减1。等于0不说明任务完成。若parserStatus等于2,ref等于0,则任务完成。 |
流程控制 – failover
如果一个Crawler_core的机器挂掉了,就会开始数据恢复程序,把这台机器所有未完成的任务恢复到公共缓存中。
学会了吗!这波是爬虫中的必备技能哦!