“猎豹”和“大象”[1]
从第一天开始对Facebook的点击流写日志起,到现在我们已经收集了超过400GB的数据。对该数据集的加载、索引和聚集操作对Oracle数据库的负载很重。虽然做了很多优化操作,但是我们还是无法在24小时内完成对一天的点击流的聚集操作。很显然,我们需要把日志文件聚集到数据库外,只在数据库中保存摘要信息(smmary information)供后期查询。
幸运的是,一个来自某大型网站的顶尖工程师加入了我们团队,他有过处理大规模Web点击流的经验。仅仅几周的时间,该工程师就构建了一个名为Cheetah(猎豹)的并发日志处理系统,该系统能够在两个小时内处理一天的点击流。这实在太让人振奋了。
但是,Cheetah存在一些不足:首先,在处理完点击流数据后,原始数据还是以归档方式保存(achival storage),不能够被再次查询。此外,Cheetah是从一个共享的NetApp归档数据中获取点击流数据,而NetApp归档数据的读带宽受限。每个日志文件的“模式”(shema)是嵌入在处理脚本中,而不是保存为可查询格式。我们没有收集进程信息,而是通过Unix基础工具cron来调用Cheetah任务,因此无法应用复杂的加载共享逻辑。最重要的是,Cheetah不是开源的。我们团队很小,资源有限,无法分配更多的资源来开发、维护和给新用户培训使用Cheetah系统。
Apache的Hadoop项目,由Doug Cutting和Mike Cafarella于2005年末启动,是我们取代Cheetah的最佳选择。以Doug的孩子的玩具大象命名,Hadoop项目的目标是实现遵从Apache 2.0许可的G公司的分布式文件系统和MapReduce技术。雅虎在2006年1月聘用了Doug Cutting,并投入了大量的工程资源来开发Hadoop。在2006年4月,该软件使用188台服务器,能够在47小时内,对1.9T的数据进行排序。虽然Hadoop的设计在很多方面优于Cheetah,但它在那时还太慢了,不能够满足我们的需求。在2008年4月,Hadoop用910台服务器,可以在209秒内对1T的数据进行排序。由于Hadoop性能的改进,我说服了运行组团队利用60台Web服务器和3台500GB的SATA驱动器,开始在Facebook第一次部署Hadoop集群。
在最开始,我们通过流方式在Hadoop和Cheetah中都导入一部分日志。Hadoop增强的编程能力加上其能够查询历史数据,从而推动了一些其他有趣的项目。其中一个应用是对所有Facebook用户交互的有向对进行打分来确定这些用户的亲密程度;这个分数可以被用于搜索和新闻订阅的排序。过了一段时间,我们把所有的Cheetah工作流都迁移到Hadoop上,废弃了前者。后来,事务数据库收集程序也都迁移到了Hadoop。
有了Hadoop,Facebook的基础设施可以支持对无结构化和结构化的数据的大规模分析。随着平台扩展为每天几百TB的数据规模,可以执行成千上万个任务,我们发现由于现在系统能够存储和检索的数据规模很大,我们可以构建新的应用,探索新问题的答案。
当Facebook向所有的用户开放注册,用户数在一些国家增长迅猛。但是在那时,我们无法根据国家执行点击流粒度分析。自从有了Hadoop集群,我们可以通过加载所有的历史访问日志到Hadoop,写一些简单的MapReduce任务来重新分析Facebook在一些国家,如加拿大和挪威,增长迅猛的原因。
Facebook的用户每天都有几百万的半公开(smi-public)的对话。据一次内部估算,留言板的数据量是博客的10倍!但是,这些对话的内容还是无法进行访问用来数据分析。在2007年,一个对语言学和统计学有强烈兴趣的暑期实习生Roddy Lindsay加入了数据组。通过Hadoop,Roddy能够独立构建一个强大的趋势分析系统,该系统名为Lexicon,每天晚上能够处理TB级别的留言板数据。可以通过URL:http://facebook.com/lexicon查看结果。
在为Facebook应用构建信誉积分系统时,我们证明了把不同系统的数据存储到相同的存储库中会导致严重的问题。在2007年5月启动了Facebook平台后不久,我们的用户就被“淹没”在添加应用的请求中。我们很快意识到需要添加一个工具来识别有用的应用和用户认为是spam(垃圾)的应用。通过收集API服务器的数据、用户信息以及来自网站本身的行为数据,系统能够构建一个模型对应用进行打分,这使得系统可以分发我们认为对用户最有用的应用邀请。
[1]猎豹和大象在此采用了借代的修辞方法。猎豹(ceetah)指的是Facebook的The Cheetah日志处理系统,大象(eephant)指代的是Hadoop项目,具体参见下文。