MapReduce On Yarn的配置詳解和日常維護
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.MapReduce運維概述
MapReduce on YARN的運維主要是針對CPU和內存資源的運維。
二.MapReduce配置詳解
1>.以下參數講解以社區版2.6.0的參數名和默認值為准(配置文件為:hdfs-default.xml / hdfs-site.xml )
MapReduce 參考鏈接:http://hadoop.apache.org/docs/r2.6.0/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
YARN 參考鏈接:http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
2>.mapreduce.task.io.sort.factor
默認為10。當一個map task執行完后,本地磁盤上(由 mapreduce.cluster.local.dir指定)有若干個spill(溢出)文件,map task最后需要執行merge sort,把這些spill文件合並成一個文件,合並時可以同時打開多少個spill文件由該參數決定。如果有大量數據溢出到磁盤,且merge sort階段的I/O很高,就應該嘗試增加該值,通常社區版的默認值10過小,CDH版的默認值64對中等規模集群合適。各Job也可以單獨指定。
3>.mapreduce.task.io.sort.mb
默認值100。用於設置map task的merge sort可用的緩沖區大小,在map輸 出較大且map端I/O很高時,就應該嘗試增加該值,通常社區版的默認值 100過小,CDH版的默認值256對中等規模集群合適。各Job也可以單獨指定。
4>.mapreduce.cluster.local.dir
默認為${hadoop.tmp.dir}/mapred/local。MapReduce保存中間數據文件 的本地磁盤路徑,可以通過逗號分隔指定多個路徑。可按需修改。
5>.mapreduce.job.maps / mapreduce.job.reduces
默認為2/1。每個Job默認的map/reduce task個數,各Job也可以單獨指定, 因此集群層面的默認值不一定需要修改。
6>.mapreduce.task.timeout
默認為6000000,即10分鍾。指定一個task由於沒有讀取任何數據、寫出任何數據或更新狀態達到多長時間后會被終止。設為0表示禁用該特性。
7>.mapreduce.map.memory.mb / mapreduce.reduce.memory.mb
默認均為1024,調度器為每個map/reduce task申請的內存數。各Job也可 以單獨指定。
8>.mapreduce.map.cpu.vcores / mapreduce.reduce.cpu.vcores
默認均為1,調度器為每個map/reduce task申請的CPU虛擬核數。各Job也 可以單獨指定。
9>.mapreduce.map.speculative / mapreduce.reduce.speculative
默認均為true,是否開啟map/reduce task的推測執行特性,我們在核心 課中介紹過推測執行可以解決部分task運行得特別慢的問題,但會消耗額 外的資源,並且非冪等的MR任務不能啟用推測執行,否則會影響結果的正 確性。因此,像CDH這樣的發行版將默認值設為false。
10>.mapreduce.job.ubertask.enable
默認為false。MapReduce中有一類足夠小的作業稱為“ubertask”,如果 開啟該選項,會在單一JVM內運行該作業的所有task,使得小任務執行時 不需要在節點間交換數據。是否開啟區別不大。
11>.mapreduce.output.fileoutputformat.compress
默認為false。指定MR的最終輸出結果是否壓縮。各Job也可以單獨指定。
12>.mapreduce.output.fileoutputformat.compress.type
默認為RECORD。可以為NONE,RECORD,BLOCK,如果輸出結果要壓縮,以什么單位進行壓縮。CDH集群該值默認為BLOCK,即以塊為單位進行壓縮。
13>.mapreduce.job.queuename
默認為default。MR作業提交的默認隊列名。各Job也可以單獨指定。
14>.yarn.app.mapreduce.am.staging-dir
默認為/tmp/hadoop-yarn/staging。MR作業在提交時所使用的臨時目錄, 是一個本地路徑。
15>.mapreduce.am.max-attempts
默認為2。AM在失敗前可以嘗試多少次,如果為2,代表可以在1次失敗后 有1次重試。該值必須小於YARN的RM的max-attempts值,否則會被覆蓋。 各Job也可以單獨指定。
16>.yarn.app.mapreduce.am.resource.mb
默認為1536。MR運行於YARN上時,為AM分配多少內存。默認值通常來說過 小,建議設置為2048或4096等較大的值。
17>.yarn.app.mapreduce.am.resource.cpu-vcores
默認為1。MR運行於YARN上時,為AM分配多少個虛擬核。因為AM並不太消 耗CPU,默認值通常夠用。
18>.mapreduce.app-submission.cross-platform
默認為false。我們在核心課中曾經修改過該參數,尤其是使用測試環境 調試時,如果需要用windows、MAC操作系統上的IDE向集群提交作業,應 該將該值設為true。
19>. yarn.acl.enable
默認為false,是否開啟YARN的ACL權限控制,在生產集群強烈建議開啟, 避免未授信用戶隨意啟動或殺死作業。
20>.yarn.admin.acl
作為YARN的管理員的賬號列表,默認為*,即所有賬號都視為管理員。 YARN的管理員可以提交作業、殺死作業、移動作業隊列等,而普通用戶是 只讀的。在生產集群建議將該列表限制為yarn,hdfs,dr.who等幾個。
21>.yarn.resourcemanager.am.max-attempts
默認為2。見mapreduce.am.max-attempts
22>.yarn.resourcemanager.scheduler.class
默認為"org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler",即使用基於容量的調度器。
23>.yarn.scheduler.minimum-allocation-mb / yarn.scheduler.maximumallocation-mb
分別為1024/8192,指定RM可以為每個container分配的最小/最大內存數,低於或高於該限制的內存申請,會按最小或最大內存數來進行分配。默認值適合一般集群使用,如果集群需要運行超耗內存的任務,觀察到container有OOM情況,可以調大最大值。
24>.yarn.scheduler.minimum-allocation-vcores / yarn.scheduler.maximum-allocation-vcores
分別為1/32,指定RM可以為每個container分配的最小/最大虛擬核數,低 於或高於該限制的核申請,會按最小或最大核數來進行分配。默認值適合 一般集群使用。
25>.yarn.resourcemanager.ha.enabled
默認為false。指定是否啟用YARN的HA,如果啟用,還涉及到 yarn.resourcemanager.ha.rm-ids來配置HA組中的多個RM,以及 yarn.resourcemanager.ha.automatic-failover.enabled等參數來配置自動故障轉移。
26>.yarn.resourcemanager.max-completed-applications
默認為10000。指定RM最多保存多少個完成作業的信息,超過該門限之前 的作業,將無法通過RM的管理頁面(或yarn命令)查詢到信息。對比較繁 忙的生產集群,該值過小,會給故障排查帶來困難,建議按需調整。
27>.yarn.log-aggregation-enable
默認為false。是否開啟YARN的日志聚合功能,如果開啟,各container的 日志會被收集到一起並統一存放(如存到HDFS),之后可以通過Timeline Server進行方便的查詢。對生產集群建議開啟。
28>.yarn.nodemanager.resource.memory-mb
默認為8192。每個節點可分配多少物理內存給YARN使用,考慮到節點上還 可能有其他進程需要申請內存,該值設置為物理內存總數/1.3比較合適, 例如128G內存的節點可以分配100G
29>.yarn.nodemanager.pmem-check-enabled / yarn.nodemanager.vmemcheck-enabled / yarn.nodemanager.vmem-pmem-ratio
這三個參數控制着YARN對container的內存監控。前兩個值默認均為true, 指定是否開啟對物理內存/虛擬內存的監控,一旦使用的物理內存或虛擬 內存超過預設值,即會拋出OOM錯誤,使container被殺死。第三個參數默 認為2.1,控制虛擬內存為物理內存的多少倍,如某container申請的最大 物理內存為2G,則虛擬內存可以到4.2G。這三個參數通常都不需要動,但 是需要理解其含義以進行排錯。
30>.yarn.nodemanager.resource.cpu-vcores
默認為8。每個節點可分配多少虛擬核給YARN使用,通常設為該節點定義 的總虛擬核數即可。
31>.yarn.timeline-service.enabled
默認為false。是否啟用Timeline Server,生產環境建議打開。
此外,配置了某種scheduler后,還需要修改相應的capacityscheduler.xml或fair-scheduler.xml文件。
三.故障管理
MRv2日常維護的一個重要部分是處理MapReduce作業(包括Hive作業) 的各種錯誤。錯誤類型繁多,這里列舉最為常見的幾種:
1>.AccessControlException: Permission denied
MR作業運行時需要向HDFS寫入臨時數據,運行完后也可能需要將最終結果 寫入HDFS。如果運行MR作業的賬號對指定目錄沒有寫入權限,即拋出 AccessControlException異常。這種情況在開啟了Kerberos認證的集群上 更容易出現。解決方案也很簡單,給目錄足夠的權限,或改變運行賬號。
2>.ClassNotFoundException
該異常通常是因為沒有找到運行MR作業所需的jar包,使得代碼中引用的 某些類找不到。該問題在調試時尤其常見,在代碼上線后應該不會出現, 除非有人破壞了CLASSPATH。解決方法是,將所需jar包加入CLASSPATH, 或將所需jar包直接打在MR作業的jar包中。
3>.Task的JVM堆內存溢出
常見的征兆有:
java.lang.OutOfMemoryError: GC overhead limit exceeded; running beyond physical memory limits.Current usage: XX GB of XX GB physical memory used等。
治標的方法是:
改大task的堆內存分配,即調大mapreduce.map.java.opts / mapreduce.reduce.java.opts兩個參數的Xmx值。但一味調大Xmx很多時候 不能根本上解決問題,如果將Xmx倍增2、3次后仍然會OOM,就要從代碼層面尋找原因,排除過度使用堆內存的隱患。
4>.Task的棧內存溢出,java.lang.StackOverflowError
比較罕見,通常是因為遞歸調用、調用鏈太長導致的。該問題需要從代碼層面排除。
5>.ApplicationMaster堆內存溢出
在MRv2中比較罕見,通常是因為輸入數據太大,或指定的map數太多,使得AM的內存不足以管理如此多的map。
解決方法:
將“yarn.app.mapreduce.am.resource.mb”調大。另外該問題在Spark on YARN 時出現的可能性大,此時Spark Driver相當於AM,如果執行Spark Streaming並有很多個微批延時,容易出現Driver內存溢出的情況
6>.非堆內存溢出,java.lang.OutOfMemoryError:Direct buffer memory
這種情況在MRv2中也較罕見(Spark on YARN時較多),原因是在代碼中 使用了NIO等會使用非堆內存的特性。解決該問題還是要從代碼層面優化。
7>. ClassCastException: org.apache.hadoop.io.XXX cannot be cast to org.apache.hadoop.io.XXX
典型的類型轉換錯誤,通常出現在Java實現的MR程序中,mapper和 reducer的輸入輸出類型是有一定限制的,比如mapper的第一個參數類型 必須是LongWritable或NullWritable,mapper的輸出類型必須和reducer 的輸入類型一致,否則就會出現此類問題。解決辦法是調整代碼。
8>.java.io.IOException
出現該異常的場景很多,如讀寫HDFS錯誤、RPC請求超時、網絡配置錯誤 等。需要根據更細節的信息(如異常堆棧)進一步排查,通常都是比較明 顯的錯誤。
9>.其他錯誤
通過日志排查。MRv2作業問題通常都只需要分析container日志,該日志位於Hadoop安裝目錄的userlogs目錄下的application_xxx目錄下,有多個container的話就有多個container_xxx_0000xx目錄,最內層有stdout, stderr,syslog三個文件,排錯通常只關注stderr。只要定位到具體的錯誤日志,問題總能迎刃而解。 YARN的常見故障主要是進程掛掉,根據進程的重要性不同有不同的管理方案,詳見進程管理部分。 慢Job原因排查。在實踐中,經常會有Hadoop集群的使用方遇到個別作 業執行很慢的情況,從而懷疑Hadoop是否有bug。事實證明,經過10余年的發展,Hadoop尤其是YARN在資源管理上已經相當嚴謹,99.999%的情況都是使用者的問題而非Hadoop本身bug。遇到慢Job可以從以下方面排查: (1)整個Job慢還是個別Task慢,如果只有個別Task慢,首先排查數據偏斜 情況; (2)哪個階段慢,如果Job在開始執行前經歷了很長的排隊等待時間,要檢查隊列配置、申請資源量、當時集群的整體情況,查清沒有分配資源的原因是什么; (3)如果是Hive或Spark SQL慢,多從SQL書寫方面找原因, 尤其是分區表沒用分區、連接寫錯、過濾執行太晚都是非常常見的情況; (4)其他情況,結合日志去排查,網絡異常、權限問題、數據源端或目的端 阻塞等也可能造成作業慢。總之,MapReduce on YARN雖然是個以慢著稱 的框架,但一定是慢得有理有據,如果搞不清慢的原因,即使換一個更快 的框架比如Spark,依然會遇到大量莫名其妙的慢問題。
四.進程管理
我們只關注MRv2(MapReduce on YARN)涉及的進程。MRv1的進程管理 (jobtracker,tasktracker)已經過時,我們不需要了解。
1>.YARN進程管理中,NodeManager(NM)的進程比較次要,死掉只需處理 完問題再拉起即可。
2>.ResourceManager(RM)負責YARN的資源管理和應用程序調度,是YARN 中最重要的進程,也是一個存在單點故障的進程。
RM死掉后,我們需要立即拉起,默認情況下,在RM死掉前還沒有運行完的 YARN應用都會失敗,需要再次手工提交。YARN有一個參數 (yarn.resourcemanager.recovery.enabled)可以控制RM重啟特性,如 果將其設置為true,則RM會使用某種狀態存儲來保存當前應用/應用的 attempt的信息,使得在重啟RM后可以恢復這部分信息,作業可以接着運 行,而無需手工提交。 當然這一特性在Hadoop社區中分為兩個階段實現, 分別為2.4以前的實現和2.6以后的實現,可以在以下網址 (http://hadoop.apache.org/docs/r2.6.5/hadoop-yarn/hadoop-yarn-site/ResourceManagerRestart.html) 看到說明。兩者的區別在於恢復過程中現有AM是否需要被殺死。需要注意 的是,該特性並不能解決RM的單點問題,只能使得RM的停機對用戶無感知。 真正能解決RM單點故障的是RM HA特性,可以在以下網址 (http://hadoop.apache.org/docs/r2.6.5/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html) 看到說明。該方案使用zookeeper的臨時節點來監控RM的活性,一旦臨時 節點消失即可切換到standby RM,和NameNode HA中使用zk做切換的方式是類似的。
3>.YarnChild、ApplicationMaster等進程都是由NM啟動的,用戶控制不 了,一旦這些進程掛掉,作業的一部分或全部就會宣告失敗。此時需要參 照故障管理中的套路排查故障。
五.配置管理
1>.MapReduce on YARN的主要配置的說明已介紹過,其余配置可查詢官方 文檔
MapReduce 參考鏈接:http://hadoop.apache.org/docs/r2.6.0/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml YARN 參考鏈接:http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
2>.需要注意的是大部分配置需要重啟YARN服務生效,小部分需要重啟單個NM節點生效。
3>.對YARN日常維護中常用的命令總結如下
YARN用戶命令
運行yarn程序(yarn jar)
對yarn程序查詢狀態、殺死、移動隊列等(yarn application)
查看yarn程序的container日志(yarn logs)
其他(如yarn applicationattempt,yarn node等)
YARN管理命令
RM管理命令,如刷新隊列配置、刷新節點信息、刷新管理員ACL權限、切
換RM的主備等(yarn rmadmin)
其他(主要用於啟動yarn的進程,如yarn resourcemanager,yarn nodemanager等)
六.課后作業
復習scheduler的知識
熟悉本講列舉的配置項
起一些MR作業,練習yarn application、yarn logs等命令
實驗配置ResourceManager HA