簡介: 本文介紹了 Hadoop 自 0.23.0 版本後新的 map-reduce 框架(Yarn) 原理,優點,運做機制和配置方法等;着重介紹新的 yarn 框架相對於原框架的差別及改進;並經過 Demo 示例詳細描述了在新的 yarn 框架下搭建和開發 hadoop 程序的方法。 讀者經過本文中新舊 hadoop map-reduce 框架的對比,更能深入理解新的 yarn 框架的技術原理和設計思想,文中的 Demo 代碼通過微小修改便可用於用戶基於 hadoop 新框架的實際生產環境。java
發佈日期: 2013 年 1 月 17 日 node
級別: 初級 web
訪問狀況 : 22455 次瀏覽 編程
評論: 2 (查看 | 添加評論 - 登陸)安全
平均分 5 星 共 332 個評分 平均分 (332個評分)bash
爲本文評分服務器
Hadoop MapReduceV2(Yarn) 框架簡介網絡
原 Hadoop MapReduce 框架的問題架構
對於業界的大數據存儲及分佈式處理系統來講,Hadoop 是耳熟能詳的卓越開源分佈式文件存儲及處理框架,對於 Hadoop 框架的介紹在此再也不累述,讀者可參考 Hadoop 官方簡介。使用和學習過老 Hadoop 框架(0.20.0 及以前版本)的同仁應該很熟悉以下的原 MapReduce 框架圖:app
圖 1.Hadoop 原 MapReduce 架構
圖 1.Hadoop 原 MapReduce 架構
從上圖中能夠清楚的看出原 MapReduce 程序的流程及設計思路:
首先用戶程序 (JobClient) 提交了一個 job,job 的信息會發送到 Job Tracker 中,Job Tracker 是 Map-reduce 框架的中心,他須要與集羣中的機器定時通訊 (heartbeat), 須要管理哪些程序應該跑在哪些機器上,須要管理全部 job 失敗、重啓等操做。
TaskTracker 是 Map-reduce 集羣中每臺機器都有的一個部分,他作的事情主要是監視本身所在機器的資源狀況。
TaskTracker 同時監視當前機器的 tasks 運行情況。TaskTracker 須要把這些信息經過 heartbeat 發送給 JobTracker,JobTracker 會蒐集這些信息以給新提交的 job 分配運行在哪些機器上。上圖虛線箭頭就是表示消息的發送 - 接收的過程。
能夠看得出原來的 map-reduce 架構是簡單明瞭的,在最初推出的幾年,也獲得了衆多的成功案例,得到業界普遍的支持和確定,但隨着分佈式系統集羣的規模和其工做負荷的增加,原框架的問題逐漸浮出水面,主要的問題集中以下:
JobTracker 是 Map-reduce 的集中處理點,存在單點故障。
JobTracker 完成了太多的任務,形成了過多的資源消耗,當 map-reduce job 很是多的時候,會形成很大的內存開銷,潛在來講,也增長了 JobTracker fail 的風險,這也是業界廣泛總結出老 Hadoop 的 Map-Reduce 只能支持 4000 節點主機的上限。
在 TaskTracker 端,以 map/reduce task 的數目做爲資源的表示過於簡單,沒有考慮到 cpu/ 內存的佔用狀況,若是兩個大內存消耗的 task 被調度到了一塊,很容易出現 OOM。
在 TaskTracker 端,把資源強制劃分爲 map task slot 和 reduce task slot, 若是當系統中只有 map task 或者只有 reduce task 的時候,會形成資源的浪費,也就是前面提過的集羣資源利用的問題。
源代碼層面分析的時候,會發現代碼很是的難讀,經常由於一個 class 作了太多的事情,代碼量達 3000 多行,,形成 class 的任務不清晰,增長 bug 修復和版本維護的難度。
從操做的角度來看,如今的 Hadoop MapReduce 框架在有任何重要的或者不重要的變化 ( 例如 bug 修復,性能提高和特性化 ) 時,都會強制進行系統級別的升級更新。更糟的是,它無論用戶的喜愛,強制讓分佈式集羣系統的每個用戶端同時更新。這些更新會讓用戶爲了驗證他們以前的應用程序是否是適用新的 Hadoop 版本而浪費大量時間。
新 Hadoop Yarn 框架原理及運做機制
從業界使用分佈式系統的變化趨勢和 hadoop 框架的長遠發展來看,MapReduce 的 JobTracker/TaskTracker 機制須要大規模的調整來修復它在可擴展性,內存消耗,線程模型,可靠性和性能上的缺陷。在過去的幾年中,hadoop 開發團隊作了一些 bug 的修復,可是最近這些修復的成本愈來愈高,這代表對原框架作出改變的難度愈來愈大。
爲從根本上解決舊 MapReduce 框架的性能瓶頸,促進 Hadoop 框架的更長遠發展,從 0.23.0 版本開始,Hadoop 的 MapReduce 框架徹底重構,發生了根本的變化。新的 Hadoop MapReduce 框架命名爲 MapReduceV2 或者叫 Yarn,其架構圖以下圖所示:
圖 2. 新的 Hadoop MapReduce 框架(Yarn)架構
圖 2. 新的 Hadoop MapReduce 框架(Yarn)架構
重構根本的思想是將 JobTracker 兩個主要的功能分離成單獨的組件,這兩個功能是資源管理和任務調度 / 監控。新的資源管理器全局管理全部應用程序計算資源的分配,每個應用的 ApplicationMaster 負責相應的調度和協調。一個應用程序無非是一個單獨的傳統的 MapReduce 任務或者是一個 DAG( 有向無環圖 ) 任務。ResourceManager 和每一臺機器的節點管理服務器可以管理用戶在那臺機器上的進程並能對計算進行組織。
事實上,每個應用的 ApplicationMaster 是一個詳細的框架庫,它結合從 ResourceManager 得到的資源和 NodeManager 協同工做來運行和監控任務。
上圖中 ResourceManager 支持分層級的應用隊列,這些隊列享有集羣必定比例的資源。從某種意義上講它就是一個純粹的調度器,它在執行過程當中不對應用進行監控和狀態跟蹤。一樣,它也不能重啓因應用失敗或者硬件錯誤而運行失敗的任務。
ResourceManager 是基於應用程序對資源的需求進行調度的 ; 每個應用程序須要不一樣類型的資源所以就須要不一樣的容器。資源包括:內存,CPU,磁盤,網絡等等。能夠看出,這同現 Mapreduce 固定類型的資源使用模型有顯著區別,它給集羣的使用帶來負面的影響。資源管理器提供一個調度策略的插件,它負責將集羣資源分配給多個隊列和應用程序。調度插件能夠基於現有的能力調度和公平調度模型。
上圖中 NodeManager 是每一臺機器框架的代理,是執行應用程序的容器,監控應用程序的資源使用狀況 (CPU,內存,硬盤,網絡 ) 而且向調度器彙報。
每個應用的 ApplicationMaster 的職責有:向調度器索要適當的資源容器,運行任務,跟蹤應用程序的狀態和監控它們的進程,處理任務的失敗緣由。
新舊 Hadoop MapReduce 框架比對
讓咱們來對新舊 MapReduce 框架作詳細的分析和對比,能夠看到有如下幾點顯著變化:
首先客戶端不變,其調用 API 及接口大部分保持兼容,這也是爲了對開發使用者透明化,使其沒必要對原有代碼作大的改變 ( 詳見 2.3 Demo 代碼開發及詳解),可是原框架中核心的 JobTracker 和 TaskTracker 不見了,取而代之的是 ResourceManager, ApplicationMaster 與 NodeManager 三個部分。
咱們來詳細解釋這三個部分,首先 ResourceManager 是一箇中心的服務,它作的事情是調度、啓動每個 Job 所屬的 ApplicationMaster、另外監控 ApplicationMaster 的存在狀況。細心的讀者會發現:Job 裏面所在的 task 的監控、重啓等等內容不見了。這就是 AppMst 存在的緣由。ResourceManager 負責做業與資源的調度。接收 JobSubmitter 提交的做業,按照做業的上下文 (Context) 信息,以及從 NodeManager 收集來的狀態信息,啓動調度過程,分配一個 Container 做爲 App Mstr
NodeManager 功能比較專注,就是負責 Container 狀態的維護,並向 RM 保持心跳。
ApplicationMaster 負責一個 Job 生命週期內的全部工做,相似老的框架中 JobTracker。但注意每個 Job(不是每一種)都有一個 ApplicationMaster,它能夠運行在 ResourceManager 之外的機器上。
Yarn 框架相對於老的 MapReduce 框架什麼優點呢?咱們能夠看到:
這個設計大大減少了 JobTracker(也就是如今的 ResourceManager)的資源消耗,而且讓監測每個 Job 子任務 (tasks) 狀態的程序分佈式化了,更安全、更優美。
在新的 Yarn 中,ApplicationMaster 是一個可變動的部分,用戶能夠對不一樣的編程模型寫本身的 AppMst,讓更多類型的編程模型可以跑在 Hadoop 集羣中,能夠參考 hadoop Yarn 官方配置模板中的 mapred-site.xml 配置。
對於資源的表示之內存爲單位 ( 在目前版本的 Yarn 中,沒有考慮 cpu 的佔用 ),比以前以剩餘 slot 數目更合理。
老的框架中,JobTracker 一個很大的負擔就是監控 job 下的 tasks 的運行情況,如今,這個部分就扔給 ApplicationMaster 作了,而 ResourceManager 中有一個模塊叫作 ApplicationsMasters( 注意不是 ApplicationMaster),它是監測 ApplicationMaster 的運行情況,若是出問題,會將其在其餘機器上重啓。
Container 是 Yarn 爲了未來做資源隔離而提出的一個框架。這一點應該借鑑了 Mesos 的工做,目前是一個框架,僅僅提供 java 虛擬機內存的隔離 ,hadoop 團隊的設計思路應該後續能支持更多的資源調度和控制 , 既然資源表示成內存量,那就沒有了以前的 map slot/reduce slot 分開形成集羣資源閒置的尷尬狀況。
新的 Yarn 框架相對舊 MapRduce 框架而言,其配置文件 , 啓停腳本及全局變量等也發生了一些變化,主要的改變以下:
表 1. 新舊 Hadoop 腳本 / 變量 / 位置變化表
改變項原框架中新框架中(Yarn)備註
配置文件位置${hadoop_home_dir}/conf${hadoop_home_dir}/etc/hadoop/Yarn 框架也兼容老的 ${hadoop_home_dir}/conf 位置配置,啓動時會檢測是否存在老的 conf 目錄,若是存在將加載 conf 目錄下的配置,不然加載 etc 下配置
啓停腳本${hadoop_home_dir}/bin/start(stop)-all.sh${hadoop_home_dir}/sbin/start(stop)-dfs.sh
${hadoop_home_dir}/bin/start(stop)-all.sh新的 Yarn 框架中啓動分佈式文件系統和啓動 Yarn 分離,啓動 / 中止分佈式文件系統的命令位於 ${hadoop_home_dir}/sbin 目錄下,啓動 / 中止 Yarn 框架位於 ${hadoop_home_dir}/bin/ 目錄下
JAVA_HOME 全局變量${hadoop_home_dir}/bin/start-all.sh 中${hadoop_home_dir}/etc/hadoop/hadoop-env.sh
${hadoop_home_dir}/etc/hadoop/Yarn-env.shYarn 框架中因爲啓動 hdfs 分佈式文件系統和啓動 MapReduce 框架分離,JAVA_HOME 須要在 hadoop-env.sh 和 Yarn-env.sh 中分別配置
HADOOP_LOG_DIR 全局變量不須要配置${hadoop_home_dir}/etc/hadoop/hadoop-env.sh老框架在 LOG,conf,tmp 目錄等均默認爲腳本啓動的當前目錄下的 log,conf,tmp 子目錄
Yarn 新框架中 Log 默認建立在 Hadoop 用戶的 home 目錄下的 log 子目錄,所以最好在 ${hadoop_home_dir}/etc/hadoop/hadoop-env.sh 配置 HADOOP_LOG_DIR,不然有可能會由於你啓動 hadoop 的用戶的 .bashrc 或者 .bash_profile 中指定了其餘的 PATH 變量而形成日誌位置混亂,而該位置沒有訪問權限的話啓動過程當中會報錯
因爲新的 Yarn 框架與原 Hadoop MapReduce 框架相比變化較大,核心的配置文件中不少項在新框架中已經廢棄,而新框架中新增了不少其餘配置項,看下錶所示會更加清晰:
表 2. 新舊 Hadoop 框架配置項變化表
配置文件配置項Hadoop 0.20.X 配置Hadoop 0.23.X 配置說明
core-site.xml系統默認分佈式文件 URIfs.default.namefs.defaultFS
hdfs-site.xmlDFS name node 存放 name table 的目錄dfs.name.dirdfs.namenode.name.dir新框架中 name node 分紅 dfs.namenode.name.dir( 存放 naname table 和 dfs.namenode.edits.dir(存放 edit 文件),默認是同一個目錄
DFS data node 存放數據 block 的目錄dfs.data.dirdfs.datanode.data.dir新框架中 DataNode 增長更多細節配置,位於 dfs.datanode. 配置項下,如 dfs.datanode.data.dir.perm(datanode local 目錄默認權限);dfs.datanode.address(datanode 節點監聽端口);等
分佈式文件系統數據塊複製數dfs.replicationdfs.replication新框架與老框架一致,值建議配置爲與分佈式 cluster 中實際的 DataNode 主機數一致
mapred-site.xmlJob 監控地址及端口mapred.job.tracker無新框架中已改成 Yarn-site.xml 中的 resouceManager 及 nodeManager 具體配置項,新框架中歷史 job 的查詢已從 Job tracker 剝離,納入單獨的 mapreduce.jobtracker.jobhistory 相關配置,
第三方 MapReduce 框架無mapreduce.framework.name新框架支持第三方 MapReduce 開發框架以支持如 SmartTalk/DGSG 等非 Yarn 架構,注意一般狀況下這個配置的值都設置爲 Yarn,若是沒有配置這項,那麼提交的 Yarn job 只會運行在 locale 模式,而不是分佈式模式。
Yarn-site.xmlThe address of the applications manager interface in the RM無Yarn.resourcemanager.address新框架中 NodeManager 與 RM 通訊的接口地址
The address of the scheduler interface無Yarn.resourcemanager.scheduler.address同上,NodeManger 須要知道 RM 主機的 scheduler 調度服務接口地址
The address of the RM web application無Yarn.resourcemanager.webapp.address新框架中各個 task 的資源調度及運行情況經過經過該 web 界面訪問
The address of the resource tracker interface無Yarn.resourcemanager.resource-tracker.address新框架中 NodeManager 須要向 RM 報告任務運行狀態供 Resouce 跟蹤,所以 NodeManager 節點主機須要知道 RM 主機的 tracker 接口地址