Hadoop YARN資源隔離技術(shù) - yanghuahui - 博客園 http://www.cnblogs.com/yanghuahui/p/3762439.html
YARN對內(nèi)存資源和CPU資源采用了不同的資源隔離方案堵幽。對于內(nèi)存資源稀蟋,它是一種限制性資源芯义,它的量的大小直接決定應(yīng)用程序的死活数冬,因為應(yīng)用程序到達內(nèi)存限制,會發(fā)生OOM刻坊,就會被殺死痹换。CPU資源一般用Cgroups進行資源控制固棚,Cgroups控制資源測試可以參見這篇博文Cgroups控制cpu,內(nèi)存仁锯,io示例耀找,內(nèi)存資源隔離除Cgroups之外提供了另外一個更靈活的方案,就是線程監(jiān)控方案扑馁。
默認情況下YARN采用線程監(jiān)控的方案控制內(nèi)存使用涯呻,采用這種機制的原因有兩點:
1.Java創(chuàng)建子進程采用了“fork()+exec()”的方案,子進程啟動的瞬間腻要,它使用的內(nèi)存量和父進程一致复罐。一個進程使用的內(nèi)存量可能瞬間翻倍,然后又降下來雄家,采用線程監(jiān)控的方法可防止這種情況下導(dǎo)致的swap操作效诅。
2.通常情況下,Hadoop任務(wù)運行在獨立的Java虛擬機中,可以達到資源隔離的目的乱投。Hadoop Streaming是Hadoop提供的一個編程工具咽笼,它允許用戶使用任何可執(zhí)行文件或者腳本文件作為Mapper和Reducer,通過Hadoop Streaming編寫的MapReduce應(yīng)用程序中每個任務(wù)可以由不同的編程語言環(huán)境組成戚炫,這難以通過創(chuàng)建單獨的虛擬機達到資源隔離的效果剑刑。
綜上,為了獲取更加靈活的資源控制效果双肤,Hadoop對內(nèi)存的資源隔離采用線程監(jiān)控方案施掏。解決方案具體如下:
1.linux系統(tǒng)的/proc/<pid>/stat文件,實時的反應(yīng)進程樹使用的內(nèi)存總量茅糜,可以基于此判斷任務(wù)粒度的內(nèi)存使用量是否超過設(shè)定的最大值七芭。getconf PAGESIZE可以獲取page大小。
2.為了避免JVM的“fork()+exec()”模型引發(fā)的誤殺操作蔑赘,Hadoop賦予每個進程”年齡”屬性狸驳,并規(guī)定剛啟動進程的年齡是1,監(jiān)控線程每更新一次缩赛,各個進程年齡加1耙箍,在此基礎(chǔ)上,選擇被殺死進程組的標準如下:如果一個進程組中所有的進程(年齡大于0)總內(nèi)存超過用戶設(shè)置的最大值的兩倍峦筒,或者所有年齡大于1的進程總內(nèi)存量超過用戶設(shè)置最大值究西,則認為該進程組過量使用內(nèi)存,就將其kill掉物喷。
這種細粒度卤材,更加靈活的線程監(jiān)控資源隔離方案,還是值得學(xué)習(xí)與稱道的峦失,記錄于此扇丛,以后設(shè)計系統(tǒng)可以參考。
參考:
《Hadoop技術(shù)內(nèi)幕--深入解析YARN架構(gòu)設(shè)計與實現(xiàn)原理》
http://blog.csdn.net/zjl_1026_2001/article/details/2294067
http://dongxicheng.org/mapreduce/hadoop-streaming-programming/
E-mail: huahuiyang@gmail.com https://cn.linkedin.com/pub/huahui-yang/91/13a/105