hadoop:
開源分布式平臺
核心:HDFS、MapReduce
HDFS在集群上實(shí)現(xiàn)分布式文件系統(tǒng)
MapReduce在集群上實(shí)現(xiàn)分布式計(jì)算和任務(wù)處理
1 HDFS體系結(jié)構(gòu)
一個(gè)HDFS集群是由一個(gè)NameNode和若干個(gè)DataNode組成。
NameNode(名字節(jié)點(diǎn)):管理文件系統(tǒng)的命名空間和客戶端對文件的訪問操作
(1)執(zhí)行文件系統(tǒng)的命名空間操作,如打開、關(guān)閉、重命名文件或目錄
(2)負(fù)責(zé)數(shù)據(jù)塊到具體DataNode的映射
DataNode(數(shù)據(jù)節(jié)點(diǎn)):管理存儲的數(shù)據(jù)
(1)負(fù)責(zé)處理文件系統(tǒng)客戶端的文件讀寫請求
(2)在NameNode的統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制工作
2 MapReduce體系結(jié)構(gòu)
MapReduce框架是由一個(gè)單獨(dú)運(yùn)行在主節(jié)點(diǎn)的JobTracker和運(yùn)行在每個(gè)集群從節(jié)點(diǎn)的TaskTracker共同組成的。
JobTracker:調(diào)度和管理其他TaskTracker
TaskTracker:負(fù)責(zé)執(zhí)行任務(wù) ,運(yùn)行于DataNode之上
3 MapReduce任務(wù)處理流程
思想:分而治之
用戶自定義的Map函數(shù)把輸入的鍵值對映射(map)成一組新的鍵值對
MapReduce把所有具有相同的key值的value集合一起,傳遞給Reduce函數(shù)
用戶自定義的Reduce函數(shù)對相同key下的所有value進(jìn)行處理再輸出最終的鍵值對
4 MapReduce應(yīng)用案例
4.1 單詞計(jì)數(shù)
解決方案
將文件內(nèi)容切分為單詞
將所有相同的單詞聚集在一起
計(jì)算單詞出現(xiàn)的次數(shù)并輸出
設(shè)計(jì)思路
map階段:完成由輸入數(shù)據(jù)到單詞切分的工作 <行號,內(nèi)容> --> <word,1>
reduce階段:接收所有單詞并計(jì)算其頻數(shù) <word,{1,1,…}> --> <word,sum>
4.2 數(shù)據(jù)去重
解決方案
將文件內(nèi)容切分為單詞
將所有相同的單詞聚集在一起
接收元組,直接輸出key
設(shè)計(jì)思路
map階段:完成由輸入數(shù)據(jù)到單詞切分的工作 <行號,內(nèi)容> --> <word,1>
reduce階段:接收單詞并直接輸出鍵 <word,{1,1,…}> --> <word,NAN>
4.3 數(shù)據(jù)排序
解決方案
利用hadoop自帶的排序
將數(shù)據(jù)轉(zhuǎn)為IntWritable類型
hadoop自動對所有的元組進(jìn)行基于Key的排序
接收元組,直接輸出key,根據(jù)輸入value-list中的元素個(gè)數(shù)決定key的輸出次數(shù)
設(shè)計(jì)思路
map階段:將輸入的value轉(zhuǎn)為IntWritable類型,作為輸出的key <行號,data> --> <data,1>
自定義partition函數(shù):
(1)注意:reduce自動排序僅僅是發(fā)送到自己所在節(jié)點(diǎn)的數(shù)據(jù),使用默認(rèn)的排序不能保證全局順序
(2)根據(jù)輸入數(shù)據(jù)的最大值和mapreduce框架中partition的數(shù)量獲取將輸入數(shù)據(jù)按照大小分塊的邊界,然后根據(jù)輸入數(shù)據(jù)和邊界的關(guān)系返回對應(yīng)的partition ID
reduce階段:將輸入的key復(fù)制到輸出的value上,根據(jù)輸入value-list中的元素個(gè)數(shù)決定key的輸出次數(shù),用全局linenum代表key的位次 <data,{1,1,…}> --> <linenum, data>
4.4 單/多表連接
解決方案
區(qū)分輸入行是左表還是右表,然后對兩列值進(jìn)行分割,連接列保存在key中,其他列和左右表標(biāo)識保存在value中
解析map輸出,將value中數(shù)據(jù)按照左右表標(biāo)識分別保存,求笛卡爾積并輸出
設(shè)計(jì)思路
map階段:識別出輸入的行屬于哪個(gè)表后,對其進(jìn)行分割,將連接的列值保存在key中,另一列和左右表標(biāo)識保存在value中,然后輸出<行號,行數(shù)據(jù)> --> <連接列值,其他列值和左右表標(biāo)識>
reduce階段:拿到連接結(jié)果后,解析value內(nèi)容,根據(jù)標(biāo)識將左右表內(nèi)容分開存放,求笛卡爾積最后直接輸出 <連接列值,{其他列值和左右表標(biāo)識,其他列值和左右表標(biāo)識,…}> --> <連接列值,左表其他列值和右表其他列值的笛卡爾積>