Skip to content

antony@notes:~/data-platform$ cat "Hadoop-MapReduce-YARN.md"

Hadoop - MapReduce - YARN

2022-08-04· data-platform ·資料科技平台

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 時,參數的資料暫存在這

檢視 YARN 總量運算資源

在 dta1 執行以下命令

$ curl -s http://dtm2:8088/ws/v1/cluster/metrics | jq | grep -E "totalMB|totalVirtualCores"
  • dtm2:8088dtm2 這台主機上面跑的 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 Manager cpu core 的數字,決定權在於實體 cpu 夠不夠力,以及程式動用到的運算複不複雜來判斷。
  • 為何記憶體設 3 G ?
  • 其實設這樣已經很極限,要留記憶體空間給所在電腦主機上的其他程式用,如果全部用滿,電腦當場卡在那給你看。

設定單一 Container ( 程式 ) 可用運算資源

  • memory 384 mb | 設給 map reduce
  • 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.xmlyarn-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 mb
  • mapreduce.map.memory.mb,設定 map 程式在執行時記憶體可以用 384 mb
  • mapreduce.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
tags: 資料科技平台