MapReduce&HDFS簡介
一、Hadoop簡介:
結構化資料:表,關系型資料庫//有嚴格的限制
半結構化資料:html,json,yaml,有中繼資料// 有限制,缺少嚴格的限制
非結構化資料:沒有預定義的模型,中繼資料 //日志資料等
搜尋引擎:搜尋元件、索引元件
網絡爬蟲:爬到的内容多為半結構化或者非結構化資料
建構反向索引[基于精确搜尋或模糊搜尋基于相關度比對]存儲到存儲系統[非RDBMS]中。
2003年:The Google File System//google如何實作檔案存儲,不支援對資料進行随機和實時通路,僅适用于存儲少量的體積巨大的檔案。
假如爬到html頁面發生了改變,需要修改。則goole fs無法滿足該需求
2004年:MapReduce: simplified Data Precessing On Large Cluster//MapReduce程式設計模型,一個任務分布在各個節點上運作,後收集結果
2006年:BigTable: A Distributed Storage System for Structure Data //存儲結構化資料的分布式存儲
GFS->山寨後HDFS:
MapReduce->MapReduce:
BigTable->HBase:
HDFS + MapReduce = Hadoop //作者兒子的一個玩具
HBase:hadoop 的database
Nutch:一個網絡爬蟲程式,為Lucene爬取資料
Hadoop的一個缺陷:MapReduce是批處理程式,
HDFS采用的是有中心節點的存儲格式
client
|
中繼資料節點
===========================
node1 node2 node3 node n
1 1‘ 2 2’
資料查詢過程:client->中繼資料節點[資料分布在哪些節點上]-->[node 1,2,3,,n]-->client 使用者查詢[寫代碼]-->先調用MapReduce的開發架構-->交由該架構運作
Map:該代碼需要分别運作在node1和node2上,各節點分别處理自己所用的那一部分
//node1擁有1,node2擁有2
Reduce:最後要把node1和node2上的運作結果進行合并
最終速度:取決于速度最慢的 node
MapReduce:
1.開發API
2.運作架構
3.提供運作時環境
NAS和SAN的缺點:存儲系統隻有1個,面對海量資料,需要進行資料存取,磁盤IO和網絡IO将面臨極大挑戰
是以出現了分布式存儲
二、HDFS和MapReduce
1.無中心節點
2.有中心節點HDFS //中繼資料節點是瓶頸和核心所在。//GFS,HDFS,
中繼資料節點:NN: name node //HA,記憶體資料持久化。他的資料都是存儲在記憶體中的
//事務日志,寫入到持久存儲後,當機後,重新加載,減少丢失的資料。
後端主機要保證:服務可用+資料可用 //DN:data node
在當機後回可能需要檔案系統檢測,資料量過大時,需要浪費大量時間。
//簡單的說:一旦NN崩潰,再次啟動需要半個小時,因為hadoop 1.X NN不支援HA
SNN:second namenode後期提供,
NN需要在記憶體中不斷更新資料,寫入日志,日志和映像檔案合并等
SNN:負責合并資料,假如NN崩潰SNN加載共享存儲的檔案,自己工作。
節省了時間,但是檔案系統檢測需要的時間,依然沒有少。隻是不用立即修複NN
LB:對不同的請求,分發到不同的主機
NN--SNN
[鏡像][SHM]
HDFS 2.0之後的NN可以高可用
中繼資料不再存放到本地存儲,而是存儲到一個共享存儲存放,基于記憶體完成中繼資料存放。
例如:NFS[腦裂]不常用,ZooKeeper
NN1和NN2的更新 操作都向ZooKeeper同步,是以每一個節點都可以從ZooKeeper擷取同樣的資料。
//zookeeper:分布式協調工具(分布式鎖),google的Chubby(不開源)
http://www.cnblogs.com/wuxl360/p/5817471.html //參考網站
資料節點:存放各個chunk的
每個資料存儲副本:存儲到其他節點。預設存儲3個副本。
存儲的時候,之存儲一個,由HDFS另找兩個節點進行存儲。
每一個存儲node會向服務node周期報告自己所存儲 的資料塊資訊+自身狀态資訊。
NN有兩個表:
1.以資料為中心,分布在哪些節點上
2.以節點為核心,持有哪些資料塊
資料如何處理://運作程式的叢集
MapReduce:叢集方式工作。
Map:分散運作
Reduce:合并
一個任務可以分為幾個Map,由MapReduce的架構進行控制的。
需要一個總的節點,進行排程 JobTracker
理想情況:讓擁有請求資料的node都運作任務 //但是有的node可能已經很忙了
假如擁有資料的node繁忙解決方案:
1.等待
2.找副本所在節點 //可能副本節點也比較忙
3.找一個空閑的節點,運作任務。//可能需要複制副本到該空閑node
對于HDFS來說
Hadoop和MapReduce共用的資料節點
client
|
JobTracker
1 1' 2 2'
//隻是這些節點,不再叫做Data Node而稱為Task Tracker,
這些node需要運作兩類程序:DataNode /Task Tracker //負責資料的存儲和處理
是以一個Hadoop就是兩類叢集的結合:存儲資料和處理資料使用的是同一個類節點
三、資料處理模型
程式運作node把資料加載到程式所在node 進行運作 //資料向程式靠攏
Hadoop以資料為中心,讓程式到資料所在節點上運作 //程式向資料靠攏
JobTracker和Name node的工作是不沖突的,是以可以部署在同一個節點上
[JobTracker/NameNode]
||
=====================================================================
taskTracker/DataNode1 taskTracker/DataNode2 taskTracker/DataNode3 ...
每個人送出的任務,不一定是運作在所有節點上的,很有可能是運作在幾個節點上的
可以限制一個node最多可以運作多少個任務。
四、函數式程式設計:
Lisp:ML函數式程式設計語言:高階函數;
map,fold
map:把一個任務映射為多個任務
fold:折疊
示例:map(f()} //map将把f函數運作為多份,分别運作在多個節點上。
map:接受一個函數為參數,并将其應用于清單中的所有元素;
示例清單為:1,2,3,4,5
要擷取每個人age,分别在1,2,3,4,5上執行
例如map後的結果為:22,33,44,12,34
fold:接受兩個參數 1:函數,2:初始值
fold(g(),init) //
把第一個的處理結果替換為init,然後使用g()和第一個的處理結果處理第二個資料,依次輪推
示例:22,33,44,12,34 // fold(g(1),init)=>foldg(g(2) 22)=>fold(g(g3),33),...
最後找出最大者。
MapReduce: //任何一個程式調用該APi之後,被分成兩段
mapper:在task tracker上運作的一個執行個體,最後生成一個結果清單
reducer:從mapper得到的多個結果中
統計一本書中每個單詞出現的次數:
mapper:每100頁一個機關,5個mapper用于拆分成為單詞;進行計數
例如拆成了10000個單詞,其中不乏有重複的
mapper需要保證重複的單詞發送給同一個reducer
稱為:shuffle and sort //傳輸排序的過程
reducer
reducer1,reducer2//啟動了兩個reducer,mapper輪流發送給reducer1和2,重複的發送給同一個reducer,保證每個reducre統計的單詞是不一樣的
最後合并
reducer1:
this:500
is:10
reducer2:
how: 30
do: 20
兩者合并以後成為結果
MapReducer統計的對象資料都是key-value資料,不是kv資料需要先轉換為kv資料
mapper://轉換為kv資料
this 1,is 1, this 1,how 1 //出現一次标記為1
同一個鍵的資料隻能發往同一個reducer
reducer: //也是kv資料
例如把this 對應的所有value相加
is:20
mapper-reducer可能需要執行多次,才能達到結果,隻是每次的目标不同而已。
也可以直接在mapper上統計本地的資料,再發送給reducer的時候
//reducer可以和mapper一起啟動,或者reducer在mapper之後運作
相同的key發送給同一個reducer:誰來保證
由mapper reducer的架構決定的,//啟動幾個reducer是由程式員定義的
Hadoop能夠實作并行處理,
HDFS + MapReduce = Hadoop
調用MapReduce API的程式
|
[NameNode] [JobTracker]
|| ||
Hadoop典型應用有:搜尋、日志處理、推薦系統、資料分析、視訊圖像分析、資料儲存等
圖1:MapReduce架構
<a href="https://s2.51cto.com/wyfs02/M00/9A/B0/wKioL1lZprmS9oDxAACGoweXtTU709.jpg" target="_blank"></a>
五、MapReduce工作模型
MapReduce:工作模型
==================================================================================
[k1|m] [k2|n] [k3|r] [k4|s] [k5|m] [k6|t] [k7|m]
\ / | \ / \ /
[mapper] [mapper] [mapper] [mapper]
| | | |
V V V V
[ik1|3] [ik3|1] [ik1|6] [ik3|2] [ik1|1] [ik1|4] [ik2|3] [ik2|6]
【partitioner】 【partitioner】 【partitioner】 【partitioner】
+++++++++++++++++++++++++++++++++++++++++++++++++
// Shuffle & sort. aggressive values by keys //
++++++++++++++++++++++++++++++++++++++++++++++++
[ik1|3,6,1,4] [ik2|3,6] [ik3|1,2]
| | |
V V V
reducer reducer reducer
| | |
V V V
[ok1|14] [ok2|9] [ok3|3]
====================================================================================
//mapper:讀取鍵值對,生成鍵值對
//combiner:負責在mapper之後,在mapper上把相同的鍵進行合并,僅此而已,輸入和輸出的鍵必須一緻。
//partitioner:負責分發同一個key到同一個reducer,所有的partioner都是一樣的
生成的鍵值如何進行發送,由partitioner決定。
[k1|m] [k2|n] [k3|r] [k4|s] [k5|m] [k6|t] [k7|m]
\ / | \ / \ /
[mapper] [mapper] [mapper] [mapper]
| | | |
V V V V
[ik1|3] [ik3|1] [ik1|6] [ik3|2] [ik1|1] [ik1|4] [ik2|3] [ik2|6]
【combiner】 【combiner】 【combiner】 【combiner】
| | | |
V V V V
[ik1:3][ik3:1] [ik1:6][ik3:2] [ik1:5] [ik2:9]
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
| | |
[ok1|14] [ok2|9] [ok3|3]
//combiner和partitioner都是由程式員寫的
Maper啟動的節點:可能沒有一個目标分片,但是需要處理n個分片,需要從其他node複制分片到該節點執行Maper程式
本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1943953,如需轉載請自行聯系原作者