我司生產(chǎn)環(huán)境的大數(shù)據(jù)集群是用CDH部署的 版本有5.11.1? ? 5.14.1? ? 5.16.1 這三個版本.
這里主要是講一下生產(chǎn)上面 Hadoop的資源配置情況
一、DataNode配置
為了計算時保證數(shù)據(jù)本地化,DataNode進程所在的節(jié)點上也會部署NodeManager進程,做到存儲計算一體
DataNode的內(nèi)存資源配置 2G內(nèi)存,如果數(shù)據(jù)量比較大 可以設(shè)置3G 甚至4G。我司生產(chǎn)上配了2G
二、NodeManager配置
NodeManager的內(nèi)存資源配置為4G,一般4G已經(jīng)夠用了
三、Container配置說明
相關(guān)參數(shù)文檔參見:http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.16.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
生產(chǎn)上的機器內(nèi)存是96G 12個核 我們一般預(yù)留了20%的內(nèi)存作為系統(tǒng)預(yù)留,用來支撐系統(tǒng)運行、CM的agent的運行、其他非CDH的組件的運行及將來可能部署的組件預(yù)留
96*(1-20%)=76.8G
大約算成76G內(nèi)存 除去DataNode和NodeManager的內(nèi)存,留給Container的最大可用內(nèi)存為70G
相關(guān)參數(shù)(在CM的web界面上修改配置):
yarn.nodemanager.resource.memory-mb 該參數(shù)是用來指定可以給Container用的物理內(nèi)存 默認8192MB ,需要修改
yarn.scheduler.minimum-allocation-mb 該參數(shù)指定一個Container最小需要的內(nèi)存 默認1024MB,一般不需要修改
yarn.scheduler.maximum-allocation-mb 該參數(shù)指定一個Container最大可以申請的內(nèi)存 默認8192MB,需要修改
yarn.scheduler.increment-allocation-mb 該參數(shù)是容器內(nèi)存增量,表示內(nèi)存會自動增加,在CDH官方文檔上沒有這個參數(shù),但CM的web頁面上有,一般不調(diào)整 我們生產(chǎn)上默認是512MB,表示容器內(nèi)存不夠時默認以512MB的大小增加Container內(nèi)存
四、Container vcore配置說明
虛擬core ,是yarn自己設(shè)計引入的概念,設(shè)計初衷是考慮不同的機器的CPU的性能不一樣。比如某個服務(wù)器的CPU的性能是另外一臺CPU的2倍,那么可以設(shè)置第一臺服務(wù)器的虛擬core為2,另外CPU弱一點的那臺的虛擬core為1,盡量保證每臺服務(wù)器的虛擬core的性能差不多。
計算的時候,并發(fā)任務(wù)是靠vcore來進行計算的,而不是物理core
相關(guān)參數(shù):
yarn.nodemanager.resource.cpu-vcores 該參數(shù)是指定這個NodeManager節(jié)點上總共可分配的vcore數(shù),默認為8個,要根據(jù)實際情況調(diào)整
yarn.scheduler.minimum-allocation-vcores 該參數(shù)指定一個Container最少需要的vcore數(shù),默認為1個
yarn.scheduler.maximum-allocation-vcores 該參數(shù)指定一個Container最多可以分配的vcore數(shù),默認為4個
yarn.nodemanager.resource.pcores-vcores-multiplier 該參數(shù)文檔要參考apache hadoop官方文檔,表示當yarn.nodemanager.resource.cpu-vcores參數(shù)設(shè)置為-1且yarn.nodemanager.resource.detect-hardware-capabilities為true的情況下,需要根據(jù)物理core來進行vcore的計算,即物理core數(shù) * yarn.nodemanager.resource.pcores-vcores-multiplier。實際生產(chǎn)中,該參數(shù)統(tǒng)一設(shè)置為2,即一個物理core計算為2個vcore。該參數(shù)參考:https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
五、生產(chǎn)上如何計算CPU、內(nèi)存配置
生產(chǎn)上服務(wù)器配置為96G 內(nèi)存 12個物理核
計算CPU配置:
cloudera公司推薦:一個Container最大的vcore個數(shù)不要超過5個(實踐經(jīng)驗值)
所以?yarn.scheduler.maximum-allocation-vcores參數(shù)可以設(shè)置為4? ? yarn.scheduler.minimum-allocation-vcores默認為1即可
線上12個物理core,按照?yarn.nodemanager.resource.pcores-vcores-multiplier為2進行計算,總共有24個vcore 即 :
yarn.nodemanager.resource.cpu-vcores 為24
yarn.scheduler.increment-allocation-vcores 為1 表示申請vcore以該值遞增
如果只考慮NodeManager ,不考慮HBase的ResourceManager等其它組件的話,極限情況下可以申請 24/4 = 6 個Container?
注意:CPU一般不做系統(tǒng)預(yù)留
計算內(nèi)存配置:
既然我極限情況下可以申請6個Container,而內(nèi)存最大可用70G內(nèi)存
那么參數(shù):
yarn.scheduler.maximum-allocation-mb 設(shè)置為 70/6 = 11G
yarn.scheduler.minimum-allocation-mb 默認1G即可
注意:
以上計算配置的方式中是通過確定cpu的配置,然后再來配置內(nèi)存的配置,從而確定一個Container最大可申請多少內(nèi)存。如果一些Spark任務(wù)需要申請的內(nèi)存比較大,那么相應(yīng)的配置就應(yīng)該以內(nèi)存為主要配置項。
假設(shè)最大的Spark任務(wù)需要申請一個Container的內(nèi)存為14G,那么參數(shù)配置如下:
yarn.nodemanager.resource.pcores-vcores-multiplier為 2
yarn.nodemanager.resource.cpu-vcores 為 24
yarn.scheduler.maximum-allocation-vcores 為 4
?yarn.scheduler.minimum-allocation-vcores 為 1
yarn.scheduler.minimum-allocation-mb 為 1G
yarn.scheduler.maximum-allocation-mb 為 14G
如此配置下,申請內(nèi)存極限情況下可以申請5個Container,用到 5* 4個vcore
六、生產(chǎn)上其他配置項
yarn.nodemanager.pmem-check-enabled 檢查一個Container的內(nèi)存是否超過物理內(nèi)存 默認為true? 需要修改為false
yarn.nodemanager.vmem-check-enabled 檢查一個Container的內(nèi)存是否超過虛擬內(nèi)存 默認為false? 保持默認
yarn.nodemanager.vmem-pmem-ratio 該參數(shù)表示虛擬內(nèi)存與物理內(nèi)存的比值 默認為2.1 一般不做改動
七、CDH提供的yarn配置Excel
參見:
http://tiny.cloudera.com/yarn-tuning-guide
https://docs.cloudera.com/documentation/enterprise/5-16-x/topics/cdh_ig_yarn_tuning.html
CDH官網(wǎng)的這個文檔很有意思 ,通過一個Excel的形式 ,讓我們一步一步的做yarn的配置和MapReduce的配置,在集群配置沒有思路的時候可以參考
八、集群中還有別的組件時的配置
假如服務(wù)器是256G內(nèi)存,32個物理核,而我們要部署Yarn、HBase Region Server組件,此時,該如何配置
內(nèi)存:
????系統(tǒng)預(yù)留:因服務(wù)器內(nèi)存較大,可以考慮預(yù)留比較縮小,比如預(yù)留10%到15%之間,這里我們考慮預(yù)留12.5%? 即預(yù)留32G內(nèi)存
????DataNode:2G內(nèi)存
????NodeManager:4G內(nèi)存
????HBase Region Server:30G內(nèi)存(視數(shù)據(jù)量而定,但JVM有個神奇的32G定律,包括Elasticsearch也推薦一個JVM內(nèi)存不要超過32G。如果數(shù)據(jù)量較大 ,可以考慮設(shè)置64G內(nèi)存給HBase Region Server)
????Container總共可用內(nèi)存:256 - 32 - 2 - 4 - 30 =188G內(nèi)存
CPU:
? ??yarn.nodemanager.resource.pcores-vcores-multiplier 為2 個
????yarn.nodemanager.resource.cpu-vcores為 32 * 2=64 個
? ??yarn.scheduler.maximum-allocation-vcores 為4 個
? ??yarn.scheduler.minimum-allocation-vcores 為1 個
????yarn.scheduler.increment-allocation-vcores 為1個
? ? 所以 極限情況下 我們可以申請到16個Container
內(nèi)存:
? ??yarn.scheduler.minimum-allocation-mb 為 1G
? ??yarn.scheduler.maximum-allocation-mb 為 188*1024/16 約為11G
? ??yarn.scheduler.increment-allocation-mb 為默認512MB
九、HDP的配置計算方式
雖然我們生產(chǎn)都是使用CDH來部署大數(shù)據(jù)集群,不過HDP的這種計算思路,也可以參考一下
十、參考文檔
https://docs.cloudera.com/documentation/enterprise/5-16-x/topics/cdh_ig_yarn_tuning.html
https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml