解密百度大數(shù)據(jù):百度是如何使用hadoop的,并且做了哪些改進(jìn)?

6 評(píng)論 11620 瀏覽 20 收藏 10 分鐘

引讀:百度作為全球最大的中文搜索引擎公司,提供基于搜索引擎的各種產(chǎn)品,幾乎覆蓋了中文網(wǎng)絡(luò)世界中所有的搜索需求,因此,百度對(duì)海量數(shù)據(jù)處理的要求是比較高的, 要在線下對(duì)數(shù)據(jù)進(jìn)行分析,還要在規(guī)定的時(shí)間內(nèi)處理完并反饋到平臺(tái)上。百度在互聯(lián)網(wǎng)領(lǐng)域的平臺(tái)需求要通過(guò)性能較好的云平臺(tái)進(jìn)行處理了,Hadoop就是很好 的選擇。

 

在百度,Hadoop主要應(yīng)用于以下幾個(gè)方面:

日志的存儲(chǔ)和統(tǒng)計(jì);

網(wǎng)頁(yè)數(shù)據(jù)的分析和挖掘;

商業(yè)分析,如用戶的行為和廣告關(guān)注度等;

在線數(shù)據(jù)的反饋,及時(shí)得到在線廣告的點(diǎn)擊情況;

用戶網(wǎng)頁(yè)的聚類,分析用戶的推薦度及用戶之間的關(guān)聯(lián)度。

MapReduce主要是一種思想,不能解決所有領(lǐng)域內(nèi)與計(jì)算有關(guān)的問(wèn)題,百度的研究人員認(rèn)為比較好的模型應(yīng)該如下圖:

121813vuud7x0jp7umpofq

HDFS?實(shí)現(xiàn)共享存儲(chǔ),一些計(jì)算使用MapReduce解決,一些計(jì)算使用MPI解決,而還有一些計(jì)算需要通過(guò)兩者來(lái)共同處理。因?yàn)镸apReduce適合處理數(shù) 據(jù)很大且適合劃分的數(shù)據(jù),所以在處理這類數(shù)據(jù)時(shí)就可以用MapReduce做一些過(guò)濾,得到基本的向量矩陣,然后通過(guò)MPI進(jìn)一步處理后返回結(jié)果,只有整 合技術(shù)才能更好地解決問(wèn)題。

百度現(xiàn)在擁有3個(gè)Hadoop集群,總規(guī)模在700臺(tái)機(jī)器左右,其中有100多臺(tái)新機(jī)器和600多臺(tái)要淘汰的機(jī)器(它們的計(jì)算能力相當(dāng)于200多臺(tái)新機(jī)器),不過(guò)其規(guī)模還在不斷的增加中?,F(xiàn)在每天運(yùn)行的MapReduce任務(wù)在3000個(gè)左右,處理數(shù)據(jù)約120TB/天。

百度為了更好地用Hadoop進(jìn)行數(shù)據(jù)處理,在以下幾個(gè)方面做了改進(jìn)和調(diào)整:

(1)調(diào)整MapReduce策略

限制作業(yè)處于運(yùn)行狀態(tài)的任務(wù)數(shù);

調(diào)整預(yù)測(cè)執(zhí)行策略,控制預(yù)測(cè)執(zhí)行量,一些任務(wù)不需要預(yù)測(cè)執(zhí)行;

根據(jù)節(jié)點(diǎn)內(nèi)存狀況進(jìn)行調(diào)度;

平衡中間結(jié)果輸出,通過(guò)壓縮處理減少I/O負(fù)擔(dān)。

(2)改進(jìn)HDFS的效率和功能

權(quán)限控制,在PB級(jí)數(shù)據(jù)量的集群上數(shù)據(jù)應(yīng)該是共享的,這樣分析起來(lái)比較容易,但是需要對(duì)權(quán)限進(jìn)行限制;

讓分區(qū)與節(jié)點(diǎn)獨(dú)立,這樣,一個(gè)分區(qū)壞掉后節(jié)點(diǎn)上的其他分區(qū)還可以正常使用;

修改DSClient選取塊副本位置的策略,增加功能使DFSClient選取塊時(shí)跳過(guò)出錯(cuò)的DataNode;

解決VFS(Virtual File System)的POSIX(Portable Operating System Interface of Unix)兼容性問(wèn)題。

(3)修改Speculative的執(zhí)行策略

采用速率倒數(shù)替代速率,防止數(shù)據(jù)分布不均時(shí)經(jīng)常不能啟動(dòng)預(yù)測(cè)執(zhí)行情況的發(fā)生;

增加任務(wù)時(shí)必須達(dá)到某個(gè)百分比后才能啟動(dòng)預(yù)測(cè)執(zhí)行的限制,解決reduce運(yùn)行等待map數(shù)據(jù)的時(shí)間問(wèn)題;

只有一個(gè)map或reduce時(shí),可以直接啟動(dòng)預(yù)測(cè)執(zhí)行。

(4)對(duì)資源使用進(jìn)行控制

對(duì)應(yīng)用物理內(nèi)存進(jìn)行控制。如果內(nèi)存使用過(guò)多會(huì)導(dǎo)致操作系統(tǒng)跳過(guò)一些任務(wù),百度通過(guò)修改Linux內(nèi)核對(duì)進(jìn)程使用的物理內(nèi)存進(jìn)行獨(dú)立的限制,超過(guò)閾值可以終止進(jìn)程。

分組調(diào)度計(jì)算資源,實(shí)現(xiàn)存儲(chǔ)共享、計(jì)算獨(dú)立,在Hadoop中運(yùn)行的進(jìn)程是不可搶占的。

在大塊文件系統(tǒng)中,X86平臺(tái)下一個(gè)頁(yè)的大小是4KB。如果頁(yè)較小,管理的數(shù)據(jù)就會(huì)很多,會(huì)增加數(shù)據(jù)操作的代價(jià)并影響計(jì)算效率,因此需要增加頁(yè)的大小。

百度在使用Hadoop時(shí)也遇到了一些問(wèn)題,主要有:

MapReduce的效率問(wèn)題:比如,如何在shuffle效率方面減少I/O次數(shù)以提高并行效率;如何在排序效率方面設(shè)置排序?yàn)榭膳渲玫?,因?yàn)榕判蜻^(guò)程會(huì)浪費(fèi)很多的計(jì)算資源,而一些情況下是不需要排序的。

HDFS的效率和可靠性問(wèn)題:如何提高隨機(jī)訪問(wèn)效率,以及數(shù)據(jù)寫入的實(shí)時(shí)性問(wèn)題,如果Hadoop每寫一條日志就在HDFS上存儲(chǔ)一次,效率會(huì)很低。

內(nèi)存使 用的問(wèn)題:reducer端的shuffle會(huì)頻繁地使用內(nèi)存,這里采用類似Linux的buddy system來(lái)解決,保證Hadoop用最小的開(kāi)銷達(dá)到最高的利用率;當(dāng)Java?進(jìn)程內(nèi)容使用內(nèi)存較多時(shí),可以調(diào)整垃圾回收(GC)策略;有時(shí)存在大量的內(nèi)存復(fù)制現(xiàn)象,這會(huì)消耗大量CPU資源,同時(shí)還會(huì)導(dǎo)致內(nèi)存使用峰值極高,這時(shí)需要 減少內(nèi)存的復(fù)制。

作業(yè)調(diào)度的問(wèn)題:如何限制任務(wù)的map和reduce計(jì)算單元的數(shù)量,以確保重要計(jì)算可以有足夠的計(jì)算單元;如何對(duì)TaskTracker進(jìn)行分組控制,以限制作業(yè)執(zhí)行的機(jī)器,同時(shí)還可以在用戶提交任務(wù)時(shí)確定執(zhí)行的分組并對(duì)分組進(jìn)行認(rèn)證。

性能提 升的問(wèn)題:UserLogs cleanup在每次task結(jié)束的時(shí)候都要查看一下日志,以決定是否清除,這會(huì)占用一定的任務(wù)資源,可以通過(guò)將清理線程從子Java進(jìn)程移到TaskTracker來(lái)解決;子Java進(jìn)程會(huì)對(duì)文本行進(jìn)行切割而map和reduce進(jìn)程則會(huì)重新切割,這將造成重復(fù)處理,這時(shí)需要關(guān)掉Java進(jìn)程 的切割功能;在排序的時(shí)候也可以實(shí)現(xiàn)并行排序來(lái)提升性能;實(shí)現(xiàn)對(duì)數(shù)據(jù)的異步讀寫也可以提升性能。

健壯性 的問(wèn)題:需要對(duì)mapper和reducer程序的內(nèi)存消耗進(jìn)行限制,這就要修改Linux內(nèi)核,增加其限制進(jìn)程的物理內(nèi)存的功能;也可以通過(guò)多個(gè)map?程序共享一塊內(nèi)存,以一定的代價(jià)減少對(duì)物理內(nèi)存的使用;還可以將DataNode和TaskTracker的UGI配置為普通用戶并設(shè)置賬號(hào)密碼;或者讓?DataNode和TaskTracker分賬號(hào)啟動(dòng),確保HDFS數(shù)據(jù)的安全性,防止Tracker操作DataNode中的內(nèi)容;在不能保證用戶的每 個(gè)程序都很健壯的情況下,有時(shí)需要將進(jìn)程終止掉,但要保證父進(jìn)程終止后子進(jìn)程也被終止。

Streaming?局限性的問(wèn)題:比如,只能處理文本數(shù)據(jù),mapper和reducer按照文本行的協(xié)議通信,無(wú)法對(duì)二進(jìn)制的數(shù)據(jù)進(jìn)行簡(jiǎn)單處理。為了解決這個(gè)問(wèn)題,百度人 員新寫了一個(gè)類Bistreaming(Binary Streaming),這里的子Java進(jìn)程mapper和reducer按照(KeyLen,Key,ValLen,Value)的方式通信,用戶可以 按照這個(gè)協(xié)議編寫程序。

用戶認(rèn)證的問(wèn)題:這個(gè)問(wèn)題的解決辦法是讓用戶名、密碼、所屬組都在NameNode和Job Tracker上集中維護(hù),用戶連接時(shí)需要提供用戶名和密碼,從而保證數(shù)據(jù)的安全性。

百度下一步的工作重點(diǎn)可能主要會(huì)涉及以下內(nèi)容:

內(nèi)存方面,降低NameNode的內(nèi)存使用并研究JVM的內(nèi)存管理;

調(diào)度方面,改進(jìn)任務(wù)可以被搶占的情況,同時(shí)開(kāi)發(fā)出自己的基于Capacity的作業(yè)調(diào)度器,讓等待作業(yè)隊(duì)列具有優(yōu)先級(jí)且隊(duì)列中的作業(yè)可以設(shè)置Capacity,并可以支持TaskTracker分組;

壓縮算 法,選擇較好的方法提高壓縮比、減少存儲(chǔ)容量,同時(shí)選取高效率的算法以進(jìn)行shuffle數(shù)據(jù)的壓縮和解壓;對(duì)mapper程序和reducer程序使用 的資源進(jìn)行控制,防止過(guò)度消耗資源導(dǎo)致機(jī)器死機(jī)。以前是通過(guò)修改Linux內(nèi)核來(lái)進(jìn)行控制的,現(xiàn)在考慮通過(guò)在Linux中引入cgroup來(lái)對(duì)?mapper和reducer使用的資源進(jìn)行控制;將DataNode的并發(fā)數(shù)據(jù)讀寫方式由多線程改為select方式,以支持大規(guī)模并發(fā)讀寫和?Hypertable的應(yīng)用。

百度同時(shí)也在使用Hypertable,它是以Google發(fā)布的BigTable為基礎(chǔ)的開(kāi)源分布式數(shù)據(jù)存儲(chǔ)系統(tǒng),百度將它作為分析用戶行為的平臺(tái),同時(shí)在元數(shù)據(jù)集中化、內(nèi)存占用優(yōu)化、集群安全停機(jī)、故障自動(dòng)恢復(fù)等方面做了一些改進(jìn)。

來(lái)源:開(kāi)源中國(guó)

 

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 和hadoop實(shí)戰(zhàn)第二版(陸嘉恒)第457頁(yè)好像。。。。

    來(lái)自北京 回復(fù)