信息平臺(tái)和數(shù)據(jù)科學(xué)家的興起
Facebook有了“自知之明”
在2005年9月,F(xiàn)acebook首次向非大學(xué)生公開,允許高中生注冊(cè)賬號(hào)。忠實(shí)的用戶憤怒了,但Facebook團(tuán)隊(duì)認(rèn)為這是為網(wǎng)站做出的正常方向。那么它該如何證明它的方案是正確的呢?
此外,在幾乎所有可登錄Facebook網(wǎng)站的學(xué)校中,F(xiàn)acebook已經(jīng)滲入學(xué)生當(dāng)中,但還是在有部分學(xué)校中,該網(wǎng)站一直不受青睞。和那些更成功的網(wǎng)絡(luò)相比,這些落后的網(wǎng)絡(luò)對(duì)于Facebook有什么區(qū)別呢?Facebook團(tuán)隊(duì)?wèi)?yīng)該如何做才能激勵(lì)他們的成功?
當(dāng)我在2006年2月參加Facebook面試時(shí),他們正積極地期望找到這些問題的答案。我曾在大學(xué)學(xué)習(xí)數(shù)學(xué),在華爾街工作近一年,工作內(nèi)容是構(gòu)建模型來預(yù)測(cè)利率、價(jià)格復(fù)雜的衍生產(chǎn)品和對(duì)沖抵押貸款池;有一定編程經(jīng)驗(yàn),GPA成績(jī)“暗淡”。雖然我的背景可能不太理想,但是Facebook卻給了我研究科學(xué)家的職位。
幾乎同時(shí),F(xiàn)acebook聘用了一位報(bào)告分析主管。該主管在解決問題方面的經(jīng)驗(yàn)遠(yuǎn)遠(yuǎn)超過我。我們和另外一位工程師一起,開始著手構(gòu)建一個(gè)數(shù)據(jù)收集和存儲(chǔ)平臺(tái),以便找到我們產(chǎn)品以上問題的答案。
我們第一個(gè)嘗試是構(gòu)建一個(gè)離線信息庫,其涉及兩個(gè)方面:一是用Python腳本把查詢分發(fā)到Facebook的MySQL服務(wù)器層,二是采用C++實(shí)現(xiàn)守護(hù)進(jìn)程,實(shí)時(shí)地處理事件日志。當(dāng)腳本可以如期運(yùn)行,我們每天收集大約10GB的數(shù)據(jù)。我后來明白系統(tǒng)的這部分通常稱為“ETL”過程,即抽取、轉(zhuǎn)換和加載。
Python腳本和C++守護(hù)進(jìn)程從Facebook的數(shù)據(jù)源系統(tǒng)中抽取數(shù)據(jù),然后這些數(shù)據(jù)又被加載到MySQL數(shù)據(jù)庫用于離線查詢。我們?cè)诎@些數(shù)據(jù)的MySQL上又運(yùn)行了一些腳本和查詢,對(duì)數(shù)據(jù)進(jìn)行聚集,以便得到更有用的表現(xiàn)方式。這種用于決策支持的離線數(shù)據(jù)庫即“數(shù)據(jù)倉庫”。
最后,通過簡(jiǎn)單的PHP腳本把數(shù)據(jù)從離線的MySQL數(shù)據(jù)庫抽取出來,向內(nèi)部用戶展示收集到的信息摘要(Summary)。這是我們第一次可以回答網(wǎng)站特性對(duì)用戶行為的影響。早期通過以下幾種渠道分析最大化增長(zhǎng):登出用戶的默認(rèn)頁面的布局、邀請(qǐng)來源、Email聯(lián)系方式導(dǎo)入器的設(shè)計(jì)。除了以上分析,我們開始通過歷史數(shù)據(jù)開發(fā)簡(jiǎn)單的產(chǎn)品,包括對(duì)贊助商成員特性進(jìn)行聚集的內(nèi)部項(xiàng)目。實(shí)踐證明,該項(xiàng)目很受品牌廣告商歡迎。
我那時(shí)沒有意識(shí)到,實(shí)際上,通過ETL框架、數(shù)據(jù)倉庫和內(nèi)部控制臺(tái),我們已經(jīng)構(gòu)建了一個(gè)簡(jiǎn)單的“商業(yè)智能”系統(tǒng)。
“獵豹”和“大象”(譯注1)
從第一天開始對(duì)Facebook的點(diǎn)擊流寫日志起,到現(xiàn)在我們已經(jīng)收集了超過400GB的數(shù)據(jù)。對(duì)該數(shù)據(jù)集的加載、索引和聚集操作對(duì)Oracle數(shù)據(jù)庫的負(fù)載很重。雖然做了很多優(yōu)化操作,但是我們還是無法在24小時(shí)內(nèi)完成對(duì)一天的點(diǎn)擊流的聚集操作。很顯然,我們需要把日志文件聚集到數(shù)據(jù)庫外,只在數(shù)據(jù)庫中保存摘要信息供后期查詢。
幸運(yùn)的是,一個(gè)來自某大型網(wǎng)站的頂尖工程師加入了我們團(tuán)隊(duì),他有過處理大規(guī)模Web點(diǎn)擊流的經(jīng)驗(yàn)。僅僅幾周的時(shí)間,該工程師就構(gòu)建了一個(gè)名為Cheetah(獵豹)的并發(fā)日志處理系統(tǒng),該系統(tǒng)能夠在兩個(gè)小時(shí)內(nèi)處理一天的點(diǎn)擊流。這實(shí)在太讓人振奮了。
但是,Cheetah存在一些不足:首先,在處理完點(diǎn)擊流數(shù)據(jù)后,原始數(shù)據(jù)還是以歸檔方式保存,不能夠被再次查詢。此外,Cheetah是從一個(gè)共享的NetApp歸檔數(shù)據(jù)中獲取點(diǎn)擊流數(shù)據(jù),而NetApp歸檔數(shù)據(jù)的讀帶寬受限。每個(gè)日志文件的“模式”是嵌入在處理腳本中,而不是保存為可查詢格式。我們沒有收集進(jìn)程信息,而是通過Unix基礎(chǔ)工具cron來調(diào)Cheetah任務(wù),因此無法應(yīng)用復(fù)雜的加載共享邏輯。最重要的是,Cheetah不是開源的。我們團(tuán)隊(duì)很小,資源有限,無法分配更多的資源來開發(fā)、維護(hù)和給新用戶培訓(xùn)使用Cheetah系統(tǒng)。
Apache的Hadoop項(xiàng)目,由Doug Cutting和Mike Cafarella于2005年末啟動(dòng),是我們?nèi)〈鶦heetah的最佳選擇。以Doug的孩子的玩具大象命名,Hadoop項(xiàng)目的目標(biāo)是實(shí)現(xiàn)遵從Apache2.0許可的G公司的分布式文件系統(tǒng)和MapReduce技術(shù)。雅虎在2006年1月聘用了Doug Cutting,并投入了大量的工程資源來開發(fā)Hadoop。在2006年4月,該軟件使用188臺(tái)服務(wù)器,能夠在47小時(shí)內(nèi),對(duì)1.9TB的數(shù)據(jù)進(jìn)行排序。雖然Hadoop的設(shè)計(jì)在很多方面優(yōu)于Cheetah,但它在那時(shí)還太慢了,不能夠滿足我們的需求。在2008年4月,Hadoop用910臺(tái)服務(wù)器,可以在209秒內(nèi)對(duì)1TB的數(shù)據(jù)進(jìn)行排序。由于Hadoop性能的改進(jìn),我說服了運(yùn)行組團(tuán)隊(duì)利用60臺(tái)Web服務(wù)器和3臺(tái)500GB的SATA驅(qū)動(dòng)器,開始在Facebook第一次部署Hadoop集群。
在最開始, 我們通過流方式在Hadoop和Cheetah中都導(dǎo)入一部分日志。Hadoop增強(qiáng)的編程能力加上其能夠查詢歷史數(shù)據(jù),從而推動(dòng)了一些其他有趣的項(xiàng)目。其中一個(gè)應(yīng)用是對(duì)所有Facebook用戶交互的有向?qū)M(jìn)行打分來確定這些用戶的親密程度;這個(gè)分?jǐn)?shù)可以被用于搜索和新聞?dòng)嗛喌呐判。過了一段時(shí)間,我們把所有的Cheetah工作流都遷移到Hadoop上,廢棄了前者。后來,事務(wù)數(shù)據(jù)庫收集程序也都遷移到了Hadoop。
有了Hadoop,F(xiàn)acebook的基礎(chǔ)設(shè)施可以支持對(duì)無結(jié)構(gòu)化和結(jié)構(gòu)化的數(shù)據(jù)的大規(guī)模分析。隨著平臺(tái)擴(kuò)展為每天幾百TB的數(shù)據(jù)規(guī)模,可以執(zhí)行成千上萬個(gè)任務(wù),我們發(fā)現(xiàn)由于現(xiàn)在系統(tǒng)能夠存儲(chǔ)和檢索的數(shù)據(jù)規(guī)模很大,我們可以構(gòu)建新的應(yīng)用,探索新問題的答案。
當(dāng)Facebook向所有的用戶開放注冊(cè),用戶數(shù)在一些國家增長(zhǎng)迅猛。但是在那時(shí),我們無法根據(jù)國家執(zhí)行點(diǎn)擊流粒度分析。自從有了Hadoop集群,我們可以通過加載所有的歷史訪問日志到Hadoop,寫一些簡(jiǎn)單的MapReduce任務(wù)來重新分析Facebook在一些國家,如加拿大和挪威增長(zhǎng)迅猛的原因。
Facebook的用戶每天都有幾百萬半公開的對(duì)話。據(jù)一次內(nèi)部估算,留言板的數(shù)據(jù)量是博客的10倍!但是,這些對(duì)話的內(nèi)容還是無法進(jìn)行訪問用來數(shù)據(jù)分析。在2007年,一個(gè)對(duì)語言學(xué)和統(tǒng)計(jì)學(xué)有強(qiáng)烈興趣的暑期實(shí)習(xí)生Roddy Lindsay加入了數(shù)據(jù)組。通過Hadoop,Roddy能夠獨(dú)立構(gòu)建一個(gè)強(qiáng)大的趨勢(shì)分析系統(tǒng),該系統(tǒng)名為L(zhǎng)exicon,每天晚上能夠處理TB級(jí)別的留言板數(shù)據(jù)。
在為Facebook應(yīng)用構(gòu)建信譽(yù)積分系統(tǒng)時(shí),我們證明了把不同系統(tǒng)的數(shù)據(jù)存儲(chǔ)到相同的存儲(chǔ)庫中會(huì)導(dǎo)致嚴(yán)重的問題。在2007年5月啟動(dòng)了Facebook平臺(tái)后不久,我們的用戶就被“淹沒”在添加應(yīng)用的請(qǐng)求中。我們很快意識(shí)到需要添加一個(gè)工具來識(shí)別有用的應(yīng)用和用戶認(rèn)為是spam的應(yīng)用。通過收集API服務(wù)器的數(shù)據(jù)、用戶信息以及來自網(wǎng)站本身的行為數(shù)據(jù),系統(tǒng)能夠構(gòu)建一個(gè)模型對(duì)應(yīng)用進(jìn)行打分,這使得系統(tǒng)可以分發(fā)我們認(rèn)為對(duì)用戶最有用的應(yīng)用邀請(qǐng)。
新工具和應(yīng)用研究
在Facebook,絕大部分Hadoop集群的早期用戶都是渴望追求新興技術(shù)的工程師。為了使企業(yè)的更多人可以訪問信息,我們?cè)贖adoop上構(gòu)建了一個(gè)數(shù)據(jù)倉庫框架,并稱為Hive。
Hive的查詢語言類似于SQL,支持嵌入MapReduce邏輯、表分區(qū)、抽樣和處理任意序列化數(shù)據(jù)的能力。最后一個(gè)特征至關(guān)重要,因?yàn)槭占紿adoop的數(shù)據(jù)在結(jié)構(gòu)上不斷變化;允許用戶指定自己的序列化模式,可以使我們把為數(shù)據(jù)指定結(jié)構(gòu)問題轉(zhuǎn)為把數(shù)據(jù)加載到Hive。此外,我們還實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的用戶界面來構(gòu)建Hive查詢,名為Hipal。使用這些新的工具,市場(chǎng)、產(chǎn)品管理、銷售和客戶服務(wù)的非工程師都能夠在幾TB的數(shù)據(jù)上自己執(zhí)行查詢。經(jīng)過幾個(gè)月的內(nèi)部使用后,在Apache2.0許可下,Hive成為Hadoop的官方子系統(tǒng),現(xiàn)在仍然在積極地開發(fā)中。
除了Hive,我們構(gòu)建了分享圖表和圖形的門戶Argus(受IBM的Many Eyes 項(xiàng)目啟發(fā)) 、工作流管理系統(tǒng)Databee、用Python寫MapReduce腳本的框架PyHive、為終端用戶提供結(jié)構(gòu)化數(shù)據(jù)服務(wù)的存儲(chǔ)系統(tǒng)Cassandra(現(xiàn)在作為開源,在Apache孵化器中)。
隨著這些新系統(tǒng)的穩(wěn)定,我們最終構(gòu)建了由單一Hadoop集群管理的多層模式的數(shù)據(jù)。企業(yè)中的所有數(shù)據(jù),包括應(yīng)用日志、事務(wù)數(shù)據(jù)庫和Web爬蟲,都以原始數(shù)據(jù)格式,定期收集到Hadoop分布式文件系統(tǒng)中。夜間執(zhí)行的幾萬個(gè)Databee進(jìn)程將把一部分?jǐn)?shù)據(jù)轉(zhuǎn)化為結(jié)構(gòu)化格式,把它放入由Hive管理的HDFS文件目錄中。在Hive中執(zhí)行下一步聚集操作,用來生成Argus服務(wù)報(bào)表。此外,在HDFS內(nèi),在自己的home目錄下維護(hù)“沙盒”的工程師可以運(yùn)行原型任務(wù)。
目前,Hadoop包含了將近2.5PB的數(shù)據(jù),而且以每天15TB的數(shù)量級(jí)增加。每天都有3000個(gè)以上的MapReduce任務(wù)在運(yùn)行,處理55TB的數(shù)據(jù)。為了適應(yīng)這些運(yùn)行在集群上的任務(wù)的不同優(yōu)先級(jí),我們構(gòu)建了作業(yè)調(diào)度器,實(shí)現(xiàn)在多個(gè)隊(duì)列上的資源共享。
除了支持內(nèi)部和外部的報(bào)表、a/b測(cè)試管道和很多不同的數(shù)據(jù)密集型產(chǎn)品和服務(wù),F(xiàn)acebook的Hadoop集群可以實(shí)現(xiàn)一些有趣的應(yīng)用研究項(xiàng)目。
由數(shù)據(jù)科學(xué)家Itamar Rosenn 和Cameron Marlow主持的一個(gè)縱向研究項(xiàng)目用于預(yù)測(cè)長(zhǎng)期的用戶參與的最重要的因素是什么。我們使用信息平臺(tái)來選擇一些用戶的樣本,刪除游離點(diǎn),并對(duì)參與度的不同尺度使用一些最小角度回歸技術(shù)來生成大量的特性。有些特性能夠通過Hadoop生成,包含計(jì)算好友網(wǎng)絡(luò)密度的各種尺度和基于信息特性的用戶范圍。
另一個(gè)探索激勵(lì)新用戶貢獻(xiàn)內(nèi)容的動(dòng)機(jī)的內(nèi)部研究,在2009年CHI 會(huì)議的論文“Feed Me: Motivating Newcomer Contribution in Social Network Sites”中有描述。Fa c ebook數(shù)據(jù)組的一個(gè)更新的研究是查看信息流是如何在Facebook的社會(huì)圖中流動(dòng),該研究的標(biāo)題為“Gesundheit! Modeling Contagion through Facebook News Feed”,已被2009 ICWSM會(huì)議接收。
在Facebook,每天收集證據(jù)、測(cè)試假設(shè)、構(gòu)建應(yīng)用和使用共享的信息平臺(tái)生成新的洞察。而在Facebook之外,其他公司也同時(shí)構(gòu)建了類似的系統(tǒng)。
數(shù)據(jù)科學(xué)家
在最近的訪談中,G公司首席經(jīng)濟(jì)學(xué)家Hal Varian強(qiáng)調(diào)了員工需要能夠從之前描述的信息平臺(tái)中抽取信息。正如Varian所言:“找到能夠?yàn)橐恍┳兊闷毡榍伊畠r(jià)的東西提供稀缺、互補(bǔ)的服務(wù)。那么,是什么變得普遍且廉價(jià)?數(shù)據(jù)。是什么與數(shù)據(jù)相輔相成?分析。”
在Facebook,我們發(fā)現(xiàn)傳統(tǒng)的頭銜如商業(yè)分析師、統(tǒng)計(jì)學(xué)家、工程師和研究科學(xué)家都不能確切地定義我們團(tuán)隊(duì)的角色。該角色的工作是變化多樣的:在任意給定的一天,團(tuán)隊(duì)的一個(gè)成員可以用Python實(shí)現(xiàn)一個(gè)多階段的處理管道流、設(shè)計(jì)假設(shè)檢驗(yàn)、用工具R在數(shù)據(jù)樣本上執(zhí)行回歸測(cè)試、在Hadoop上為數(shù)據(jù)密集型產(chǎn)品或服務(wù)設(shè)計(jì)和實(shí)現(xiàn)算法,或者把我們分析的結(jié)果以清晰簡(jiǎn)潔的方式展示給企業(yè)的其他成員。為了掌握完成這多方面任務(wù)需要的技術(shù),我們創(chuàng)造了“數(shù)據(jù)科學(xué)家”這種角色。