Hadoop 原理總結
一、Hadoop技術原理
Hdfs主要模塊:NameNode、DataNode
Yarn主要模塊:ResourceManager、NodeManager
常用命令:
1)用hadoop fs 操作hdfs網盤,使用Uri的格式訪問(URI格式:secheme://authority/path ,默認是hdfs://namenode:namenode port /parent path / child , 簡寫為/parent path / child)
2)使用start-dfs.sh啟動hdfs
1 MR執行流程:
1)客戶端提交Mr 的jar包程序給JobClient
2)JobClient通過RPC和JobTracker 進行通信返回新的JOB ID 和路徑
3)Client將jar包寫入到HDFS當中(提交10份)
4)開始提交任務(任務的描述信息,不是Jar),有任務的詳細信息
5)JobTracker進行初始化任務,把任務放到調度器中,在一台機器上
6)讀取HDFS上的要處理的文件,開始計算輸入分片
7)TaskTracker通過心跳機制領取任務
8)下載所需要的jar,配置文件等
9)TaskTracker啟動一個Java child子進程
10)將結果寫入HDFS 當中
二、HDFS主要模塊及運行原理
Hdfs主要模塊:
Hdfs的塊的實際保存位置:tmpHdfsPath + /dfs/data/current/BP-126879239-192.168.1.213-1648462/cureent/finalized中,保存倆文件一個是塊,一個是塊的描述信息,即:blk_1073434 、blk_1073434_1015.meta
1)NameNode:
功能:是整個文件系統的管理節點。維護整個文件系統的文件目錄樹,文件/目錄的元數據和每個文件對應的數據塊列表。接收用戶的請求。
存儲:存儲DataNode中各個文件的基本元數據信息,其中元數據存儲是瓶頸,因為元數據需要保存2份,一份存在內存中(內存中有3個文件,fsimage,edits,內存中的metaData),一份序列化到硬盤上,但是內存空間有限,如果不停的保存幾K的元數據,容易導致內存的不足,同時由於不停的從內存序列化到硬盤,也占CPU。
結構:
fsimage元數據鏡像文件:存儲某一段時間的NameNode的內存元數據信息(fsimage.ckpt文件)
edits:操作日志文件。(上傳文件的過程中,不停的向edits寫日志,不斷的追加,直到成功后,內存的元數據才會更新元數據。edits都是從0開始的)
fstime:保存最近一次checkpoint的時間(checkpoint跟文件的一鍵還原點意義相同)
以上文件都保存在Linux系統中,edits日志是實時保存在磁盤,但edits與fsimage是v2.0版本,才是實時保存,2.0沒有SecondaryNameNode。
2)DataNode:
以下針對Hadoop V 1.0 、V 0 的版本
SecondaryNameNode
功能:是HA(高可用性)的一個解決方案,是備用鏡像,但不支持熱備
執行過程:
1)Secondary通知NameNode切換edits文件
2)Secondary從NameNode中獲取fsimage和edits(通過http),Secondary獲取文件后,NameNode會生成新的edits.new文件,該文件從0開始。
3)Secondary將fsimage載入內存,然后開始合並
4)Secondary將新生成的fsimage,在本地保存,並將其推送到NameNode
5)NameNode替換舊的鏡像。
說明:SecondNameNode默認是安裝在NameNode節點上,但是這樣不安全。
Yarn主要模塊:ResourceManager、NodeManager
常用命令:
1、用hadoop fs 操作hdfs網盤,使用Uri的格式訪問(URI格式:secheme://authority/path ,默認是hdfs://namenode:namenode port /parent path / child , 簡寫為/parent path / child)
2、使用start-dfs.sh啟動hdfs
hbase行鍵設計原理~如何進行復雜表的查詢~redis原理~hdfs原理~job提交過程~hbase,hive,mapreducejvm的優化方式~數據如何采集~集群的動態添加去除節點方法!
三、MapReduce運行原理
1、Map過程簡述:
1)讀取數據文件內容,對每一行內容解析成<k1,v1>鍵值對,每個鍵值對調用一次map函數
2)編寫映射函數處理邏輯,將輸入的<k1,v1>轉換成新的<k2,v2>
3)對輸出的<k2,v2>按reducer個數和分區規則進行分區
4)不同的分區,按k2進行排序、分組,將相同的k2的value放到同一個集合中
5)(可選)將分組后的數據重新reduce歸約
2、reduce處理過程:
1)對多個Map的輸出,按不同分區通過網絡將copy到不同的reduce節點
2)對多個map的輸出進行排序,合並,編寫reduce函數處理邏輯,將接收到的數據轉化成<k3,v3>
3)將reduce節點輸出的數據保存到HDFS上
說明:
1)Mapper Task 是邏輯切分。因為Maper記錄的都是block的偏移量,是邏輯切分,但相對於內存中他確實是物理切分,因為每個Mapper都是記錄的分片段之后的數據。
2)shuffle是物理切分。MapReduce的過程是倆過程需要用到Shuffle的,1個mapper的Shufflle,1個多個reduce的Shuffle,一般每個計算模型都要多次的reduce,所以要用到多次的Shuffle。.
MapReduce原理圖
正常HDFS存儲3份文件,Jar包默認寫10份,NameNode通過心跳機制領取HDFS任務,運行完畢后JAR包會被刪除。
Map端處理流程分析:
1) 每個輸入分片會交給一個Map任務(是TaskTracker節點上運行的一個Java進程),默認情況下,系統會以HDFS的一個塊大小作為一個分片(hadoop2默認128M,配置dfs.blocksize)。Map任務通過InputFormat將輸入分片處理成可供Map處理的<k1,v1>鍵值對。
2) 通過自己的Map處理方法將<k1,v1>處理成<k2,v2>,輸出結果會暫時放在一個環形內存緩沖(緩沖區默認大小100M,由mapreduce.task.io.sort.mb屬性控制)中,當緩沖區快要溢出時(默認為緩沖區大小的80%,由mapreduce.map.sort.spill.percent屬性控制),會在本地操作系統文件系統中創建一個溢出文件(由mapreduce.cluster.local.dir屬性控制,默認${hadoop.tmp.dir}/mapred/local),保存緩沖區的數據。溢寫默認控制為內存緩沖區的80%,是為了保證在溢寫線程把緩沖區那80%的數據寫到磁盤中的同時,Map任務還可以繼續將結果輸出到緩沖區剩余的20%內存中,從而提高任務執行效率。
3) 每次spill將內存數據溢寫到磁盤時,線程會根據Reduce任務的數目以及一定的分區規則將數據進行分區,然后分區內再進行排序、分組,如果設置了Combiner,會執行規約操作。
4) 當map任務結束后,可能會存在多個溢寫文件,這時候需要將他們合並,合並操作在每個分區內進行,先排序再分組,如果設置了Combiner並且spill文件大於mapreduce.map.combine.minspills值(默認值3)時,會觸發Combine操作。每次分組會形成新的鍵值對<k2,{v2...}>。
5) 合並操作完成后,會形成map端的輸出文件,等待reduce來拷貝。如果設置了壓縮,則會將輸出文件進行壓縮,減少網絡流量。是否進行壓縮,mapreduce.output.fileoutputformat.compress,默認為false。設置壓縮庫,mapreduce.output.fileoutputformat.compress.codec,默認值org.apache.hadoop.io.compress.DefaultCodec。
Reduce端處理流程分析:
1) Reduce端會從AM那里獲取已經執行完的map任務,然后以http的方法將map輸出的對應數據拷貝至本地(拷貝最大線程數mapreduce.reduce.shuffle.parallelcopies,默認值5)。每次拷貝過來的數據都存於內存緩沖區中,當數據量大於緩沖區大小(由mapreduce.reduce.shuffle.input.buffer.percent控制,默認0.7)的一定比例(由mapreduce.reduce.shuffle.merge.percent控制,默認0.66)時,則將緩沖區的數據溢寫到一個本地磁盤中。由於數據來自多個map的同一個分區,溢寫時不需要再分區,但要進行排序和分組,如果設置了Combiner,還會執行Combine操作。溢寫過程與map端溢寫類似,輸出寫入可同時進行。
2) 當所有的map端輸出該分區數據都已經拷貝完畢時,本地磁盤可能存在多個spill文件,需要將他們再次排序、分組合並,最后形成一個最終文件,作為Reduce任務的輸入。此時標志Shuffle階段結束,然后Reduce任務啟動,將最終文件中的數據處理形成新的鍵值對<k3,v3>。
3) 將生成的數據<k3,v3>輸出到HDFS文件中。
Map與Reduce執行過程圖
三 Hadoop序列化--Writable
序列化就是將內存當中的數據序列化到字節流中,
他實現了WritableComparable 接口,並繼承了Writable(Write和ReadFile需要被實現)和Compare接口
1 特點:
1 )緊湊:高校使用存儲空間
2 )快速:讀寫數據的額外開銷小
3 )可擴展:可透明的讀取老格式的數據
4 )互操作:支持多語言的交互
說明:JAVA 的序列化對繼承等的結構都保存了,而對hadoop用不着,只需要存儲字符就可以,所以有自己的機制。