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請求。