对博文Crawling the internet: data science within a large engineering system 的整理。
文中提到的数据科学家的一些职责。
(1)数据科学家提供指导,报告见解和趋势;
(2)在执行层以下向产品经理和工程主管提供指导和洞察,通过度量和A/B实验指导产品特性开发;
(3)在软件系统中实现解决方案;
(4)通常不只是一次解决问题,而是不断地解决问题。
Google search中的Recrawl逻辑
1. 第一个版本
(1)网页的原理:谷歌搜索此前爬数十亿个网页,并抓取和快照。当查询到达时,搜索系统根据这些快照将查询的推断含义与网页匹配,并将最佳匹配推送到搜索结果页。因此,搜索结果与最后一次爬取的内容有关;
(2)新鲜度:网页会更新,将快照能够与当前网页能匹配则为新鲜;操作:为每个快照定义了一个新鲜度度量,并构建了一个系统来连续估计web搜索索引中每个快照的新鲜度度量的加权平均值(有意义的线性尺度)。
(3)改进这个新鲜度指标需要更改决定Google搜索何时重新爬网的逻辑。
(4)爬网的约束:
- 每个主机(共享一个公共URL前缀的web页面集合)对Google的web爬虫程序可以请求的爬网速度施加一个隐式或显式的限制。谷歌不断地估计每个主机的最大爬行率。
- 谷歌自己愿意为爬行网页贡献多少计算和网络资源,这对所有网页上的爬网速度施加了总体限制。
(5)将此重新爬网策略简化为一个最大化问题,假设如下:
- 问题是静态的,在这样的静态假设下求解最优爬网策略,然后在短时间内应用此策略。
- 假设主机 i 上的页 j 上有意义变化的到达服从泊松分布,其中泊松速率为 δij,并且在解的整个生命周期中是常数。
- 页面 j 对主机 i 的价值为 Wij、主机 i上的最大爬取率为Ki,最大全局爬取率为 K0。
- 从主机 i 的第 j 页上一次被爬取的 τ 时长后,网页新鲜的概率为 e−δijτ。
- 如果页 j 每 Δij时间段就被爬一次,而被用户检索在这个时间段内均匀分布地发生,则被检索时平均的新鲜概率为Δij1∫0Δije−δijτdτ=Δijδij1(1−e−Δijδij)
最优化问题:
Δijargmaxij∑Δijδijωij(1−e−Δijδij)s.t.j∑Δij1≤ki∀iij∑Δij1≤k0Δij>0∀i,j
这是一个凸优化问题,能解。
落地:
(1)在一台机器上使用一个解算器;
(2)使用一个分布在多台机器上的解算器,对其进行分区,以保证不会有主机被拆分到多台机器上。
更倾向于后者,因为:i. 随着时间的推移,可伸缩性更好;ii. 更符合谷歌解决大型计算问题的通常方法——跨机器并行计算。
2. 问题
然而,还有一堆问题:
(1)黑盒解决方案:基础设施工程师认为,提出的解决方案是在他们的爬行系统中引入了一个新的黑盒组件,不知何时或为什么会失败。
(2)软件中的实际问题是在容量可用时确定接下来要爬网的几个网页。我们需要一个额外的步骤来将优化解决的问题(确定网页重新爬网率)映射到这个实际问题。
(3)复杂性的实质性扩展:建立一个非常大的凸优化问题的分布式求解器,维护这样一个庞大的专门系统的负担是显而易见的。
(4)对响应性的限制:冻结时间并解决一个静态问题,使参数都是异步更新的,它永远不会是最优的。此外,规模会随着时间的推移而不断增长,运行时间(和响应性)可能会恶化。
3. 改进的版本
与软件中的实际问题相匹配,希望能够为每个web页面定义一个函数,该函数将告诉我们在上次爬网后的任何给定时间重新爬网页面的价值。如果我们可以通过这样一个函数对队列进行排序,那么在任何时候,只要有可用的容量,就可以相对容易地确定下一个要爬的网页。
定义爬取率为 ρij=1/Δij,定义函数 Cij(ρij)=σijωijρij(1−e−ρijδij),问题转化为:
ρijargmaxij∑Cij(ρij)s.t.j∑ρij≤ki∀iij∑ρij≤k0ρij>0∀i,j
拉格朗日函数:
L(ρ)=ij∑Cij(ρij)+i∑λij∑ρij+λ0ij∑ρij
∂L/∂ρij=0⇒Cij′(ρij∗)=λi+λ0
其中C′(ρij)=δijωij(1−eρijδij)−ρijωije−ρijδij是一个 ρij 的递减函数,确定 λi+λ0,则可唯一确定 ρij∗。
将 Δij=1/ρij 代入 C′(ρij)=λi+λ0,得:Vij(Δij)=δijωij(1−e−δijΔij)−ωijΔije−δijΔij。可观察到 V(0)=0。
在爬取间隔 Δij 满足 Vij(Δij)=λi+λ0 时,Δij=Δij∗。
由于 Vij(Δij) 也是单调的,因此可构造关于 τ 的函数如下(称之爬网值函数)。随着τ增长,当 Vij(τ) 达到 λi+λ0 时,Vij(τ)=Vij(Δij∗),即应当进行重新爬取。重新爬取后,将 τ 重置为0。
Vij(τ)=δijωij(1−e−δijτ)−ωijτe−δijτ
在任何给定的时间,都可以为主机上的每个网页计算爬网值函数,并使用此函数对网页进行排序,然后确定应将哪些网页安排为立即爬网,极大地简化了之前在每个主机上实现静态优化问题的解决方案。
结论
在设计控制复杂软件系统行为的算法时,找到正确的抽象总是很重要是绝对重要的。假设中的不匹配会导致黑盒周围的额外的系统复杂性,特别是在解决系统的其他部分的鲁棒性和响应性的问题上。最糟糕的是,解决方案可能会将一个糟糕的概念模型暴露给基础架构团队,而基础架构团队的工作就是保持系统的运行。