Hadoop教程:Hadoop在Facebook的應(yīng)用
Facebook作為全球知名的社交網(wǎng)站,擁有超過(guò)3億的活躍用戶,其中約有3千萬(wàn)用戶至少每天更新一次自己的狀態(tài);用戶每月總共上傳10億余張照 片、1千萬(wàn)個(gè)視頻;以及每周共享10億條內(nèi)容,包括日志、鏈接、新聞、微博等。因此Facebook需要存儲(chǔ)和處理的數(shù)據(jù)量是非常巨大的,每天新增加 4TB壓縮后的數(shù)據(jù),掃描135TB大小的數(shù)據(jù),在集群上執(zhí)行Hive任務(wù)超過(guò)7500次,每小時(shí)需要進(jìn)行8萬(wàn)次計(jì)算,所以高性能的云平臺(tái)對(duì) Facebook來(lái)說(shuō)是非常重要的,而Facebook主要將Hadoop平臺(tái)用于日志處理、推薦系統(tǒng)和數(shù)據(jù)倉(cāng)庫(kù)等方面。
Facebook將數(shù)據(jù)存儲(chǔ)在利用Hadoop/Hive搭建的數(shù)據(jù)倉(cāng)庫(kù)上,這個(gè)數(shù)據(jù)倉(cāng)庫(kù)擁有4800個(gè)內(nèi)核,具有5.5PB的存儲(chǔ)量,每個(gè)節(jié)點(diǎn)可 存儲(chǔ)12TB大小的數(shù)據(jù),同時(shí),它還具有兩層網(wǎng)絡(luò)拓?fù)?,如圖3-5所示。Facebook中的MapReduce集群是動(dòng)態(tài)變化的,它基于負(fù)載情況和集群 節(jié)點(diǎn)之間的配置信息可動(dòng)態(tài)動(dòng)。
圖 3-6為Facebook的數(shù)據(jù)倉(cāng)庫(kù)架構(gòu),在這個(gè)架構(gòu)中,網(wǎng)絡(luò)服務(wù)器和內(nèi)部服務(wù)生成日志數(shù)據(jù),這里Facebook使用開(kāi)源日志收集系統(tǒng),它可以將數(shù)以百 計(jì)的日志數(shù)據(jù)集存儲(chǔ)在NFS服務(wù)器上,但大部分日志數(shù)據(jù)會(huì)復(fù)制到同一個(gè)中心的HDFS實(shí)例中,而HDFS存儲(chǔ)的數(shù)據(jù)都會(huì)放到利用Hive構(gòu)建的數(shù)據(jù)倉(cāng)庫(kù) 中。Hive提供了類(lèi)SQL的語(yǔ)言來(lái)與MapReduce結(jié)合,創(chuàng)建并發(fā)布多種摘要和報(bào)告,以及在它們的基礎(chǔ)上進(jìn)行歷史分析。Hive上基于瀏覽器的接口 允許用戶執(zhí)行Hive查詢。Oracle和MySQL數(shù)據(jù)庫(kù)用來(lái)發(fā)布這些摘要,這些數(shù)據(jù)容量相對(duì)較小,但查詢頻率較高并需要實(shí)時(shí)響應(yīng)。一些舊的數(shù)據(jù)需要及 時(shí)歸檔,并存儲(chǔ)在較便宜的存儲(chǔ)器上,如圖3-7所示。
下 面介紹Facebook在AvatarNode和調(diào)度策略方面所做的一些工作。AvatarNode主要用于HDFS的恢復(fù)和啟動(dòng),若HDFS崩潰,原有 技術(shù)恢復(fù)首先需要花10~15分鐘來(lái)讀取12GB的文件鏡像并寫(xiě)回,還要用20~30分鐘處理來(lái)自2000個(gè)DataNode的數(shù)據(jù)塊報(bào)告,最后用 40~60分鐘來(lái)恢復(fù)崩潰的NameNode和部署軟件。表3-1說(shuō)明了BackupNode和AvatarNode的區(qū)別,AvatarNode作為普 通的NameNode啟動(dòng),處理所有來(lái)自DataNode的消息。AvatarDataNode與DataNode相似,支持多線程和針對(duì)多個(gè)主節(jié)點(diǎn)的多 隊(duì)列,但無(wú)法區(qū)分原始和備份。人工恢復(fù)使用AvatarShell命令行工具,AvatarShell執(zhí)行恢復(fù)操作并更新ZooKeeper的 zNode,恢復(fù)過(guò)程對(duì)用戶來(lái)說(shuō)是透明的。分布式Avatar文件系統(tǒng)實(shí)現(xiàn)在現(xiàn)有文件系統(tǒng)的上層。
表3-1 BackupNode和AvatarNode的區(qū)別
基于位置的調(diào)度策略在實(shí)際應(yīng)用中存在著一些問(wèn)題:如需要高內(nèi)存的任務(wù)可能會(huì)被分配給擁有低內(nèi)存的TaskTracker;CPU資源有時(shí)未被充分利 用;為不同硬件的TaskTracker進(jìn)行配置也比較困難等。Facebook采用基于資源的調(diào)度策略,即公平享有調(diào)度方法,實(shí)時(shí)監(jiān)測(cè)系統(tǒng)并收集CPU 和內(nèi)存的使用情況,調(diào)度器會(huì)分析實(shí)時(shí)的內(nèi)存消耗情況,然后在任務(wù)之間公平分配任務(wù)的內(nèi)存使用量。它通過(guò)讀取/proc/目錄解析進(jìn)程樹(shù),并收集進(jìn)程樹(shù)上所 有的CPU和內(nèi)存的使用信息,然后通過(guò)TaskCounters在心跳(heartbeat)時(shí)發(fā)送信息。
Facebook的數(shù)據(jù)倉(cāng)庫(kù)使用Hive,其構(gòu)架如圖3-8所示,有關(guān)Hive查詢語(yǔ)言的相關(guān)知識(shí)可查閱第11章的內(nèi)容。這里HDFS支持三種文件 格式:文本文件(TextFile),方便其他應(yīng)用程序讀寫(xiě);順序文件(SequenceFile),只有Hadoop能夠讀取并支持分塊壓 縮;RCFile,使用順序文件基于塊的存儲(chǔ)方式,每個(gè)塊按列存儲(chǔ),這樣有較好的壓縮率和查詢性能。Facebook未來(lái)會(huì)在Hive上進(jìn)行改進(jìn),以支持 索引、視圖、子查詢等新功能。
現(xiàn)在Facebook使用Hadoop遇到的挑戰(zhàn)有:
- 服務(wù)質(zhì)量和隔離性方面,較大的任務(wù)會(huì)影響集群性能;
- 安全性方面,如果軟件漏洞導(dǎo)致NameNode事務(wù)日志崩潰該如何處理;
- 數(shù)據(jù)歸檔方面,如何選擇歸檔數(shù)據(jù),以及數(shù)據(jù)如何歸檔;
- 性能提升方面,如何有效地解決瓶頸等。
作者:陸嘉恒