1.本发明涉及数据处理技术领域,尤其涉及一种网络爬虫的域名解析缓冲方法。
背景技术:
2.搜索引擎是目前从互联网获取信息的最有效方式。分布式爬虫作为搜索引擎的基础,得到了广泛的研究与应用,其通常由url分析器、dns缓存、速率控制等多个组件构成。爬虫在抓取网页时,需要使用dns(domainnameservice)将目标主机的域名转换为ip地址。研究表明,这一环节是爬虫的主要性能瓶颈之一。
3.国内外对单机爬虫的策略、性能等各方面已进行了深入研究,对分布式爬虫的研究主要集中在任务调度、资源分配等爬虫策略方面,对分布式爬虫性能问题的研究尚不多见。
4.jvm的域名缓存方法
5.1缓存策略
6.编写网络应用程序时,通常使用inetaddress类来完成此功能,此时,dns缓存由jvm的缓存策略控制,当使用inetaddress类第1次成功解析某个域名(如www.google.com)后,jvm就会将这个域名和它从dns上获得的信息(ip地址和ttl等)都保存在缓存中,当下一次inetaddress类再解析这个域名时,就直接从缓存里获得所需的信息,而无需再访问dns服务器;对解析错误的域名,inetaddress提供了负向缓存(negativecache)机制,但默认为不缓存。使用inetaddress域名解析后,操作系统也会将此记录进行缓存,jvm下次调用域名解析时,会利用操作系统的缓存。操作系统的缓存时间会参考dns服务器响应的ttl值,但是不完全等于ttl值,windows系统可以通过注册表设置dns缓存条目ttl最大值,默认为1d,域名解析的全过程如图一所示。但这种方式有2个问题,首先,分布式爬虫为了避免ip被封的问题,会尽量将对同一域名的抓取任务均匀分布在多个爬虫节点,这就使得即使是相同的域名,由于jvm和操作系统的缓存不能跨节点共享,每个爬虫节点都至少需要一次向网络dns服务器请求解析;其次,为了避免大站积压问题,分布式爬虫调度器通常会以一级或二级域名为单位对抓取任务做公平调度,这就使得大站的抓取需要较长的时间,而dns服务器响应的域名ttl值通常则较小,从而导致操作系统和jvm的域名缓存过期后删除,爬虫则需多次请求dns服务器。
7.2缓存的数据结构
8.jvm的inetaddress内部使用linkedhashmap《string,cacheentry》作为正向(positive)和负向(negative)缓存的数据结构,其中键为字符串类型的域名,值对象cacheentry中主要包括ip地址和ttl。这种数据结构有2个问题,首先,空间效率较低,分布式爬虫需要处理大量的域名,如果使用ⅳm的缓存数据结构来存储这些一级域名,仅tld的冗余存储就需要5
×3×
109=1.5gb;考虑到一个网站通常有多个子域名,此时,tld的冗余则需要更多的空间(假设每个网站平均有3个子域名,则tld冗余需要接近4.5gb的内存空间)。其次,该结构数据只在同一个jvm内共享,不符合分布式爬虫多节点共享和分布式并行
的应用特点,且该数据结构的同时访问需要采用同步锁阻塞的方式,不能很好地支持高并发,也会影响爬虫性能。
技术实现要素:
9.为了解决以上技术问题,本发明提供了一种网络爬虫的域名解析缓冲方法。提升域名解析性能,同时降低各爬虫节点的内存占用和域名解析请求对网络带宽的影响。
10.本发明的技术方案是:
11.一种网络爬虫的域名解析缓冲方法,
12.在深入分析操作系统和jvm的域名解析工作机制基础上,结合分布式爬虫的并行化与任务多节点均匀化的特点,采用正向和负向双缓存方式,为2个缓存分别设计采用了数据结构和过期策略。
13.进一步的,
14.正向缓存采用紧凑的二进制键值元组bctuple(binarycompacttuple)来存储成功解析的域名。负向缓存采用数据结构来存储未成功解析的域名。
15.再进一步的,
16.正向缓存采用数据结构bctuple(binarycompacttuple){hash一12(tld)+murmur3—32((sld)+murmur332(全域名一sld.tld)),ip,1trl}来存储解析成功的域名,其中,ip使用整数形式存储,ipv4地址为32位,ipv6地址为128位;ritlll以分钟为单位,采用16位的短整数形式存储。
17.hash一12函数预先将所有tld按顺序编码为12位的二进制值(支持212=4096个tld)并保存到全局的哈希表中,之后每次从该哈希表中获取对应的二进制值;使用murmur3—32hash算法对一级域名计算哈希值。使用murmur3—32hash算法对域名的除tld和一级域名之外的其他部分计算哈希值,值为32位。
18.为了解决dns服务器响应的域名ttl值较小导致的重复dns请求问题,采取如下方法:设定一个最小ttl阈值,在首次将一域名加入缓存时,首先比较dns服务器响应的ttl,如果低于阈值,则使用阈值作为该域名的ttl,否则,使用服务器响应的ttl值。
19.再进一步的,
20.负向缓存的数据结构由一个二进制向量和随机映射函数构成,可以用于检索一个元素是否在一个集合中,根据设定的统一失效时间ttl,直接清空缓存,避免数据结构无法删除元素的问题,也降低网络和域名服务器故障导致的域名解析失败对后续抓取的影响;与正向缓存相结合。
21.本发明的有益效果是
22.本方法可以有效提升域名解析性能,同时降低各爬虫节点的内存占用和域名解析请求对网络带宽的影响,从而提升了分布式爬虫的整体性能。
附图说明
23.图1是本发明的域名解析的过程示意图;
24.图2是紧凑型键值的结构示意图。
具体实施方式
25.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
26.本发明在深入分析操作系统和jvm的dns工作机制基础上,针对分布式爬虫的并行化与任务多节点均匀化等特点,设计实现了高效的dns缓存机制dqcache(distributedquickcache),采用正向和负向双缓存方式,正向缓存采用紧凑的二进制键值元组bctuple(binarycompacttuple)来存储成功解析的域名,负向缓存采用一种新的数据结构来存储未成功解析的域名,并针对爬虫特性,对这2个缓存分别给出了过期策略。
27.本发明采用正向和负向双缓存相结合的方式,2个缓存分别采用不同的数据结构和缓存策略。
28.1、正向缓存
29.为了解决域名冗余导致的空间浪费等问题,本文采用如下的数据结构bctuple(binarycompacttuple){hash一12(tld)+murmur3—32((sld)+murmur332(全域名一sld.tld)),ip,1trl}来存储解析成功的域名。其中,ip使用整数形式存储,ipv4地址为32位,ipv6地址为128位;ritlll以分钟为单位,采用16位的短整数形式存储;紧凑型键值的结构如图二所示。可将hash一12函数及murmur3—32hash算法均设置在芯片中,通过该芯片进行操作运行。其中hash一12函数预先将所有tld按顺序编码为12位的二进制值(可支持212=4096个tld)并保存到全局的哈希表中,之后每次从该哈希表中获取对应的二进制值;使用murmur3—32hash算法对一级域名计算哈希值。murmurhash是austinappleby于2008年创立的一种非加密哈希算法,有着非常高的效率,murmur3—32计算出的哈希值为32位,支持42亿个一级域名。使用murmur3—32hash算法对域名的除tld和一级域名之外的其他部分计算哈希值,值为32位。此数据结构有2个主要的优点。首先,此结构中一个域名键值需要的空间为76位。以tld平均5个字符、二级域名sld平均13个字符、子域名平均长度3个字符作为对比,加上2个分割符,此数据结构比inetaddresslinkedhashmap《string,cacheentry》的string类型键值要节省59%的空间(1—76/(5+13+3+2)
×
8=59%);其次,由于采用了域名倒序的方式作为键值,可以很方便地进行子域的前缀匹配、范围查询与统计,比如要统计所有tld为.com的域名数量,则根据键值的12位前缀进行过滤即可。为了解决dns服务器响应的域名ttl值较小导致的重复dns请求问题,采取如下方法:设定一个最小ttl阈值,在首次将一域名加入缓存时,首先比较dns服务器响应的ttl,如果低于阈值,则使用阈值作为该域名的ttl,否则,使用服务器响应的ttl值。
30.2、负向缓存(negativecache)
31.新的数据结构由一个很长的二进制向量和一系列随机映射函数构成,可以用于检索一个元素是否在一个集合中,优点是空间效率和查询时间都远超过精确数据结构,在百万分之一的误检率情况下,1亿条数据只需要350mb的内存空间,但其缺点是有一定的误识别率和删除困难。本文采用这种新的数据结构来缓存未成功解析的域名,空问效率和查询时间相比inetaddress的linkedhashmap哈希表结构都有显著的提升;根据设定的统一失效时间ttl,直接清空缓存,避免了新的数据结构无法删除个别元素的问题,也降低网络和域
名服务器故障导致的域名解析失败对后续抓取的影响;与正向缓存相结合。
32.以上所述仅为本发明的较佳实施例,仅用于说明本发明的技术方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
技术特征:
1.一种网络爬虫的域名解析缓冲方法,其特征在于,在深入分析操作系统和jvm的域名解析工作机制基础上,结合分布式爬虫的并行化与任务多节点均匀化的特点,采用正向和负向双缓存方式,为2个缓存分别设计采用了数据结构和过期策略。2.根据权利要求1所述的方法,其特征在于,正向缓存采用紧凑的二进制键值元组bctuple(binarycompacttuple)来存储成功解析的域名。3.根据权利要求1所述的方法,其特征在于,负向缓存采用数据结构来存储未成功解析的域名。4.根据权利要求2所述的方法,其特征在于,正向缓存采用数据结构bctuple(binarycompacttuple){hash一12(tld)+murmur3—32((sld)+murmur332(全域名一sld.tld)),ip,1trl}来存储解析成功的域名,其中,ip使用整数形式存储,ipv4地址为32位,ipv6地址为128位;ritlll以分钟为单位,采用16位的短整数形式存储。5.根据权利要求4所述的方法,其特征在于,hash一12函数预先将所有tld按顺序编码为12位的二进制值(支持212=4096个tld)并保存到全局的哈希表中,之后每次从该哈希表中获取对应的二进制值;使用murmur3—32hash算法对一级域名计算哈希值。6.根据权利要求5所述的方法,其特征在于,使用murmur3—32hash算法对域名的除tld和一级域名之外的其他部分计算哈希值,值为32位。7.根据权利要求5所述的方法,其特征在于,为了解决dns服务器响应的域名ttl值较小导致的重复dns请求问题,采取如下方法:设定一个最小ttl阈值,在首次将一域名加入缓存时,首先比较dns服务器响应的ttl,如果低于阈值,则使用阈值作为该域名的ttl,否则,使用服务器响应的ttl值。8.根据权利要求1所述的方法,其特征在于,负向缓存的数据结构由一个二进制向量和随机映射函数构成,可以用于检索一个元素是否在一个集合中,根据设定的统一失效时间ttl,直接清空缓存,避免数据结构无法删除元素的问题,也降低网络和域名服务器故障导致的域名解析失败对后续抓取的影响;与正向缓存相结合。
技术总结
本发明提供一种网络爬虫的域名解析缓冲方法,属于数据处理技术领域,本发明在深入分析操作系统和JVM的域名解析工作机制基础上,结合分布式爬虫的并行化与任务多节点均匀化等特点,采用正向和负向双缓存方式,为2个缓存分别设计采用了特定的数据结构和过期策略。实验表明,该方法可以有效提升域名解析性能,同时降低各爬虫节点的内存占用和域名解析请求对网络带宽的影响,提升了分布式爬虫的整体性能。能。能。
技术研发人员:李涛 孙思清 孙兴艳
受保护的技术使用者:浪潮云信息技术股份公司
技术研发日:2021.12.06
技术公布日:2022/3/8