Hadoop(MapReduce&HDFS)
1.學習目的(前言)
在從業了六年IT生涯里,做個實施顧問、業務顧問、BA需求分析師、項目經理,現在重新定位自己,在新公司做起了開發顧問,雖然經歷過很多轉折、跨度也有點大。但是抓住了機會,開始接觸大數據行業了。雖然目前工作中的都是使用Hive SQL進行開發,沒有涉及太多真正大數據的東西,但是覺得學習大數據還是很有必要,所以利用項目的空余時間對Hadoop進行了學習整理,內容可能對於現在的Hadoop來說已經有點過時了,但是我覺得老知識還是根基,於是便有了以下的文章,用於以后自己備忘和要學習Hadoop的小伙伴一起學習進步。
2.Hadoop核心思想
Hadoop是在分布式服務器集群上存儲海量數據並運行分布式分析應用的一個平台,其核心部件是HDFS與MapReduce
HDFS是一個分布式文件系統:傳統文件系統的硬盤尋址慢,通過引入存放文件信息的服務器Namenode和實際存放數據的服務器Datanode進行串接。對數據系統進行分布式儲存讀取。
MapReduce是一個計算框架:MapReduce的核心思想是把計算任務分配給集群內的服務器里執行。通過對計算任務的拆分(Map計算\Reduce計算)再根據任務調度器(JobTracker)對任務進行分布式計算。
3.HDFS文件系統和MapReduce計算框架在Hadoop生態圈中的應用
HDFS負責Hadoop生態圈的數據存取工作
MapReduce負責Hadoop生態圈的數據運算工作
Hadoop生態圈使用HDFS文件系統進行存取數據,數據被分散的保存在集群的各個服務器上,在計算數據時使用MapReduce結合HDFS進行邏輯運算取出數據。
4.Master/Slave的架構理念
Hadoop使用(Master/Slave)主從架構進行分布式儲存和分布式計算。Master負責分配和管理任務,Slave負責實際執行任務。
MapReduce中裝載有JobTracker的服務器負責進行Master任務,裝載有TaskTracker的服務器負責進行Slave任務。
HDFS中裝載有Namenode的服務器負責進行Master任務,裝載有Datanode的服務器負責進行Slave任務。
5.HDFS&MapReduce的設計思路
HDFS:
將文件進行切塊處理,再通過文件信息服務器Namenode存放切塊的文件信息存放地址,實際存放數據的服務器Datanode存在切塊后的數據。
系統默認:每個片塊大小為64M,以保證尋址速度;數據會寫入3個Datanode中,以保證更高的容錯性;
HDFS還設計了Secondary Namenode來更新Namenode,以避免日志文件過大
HDFS Client幫助Namenode對寫入讀取數據進行預處理,進行文件的分塊與發送讀取操作。Namenode負責為數據任務尋址
MapReduce:
通過JobClient生成任務運行文件,並在JobTracker進行調度指派TaskTracker完成任務。
JobTracker分為把任務文件進行分解並派送到TaskTracker的程序JobinProgress和執行調度器的TaskScheduler
JobinProgress把作業分解成Map計算和Reduce計算並放置到TaskTracker服務器中
6.HDFS&MapReduce組件介紹
HDFS:
Namenode(Master):管理着每個文件中各個塊所在的數據節點的位置信息
Namespace image:記錄每個文件的存在位置信息
Edit log:記錄每個文件的位置移動信息
Datanode(Slave):記錄着服務器內所儲存的數據塊的列表
Secondary Namenode:更新並備份Namenode
HDFS Client:進行文件的分塊與文件的發送讀取
MapReduce:
JobClient:用於把用戶的作業任務生成Job的運行包,並存放到HDFS中。
JobinProgress:把Job運行包分解成MapTask和ReduceTask並存放於TaskTracker中
JobTracker(Master):進行調度管理TaskTracker執行任務
TaskTracker(Slave):執行分配下來的Map計算或Reduce計算任務
7.Hadoop運行機制
HDFS:
Namenode使用鏡像文件(Namespace image)和操作日志文件(edit log)對數據進行記錄。(保存在緩存和磁盤中)
Secondary Namenode進行更新時的操作:
1.在Namenode創建一個新的操作日志,將新的操作記錄寫入到新的操作日志中;
2.將Namenode的鏡像文件和操作日志拷貝到Secondary Namenode中;
3.在Secondary Namenode中讀取鏡像文件到內存,並執行日志文件中的所有操作,生產新的鏡像文件;
4.把Secondary Namenode中創建的鏡像文件拷貝到Namenode中;
5.Namenode中使用新的鏡像文件和操作日志替代原來的文件;
存數據:
1.HDFS Client對文件分塊並向Namenode發送寫數據請求
2.Namenode把block信息記錄下來,並返回可寫入的Datanode
3.HDFS Client向指定的Datanode傳送數據
4.傳送成功后,Datanode會向Namenode和HDFS Client發送成功通知
讀數據:
1.HDFS Client從Namenode中獲取文件塊的位置
2.HDFS Client根據Namenode返回的文件信息去Datanode相關位置中讀取
MapReduce:
通過JobClient把用戶的作業任務轉換成job.xml、job.jar、job.split,適合JobTracker執行的文件
1.job.xml文件記錄了Job的詳細配置信息
2.job.jar保存了用戶定義的關於job的map、reduce操縱
3.job.split保存了job任務的切片信息
JobClient會為作業向JobTracker申請Jobid,並以Jobid命名把xml、jar、split文件放置進HDFS中
JobinProgress會把JobClient創建的Job拷貝到JobTracker本地文件系統,並創建JobStatus和Job的mapTask、reduceTask隊列來跟蹤Job的狀態信息。
JobTracker默認執行一下調度法則
1.先進先出:集群內的資源統一進行使用,執行先進隊列先執行的原則。
2.公平調度:按用戶分配集群內的資源,每個用戶只能在指定的資源內運行調度。
3.隊列調度:可以設置多個隊列,每個隊列都可以進行置頂的資源調度
TaskTracker向JobTracker發送心跳報告及執行命令
8.MapReduce集群的配置
服務器 守護進程 說明
server1 namenode namenode節點
server2 jobtracker 任務主節點
server3 secondary namenode secondary namenode
dserver1 datanode tasktracker 數據節點
dserver2 datanode tasktracker 數據節點
dsdrver3 datanode tasktracker 數據節點
后感:
在寫這篇文章的時候,知識點不斷在更新(ps:甚至大v們對同一個事情的理解也有不太一致的地方,再ps:上述文章內容完全是小粉的個人理解),甚至連文章架構也改了很多次。但是對於學習來說,我覺得這個是一件好事兒,建議也在學習hadoop的小伙伴也可以對自己的知識進行整理學習,有自己的理解。
參考網址:
MapReduce:
http://www.linuxidc.com/Linux/2014-03/99153.htm
http://blog.csdn.net/zhouleilei/article/details/21955009
http://www.aboutyun.com/thread-7778-1-1.html
http://www.tuicool.com/articles/uamYJre
http://blog.csdn.net/Androidlushangderen/article/details/41408517
HDFS:
http://www.cnblogs.com/laov/p/3434917.html
http://www.2cto.com/kf/201311/260826.html