鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

StreamSpider 总结与展望

总结

这次分布式爬虫系统的设计和实现,学习和了解了多方面的知识。通过实际编写一个爬虫,并在集群上大范围的测试,了解到了更多爬虫相关的知识,尤其是网页编码、去重、错误处理等方面,这些通常是教学视频所涉及不到的。Apache Storm是一个分布式的流式计算平台,设计简单但是功能强大,通过学习和利用Apache Storm构建一个分布式的流式计算系统,深入了解了Storm相关的知识。通过对Storm的学习,了解Storm各个节点、组件之间的互连,数据交换,对学习分布式系统有很大的帮助。

本系统中所使用到的一些工具,有的之前学习过,有的只是了解没有实际部署使用过。而且大多数都因为缺少实际场景,仅限于小范围的试用,从来没有真正体会到它们的最大性能。例如内存数据库redis的性能和容量问题、高并发下的系统负载问题、Apache Storm的容错机制等等。这次的分布式爬虫系统测试了多种大数据技术和工具在高并发下的性能和稳定性,其中调试的经验也很有意义。

此外,在搭建分布式爬虫系统所需要的环境过程中,涉及到了很多技术和工具,其中大部分都是在大数据中常用技术。虽然48h、100并发、百万级别的数据量离真正的大数据还存在一定的差距,但是考虑到硬件资源的限制,这个级别的数据量可以近似看作是大数据。通过搭建和调试这些工具或平台,在同一个系统中把它们组合到一起,保证可用性,为以后的学习打下了较好的基础。

展望

测试结果显示,系统在运行了48小时后就由于redis拒绝服务无法继续运行,redis拒绝服务的主要原因是内存占用过高,主要两项是去重集合和待抓取队列。尽管做了很多的限制,但是这两项仍然迅速占用了全部的内存。

所以亟需解决就是redis内存占用的问题。由于redis内存数据库的特性,所有数据都是存储在内存中的,内存的大小决定了数据的容量。实验室的PC集群内存过小,很快就会被占用满。虽然提高内存可以增加容量,但是单机内存毕竟存在上限,且高性能机器价钱比总配置相同的几个低配置机器加在一起的价钱还要高。分布式的目的之一是为了缓解摩尔定律越来越慢的增长,另一个核心思想就是用较低价格的低配机器组成集群以达到昂贵的高配置机器的性能,从而实现实现持续性的性能提升。作为大数据技术中常用的redis数据库,也早已支持集群。测试使用的redis是单机版的,可以通过集群来横向扩展。使用redis集群,原有程序代码不需要改变,并且,redis集群不需要在开始就完全规划好,完全可以在程序运行过程中根据运行情况实时添加节点重新分片。

对于去重用的键,可以通过集群分片来扩容,但是待抓取队列由于是一个集合,无法自动分片。如果通过人工拆分成多个队列,既不方便,又难以实现。而且,跟去重所用的key不同,待抓取队列不需要把所有的数据都放在内存中,根据队列的特点,只需要保证队列首部在读取前被加载到内存即可。比较之下,系统中用到的另一个中间件消息队列更加满足这个需求。消息队列会将一部分数据保存在内存,当内存使用超过一定阈值后,会自动将数据写入到硬盘中,在读取前再次加载到内存中。因为硬盘的容量很大,理论上可以认为待抓取队列可以无限增长。但是将待抓取队列用消息队列实现,也存在一定的缺点:
1、无法对待抓取队列去重,调度器需要多次过滤同一链接
2、完全先进先出的模型,所有链接处于平等的地位,无法满足实际应用中存在的权重问题

上面也提到了,实际搜索引擎所使用的爬虫模块中,是存在链接权重的,而不是所有站点都平等。现有的设计中是支持权重的,但是由于缺少权重值的计算,一个原因是网页的质量应该由算法决定,单纯的爬虫模块无法确定网页权重。如果是采用page rank之类的算法,需要占用大量内存进行权重值的计算,与爬虫模块的下载职责不符,而且简单实现的page rank算法也容易陷入链接农场。

另外,程序中没有DNS解析模块,所有的DNS解析都是在抓取时进行的,如果上游DNS服务器没有缓存或相应较慢时,会导致下载模块花费一定的时间在DNS解析上,尽管DNS解析速度较快,但是积少成多,总的时间浪费还是很大的。如果在集群内搭建一个DNS服务器,可以做特定的优化,大大减少DNS解析所用时间。而且,爬虫系统的代理模块同样需要DNS解析,自建DNS解析能够实现快速更新和代理选择的负载均衡。

StreamSpider一直缺失的一个特性是没有遵守robots规范。系统从一个链接出发,找到所有新链接,然后依次下载新链接并从中找到新链接,没有考虑到网站领域流行的robots协议。从道德上来说,这是一个需要支持的特性。

系统的主要思想是利用流式计算来达到实时更新搜索结果的目的,目前的系统只是一个爬虫子系统,只完成了网页下载的部分,后续的数据处理和搜索没有,可以将流式计算的想法延伸到整个搜索引擎系统。

在爬取的过程中的观察,让我认识到爬虫系统不仅可以用于通常意义上的搜索引擎。目前,各个高校在网络安全方面的认识逐步加深,也采取了越来越多的保护措施,例如吉林大学校内网络制定了非常严格的防火墙规则。但是千里之堤,溃于蚁穴,一些老旧站点以及受外包人员能力限制,一些网站存在漏洞。例如旧版校内通知网站,尽管在多次攻击后过滤了很多关键词,但是仍然存在可利用的SQL注入攻击漏洞。尤为重要的,注入点是某网站链接过来的,也就是说,点击了链接的人都能发现这个漏洞。另外就是,一些网站存在的信息发布系统等,使得用户能够发布一些信息,如果有人发布了一些不良信息,依靠各个网站自检难度太大。除了网页代码漏洞,还存在其他的安全威胁,例如内页挂马或者被人开启域名泛解析到恶意站点。可以利用分布式爬虫系统,抓取站点信息并实时更新,记录下错误信息,既可以用于站点安全性检测,同时又可以基于一些算法来识别恶意信息,舆情监测。