Aragog:Pinterest的爬虫框架
为了在Pin上展示 有用的信息 (如产品价格、位置数据)、做出更好的推荐及打击垃圾邮件,Pinterest需要充分利用Pin链接的Web页面中的内容。除了要抓取、存储及处理页面 内容外,还要低延迟地向Pinner提供处理过的内容。为了满足这些需求,他们构建了爬虫框架Aragog,用于处理数以十亿计的URL。近 日,Pinterest核心基础设施团队工程师 Varun Sharma 撰文介绍了该框架 。
他们在构建Aragog时重点考虑了以下三个方面的问题:
- URL“标准化/规范化(Normalization/canonicalization)” :同样的URL可以表示成许多不同的形式,多个不同的URL可能会重定向到同一个URL。URL标准化/规范化的目标就是消除重复,减少数据量。
- 数据抓取礼仪 :限定抓取频率,尊重robots.txt所设定的规则。
- URL数据建模 :存储从单个URL中提取的多段元数据,或者存储及更新与单个URL相关的入链和出链。
如下图所示,Aragog包含两个服务: Aragog Fetcher 会将URL规范化,并按照限定频率抓取Web页面; Aragog UrlStore 则负责存储和提供与URL相关的元数据。
Aragog Fetcher
Aragog Fetcher 是一个 Thrift服务 。它会发出一个HTTP请求,并返回一个封装了页面内容、HTTP头、抓取延迟、重定向链等数据的Thrift结构。为了实现礼貌抓取,Aragog Fetcher会将特定域名的robots.txt文件内容缓存7天,并严格按照其中的规则进行抓取。此外,Aragog Fetcher会使用URL域名调用“频率限制器(rate limiter)”获取允许的抓取频率。该限制器将单个域名的最大抓取频率限定为10QPS。需要的话,可以通过 配置管理系统 修改这一限制。
Aragog UrlStore
Rich Pin 的数据即是由 Aragog UrlStore 提供的。Aragog UrlStore存储着页面内容本身、页面中提取的半结构化数据及Web图元数据(如入链/出链),其设计主要遵循如下两个目标:
- 为整个组织提供所有URL元数据的一站式服务;
- 以可以接受的延迟为Pinterest全部在线读流量以及离线处理系统的读-写流量提供服务。
为此,他们在延迟、稳定性和一致性之间进行了权衡。Varun举了两个例子。
关于页面内容
他们会存储Web页面的全部内容。这些数据检索次数少,而且仅用于离线处理管道。因此,他们选择将这些数据存储在S3上。每个Web页面都作为一 个S3文件单独存储。他们以URL散列值作为Web页面的键,但发现,当许多键的前缀都一样时,会导致S3集群中的单台机器过载,降低了S3 bucket中部分键的性能。
关于Pin元数据
Aragog UrlStore采用了一种灵活的数据模型表示URL元数据,其中包含一个字段名和值的映射。例如,一个产品Pin可能有一个“product_name”字段和一个“price”字段。在大多数情况下,一个URL的元数据由离线处理系统增量更新。
考虑到URL元数据访问要求低延迟,而URL入链/出链非常适合用图模型表示,他们选择使用 Zen (基于Hbase)作为底层存储系统。Zen是Pinterest的图存储服务,允许定义节点及连接这些节点的边。Zen的属性用于存储节点元数据,而边用于为入链/出链建模。Zen会在节点和边上创建索引,提供快速高效的CRUD操作。
Aragog已经成为Pinterest的一个基础设施,许多管道都用它获取和处理数据及提供URL内容。目前,Aragog每天获取数以百万计的URL,并提供数以十亿计的在线URL请求。