antony@notes:~/data-platform$ cat "Hadoop-MapReduce-YARN.md"
Hadoop - MapReduce - YARN
Hadoop - MapReduce - YARN
:::spoiler 目錄 ( 點我可展開 )
[TOC]
:::
YARN 分散運算系統運作圖

- 啟動 YARN 系統,
Node Manager會透過網路一起向Resource Mananger報告,幾 G 的記憶體和 幾 core 的 cpu ,每台Node Manager都會透過網路報告自己所在主機的運算資源,此時Resource Manager就會知道 YARN 的總運算資源。 
- rbean 使用者登入 dta1 這台電腦,打
hive <SQL command>,hive 會幫我們把 SQL Command 翻譯成mapreduce的 Java 程式 (*.jar)。 - Client 端會在
mapred-site.xml設定自己的程式要用幾個 cpu ,多少 memory - 程式設計師需要知道自己執行的程式會需要多少運算資源
- 每個
Node Manager會讀取yarn-site.xml,裡面自己可以用的運算資源 Resource Manager會讀取yarn-site.xml,裡面的 Container 可以用多少 mwmory, 幾 c 的 core- 程式產生後,會丟給在 dtm2 主機上的
Resource Manager,請它幫忙啟動App Master( 也是 Java 程式 ) App Master會去詢問Name Node得知要分析的資料有幾個 block ,得知有 6 個 block 後,會告訴Resource Manager需要 6 支程式,一個 block 需要一支 map 程式來處理,Resource Manager會告訴Node Manager啟動 7 台 Container ,請他們去找App Master工作,處理後的資料會彙總給 reduce 程式來分析,分析的結果會由App Master回報給Jobhistory Server- Container | JVM
- 寫好的 Java 程式,副檔名
*.java,經過 Javac 編譯產生的程式,副檔名*.class,這時候的程式碼會變成 byte code , - 執行
*.class,會透過 class Loader 將程式放入 JVM - Static 內會有 Blueprint ( 藍圖 ),藍圖可以 new 很多 object
- string | 在 Java 裡面是字串物件
- Method 集合物件 ( 變數 ),裡面存 Data | 用來處理資料,在 heap 裡面 ( Java 的記憶體空間 ,一定會大於 128 mb )
- heap 的大小由
-xmx這個參數來設定,他會決定程式執行時用到的記憶體大小 - Stack | 當我們呼叫 Method 時,參數的資料暫存在這
- 寫好的 Java 程式,副檔名
檢視 YARN 總量運算資源
在 dta1 執行以下命令
$ curl -s http://dtm2:8088/ws/v1/cluster/metrics | jq | grep -E "totalMB|totalVirtualCores"dtm2:8088,dtm2這台主機上面跑的Resource Manager這支 Java 程式,他開的 port number : 8088。metrics,劑量的意思。jq,json query
output :
"totalMB": 6144,
"totalVirtualCores": 6,:::danger
:bulb: YARN 系統內定每部 Node Manager 的記憶體為 8G, CPU 為 8 Core
:::
設定 YARN 總量運算資源

$ cat vmalpdt/hdp33/conf/hadoop-3.3.3/yarn-site.xml
......
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
.......將記憶體改成 6144 mb
$ nano vmalpdt/hdp33/conf/hadoop-3.3.3/yarn-site.xml
......
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>6144</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
.......重新佈署新的設定檔到每台機器
$ dtconf 33停止 yarn 運算系統
$ stopyarn再次 開啟 yarn 運算系統
$ startyarn檢查是否符合預期
$ curl -s http://dtm2:8088/ws/v1/cluster/metrics | jq | grep -E "totalMB|totalVirtualCores"output :
"totalMB": 18432,
"totalVirtualCores": 6,總量的運算資源,由多台 Node Manager 相加得出
yarn 的總資源得出後,執行的那隻程式可以用幾 cpu 幾 memory 也可以設定 !
node manager 的運算資源如何規劃 ?
- 先得出
Node Manager所在主機的運算資源 ( CPU 幾 C 幾 T,memory 幾 G ),假設現在得到的是 4 G 的記憶體和 2 C 的 CPU 可以用。 Node Manager的運算資源如果規劃 memory 3 G ,cpu 3 Core 。- 假設一支程式最多只能用一個核心,memory ( 384 ~ 896 mb )
- 為何 CPU 可以超過 ? 因為這裡設定的運算資源,是針對程式可以用到多少記憶體和 CPU 的運算資源做規劃, CPU 核心數代表的是,程式在執行時會用到的 cpu 核心數。
- CPU 設定 3 Core ,代表這台電腦最多可以同時執行 3 支程式,這 3 支程式會分時共用 2 個核心數,所以 ok ,沒有問題。
Node Managercpu core 的數字,決定權在於實體 cpu 夠不夠力,以及程式動用到的運算複不複雜來判斷。- 為何記憶體設 3 G ?
- 其實設這樣已經很極限,要留記憶體空間給所在電腦主機上的其他程式用,如果全部用滿,電腦當場卡在那給你看。
設定單一 Container ( 程式 ) 可用運算資源

- memory 384 mb | 設給
mapreduce - memory 896 mb | 設給
spark
$ cat vmalpdt/hdp33/conf/hadoop-3.3.3/yarn-site.xml
........
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>384</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>896</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>1</value>
</property>
..........- 程式透過 yarn 系統跑,記憶體被限制在 384 ~ 896 mb, cpu 1 c
- 程式指定 run 1 顆 cpu 的 core ,並不等於 cpu 的那 1 顆 core 就會霸佔 run 這支程式
- 在大企業做系統工程,要注意發電機 and 大樓結構和水塔 ,了解整個大樓的結構
練習 規劃 Hadoop Cluster 的運算資源

Mapreduce 叢集運作架構圖

- Mapreduce | programing model, 它的語言 Java
- 程式執行才會啟動, 程式分析結束, Mapreduce 停止。
- mapreduce 處理資料的區塊稱為 split, Default 預設值 = 1 個 blcok ( 128 m )
map程式 | 擷取 ( 可以想成 cut ) and 過濾 ( 可以想成 grep ), 把要分析的資料拉出來- 擷取過濾後的資料,會存在小白區塊,在該 host 主機的硬碟
Shuffle| Java 程式 ,由 hadoop 團隊鑽寫- 將多個小白區塊,透過網路,彙整 ( merge | 分類、排序 ) 到一台工作機的大白區塊
reduce程式 | 分析大白區塊的資料reduce可以用的記憶體規格,在mapred-site.xml和yarn-site.xml設定- 實務通常設定 16 G
- 分析後的結果會再存回 hdfs 分散式檔案系統中
設定 MapReduce Job 的運算資源
$ cat /opt/hadoop-3.3.3/etc/hadoop/mapred-site.xml
..........
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx384m</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>384</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx256m</value>
</property>
........mapreduce.reduce.memory.mb,設定reduce程式可以用 512 mb 的記憶體空間mapreduce.reduce.java.opts,設定reduce處理資料的記憶體空間站 384/512 mbmapreduce.map.memory.mb,設定map程式在執行時記憶體可以用 384 mbmapreduce.map.java.opts,設定map程式處理資料的記憶體空間站 256/384 mb
:::info
:bulb: 一般 reduce 設定為 map 的兩倍。
:bulb: Just make sure you set java.opts to 20-25% less than memory.mb
:bulb: reduce 是做分析的,所以記憶體要大一點
:bulb: map 是做資料的擷取和過濾,記憶體不需要很大
:::
修改
# 設定 reduce 記憶體需求, 只需修改 dta1 主機的 mapred-site.xml 設定檔
$ sudo nano $HADOOP_HOME/etc/hadoop/mapred-site.xml
..........
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx400m</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>384</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx256m</value>
</property>
........- 因程式在 Client 端產生,故
mapred-site.xml是給 hive 和 pig 在讀取的,而這個設定檔一定在 dta1 這邊設定 yarn-site.xml,給 dtm2 的resource manager和 所有node manager讀取
# 在 dta1 終端機執行以下命令
$ cp vmalpdt/hdp210/bin/jpslog.sh vmalpdt/hdp33/bin/
$ cp vmalpdt/hdp210/bin/maxjps.sh vmalpdt/hdp33/bin/
$ cp vmalpdt/hdp210/bin/startjps vmalpdt/hdp33/bin/
$ cp vmalpdt/hdp210/bin/startmaxctn vmalpdt/hdp33/bin/
# 開啟收集資料
$ startjps
# 測試程式
$ yarn jar /opt/hadoop-3.3.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar pi 2 100000*.jar,人家寫好的 java 程式pi,計算 pi 值2產生兩個map程式100000| 座標- reduce 會幫我們處理和分析
examples-3.3.3.jar的資料
output :
WARNING: YARN_LOG_DIR has been replaced by HADOOP_LOG_DIR. Using value of YARN_LOG_DIR.
Number of Maps = 2
Samples per Map = 100000
Wrote input for Map #0
Wrote input for Map #1
Starting Job
Job Finished in 19.79 seconds
Estimated value of Pi is 3.14118000000000000000停止收集
$ stopjps
[dtw1]
[dtw2]
11:53:34
64795 YarnChild 256m
11:53:38
65282 YarnChild 384m
[dtw3]
11:53:26
63279 MRAppMaster 256m
11:53:33
64159 YarnChild 256m
63279 MRAppMaster 256m
11:53:36
63279 MRAppMaster 256m- MRAppMaster | Map Reduce App Master
- 會隨機出現在
Node Manager的主機,它一定第一個執行,最後一個離開 - 在 heap 裡,記憶體大小 256 m
- 會隨機出現在
- Yarnchild | 這裡的 Yarnchild 由
map+reduce組成 ( 圖裡的 Container )YarnChild 256m,2 個map程式YarnChild 384m,1 個reduce程式
- 以處理資料量 1 TB 為例 :
- 1 TB = 1024 * 1024 = 1,048,576 mb
- 1,048,576 mb / 128 = 8192 個 block
- 8192 block – > 需要 8192 支程式來處理
- MRAppMaster —> 需要 512 mb 來紀錄 8192 支程式的資訊 ( 512 mb 由老師實戰得出 )
測試 YARN Container 最大的總執行量
# 在 dta1 終端機執行以下命令
# 開始收集
$ startmaxctn
# 執行程式
$ hadoop jar /opt/hadoop-3.3.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar pi 15 300000
Number of Maps = 12
Samples per Map = 300000
Wrote input for Map #0
Wrote input for Map #1
............
Wrote input for Map #8
Wrote input for Map #9
Wrote input for Map #10
Wrote input for Map #11
Starting Job
Job Finished in 86.116 seconds
Estimated value of Pi is 3.14163444444444444444
# 停止收集
$ stopmaxctn
[dtw1]
19:52:26 -> Y:0 M:1
19:52:34 -> Y:1 M:1
19:52:35 -> Y:2 M:1
19:52:40 -> Y:1 M:1
19:52:40 -> Y:0 M:1
19:52:41 -> Y:2 M:1
19:52:45 -> Y:1 M:1
19:52:45 -> Y:0 M:1
[dtw2]
19:52:36 -> Y:2 M:0
19:52:36 -> Y:3 M:0
19:52:44 -> Y:2 M:0
19:52:44 -> Y:1 M:0
19:52:45 -> Y:3 M:0
19:52:51 -> Y:1 M:0
[dtw3]
19:52:36 -> Y:3 M:0
19:52:44 -> Y:2 M:0
19:52:44 -> Y:1 M:0
19:52:45 -> Y:3 M:0
19:52:51 -> Y:2 M:0
19:52:51 -> Y:1 M:0