【云計(jì)算 Hadoop】Hadoop 版本 生態(tài)圈 MapReduce模型
忘的差不多了, 先補(bǔ)概念, 然后開始搭建集群實(shí)戰(zhàn) ...
.
一 Hadoop版本 和 生態(tài)圈
1. Hadoop版本
(1) Apache Hadoop版本介紹
Apache的開源項(xiàng)目開發(fā)流程 :
-- 主干分支 : 新功能都是在 主干分支(trunk)上開發(fā);
-- 特性獨(dú)有分支 : 很多新特性穩(wěn)定性很差, 或者不完善, 在這些分支的獨(dú)有特定很完善之后, 該分支就會(huì)并入主干分支;
-- 候選分支 : 定期從主干分支剝離, 一般候選分支發(fā)布, 該分支就會(huì)停止更新新功能, 如果候選分支有BUG修復(fù), 就會(huì)重新針對(duì)該候選分支發(fā)布一個(gè)新版本;候選分支就是發(fā)布的穩(wěn)定版本;
造成Hadoop版本混亂的原因?:
--?主要功能在分支版本開發(fā)?: 0.20分支發(fā)布之后, 主要功能一直在該分支上進(jìn)行開發(fā), 主干分支并沒有合并這個(gè)分支, 0.20分支成為了主流;
--?低版本的后發(fā)布?: 0.22版本 發(fā)布 要晚于 0.23版本;
--?版本重命名?: 0.20分支的 0.20.205版本重命名為 1.0版本, 這兩個(gè)版本是一樣的, 只是名字改變了;
Apache Hadoop 版本示意圖 :
.
(2) Apache Hadoop 版本功能介紹
第一代Hadoop特性?:
--?append?: 支持文件追加功能, 讓用戶使用HBase的時(shí)候避免數(shù)據(jù)丟失, 也是使用HBase的前提;
--?raid?: 保證數(shù)據(jù)可靠, 引入校驗(yàn)碼校驗(yàn)數(shù)據(jù)塊數(shù)目;
--?symlink?: 支持HDFS文件鏈接;
--?security?: hadoop安全機(jī)制;
--?namenode HA?: 為了避免 namenode單點(diǎn)故障情況, HA集群有兩臺(tái)namenode;
第二代Hadoop特性 :
--?HDFS Federation?: NameNode制約HDFS擴(kuò)展, 該功能讓多個(gè)NameNode分管不同目錄, 實(shí)現(xiàn)訪問隔離和橫向擴(kuò)展;
--?yarn?: ?MapReduce擴(kuò)展性 和 多框架方面支持不足, yarn 是全新的資源管理框架, 將JobTracker資源管理 和 作業(yè)控制功能分開, ResourceManager負(fù)責(zé)資源管理, ApplicationMaster負(fù)責(zé)作業(yè)控制;
0.20版本分支 : 只有這個(gè)分支是穩(wěn)定版本, 其它分支都是不穩(wěn)定版本;
-- 0.20.2版本(穩(wěn)定版) : 包含所有特性, 經(jīng)典版;
-- 0.20.203版本(穩(wěn)定版) : 包含append, 不包含 symlink raid namenodeHA 功能;
-- 0.20.205版本/1.0版本(穩(wěn)定版) : 包含 append security, 不包含 symlink raid namenodeHA功能;
-- 1.0.1 ~ 1.0.4版本(穩(wěn)定版) : 修復(fù)1.0.0的bug 和 進(jìn)行一些性能上的改進(jìn);
0.21版本分支(不穩(wěn)定版) : 包含 append raid symlink namenodeHA, 不包含 security ;
0.22版本分支(不穩(wěn)定版) : 包含 append raid symlink 那么弄得HA, 不包含 mapreduce security;
0.23版本分支 :
-- 0.23.0版本(不穩(wěn)定版) : 第二代的hadoop, 增加了 HDFS Federation 和 yarn;
-- 0.23.1 ~ 0.23.5 (不穩(wěn)定版) : 修復(fù) 0.23.0 的一些BUG, 以及進(jìn)行一些優(yōu)化;
-- 2.0.0-alpha ~ 2.0.2-alpha(不穩(wěn)定版) : 增加了 namenodeHA 和 Wire-compatiblity 功能;
(3) Cloudera Hadoop對(duì)應(yīng)Apache Hadoop版本
.
2. Hadoop生態(tài)圈
Apache支持 : Hadoop的核心項(xiàng)目都受Apache支持的, 除了Hadoop之外, 還有下面幾個(gè)項(xiàng)目, 也是Hadoop不可或缺的一部分;
-- HDFS : 分布式文件系統(tǒng), 用于可靠的存儲(chǔ)海量數(shù)據(jù);
-- MapReduce : 分布式處理數(shù)據(jù)模型, 可以運(yùn)行于大型的商業(yè)云計(jì)算集群中;
-- Pig : 數(shù)據(jù)流語言 和 運(yùn)行環(huán)境, 用來檢索海量數(shù)據(jù)集;
-- HBase : 分布式數(shù)據(jù)庫(kù), 按列存儲(chǔ), HBase使用HDFS作為底層存儲(chǔ), 同時(shí)支持MapReduce模型的海量計(jì)算 和 隨機(jī)讀取;
-- Zookeeper : 提供Hadoop集群的分布式的協(xié)調(diào)服務(wù), 用于構(gòu)建分布式應(yīng)用, 避免應(yīng)用執(zhí)行失敗帶來的不確定性損失;
-- Sqoop : 該工具可以用于 HBase 和 HDFS 之間的數(shù)據(jù)傳輸, 提高數(shù)據(jù)傳輸效率;
-- Common : 分布式文件系統(tǒng), 通用IO組件與接口, 包括 序列化, Java RPC, 和持久化數(shù)據(jù)結(jié)構(gòu);
-- Avro : 支持高效 跨語言的RPC 及 永久存儲(chǔ)數(shù)據(jù)的序列化系統(tǒng);
二. MapReduce模型簡(jiǎn)介
MapReduce簡(jiǎn)介 : MapReduce 是一種 數(shù)據(jù)處理 編程模型;
-- 多語言支持 : MapReduce 可以使用各種語言編寫, 例如 Java, Ruby, Python, C ++ ;
-- 并行本質(zhì) : MapReduce 本質(zhì)上可以并行運(yùn)行的;
1. MapReduce 數(shù)據(jù)模型解析
MapReduce數(shù)據(jù)模型 :
-- 兩個(gè)階段 : MapReduce 的任務(wù)可以分為兩個(gè)階段, Map階段 和 Reduce階段;
-- 輸入輸出 : 每個(gè)階段都使用鍵值對(duì)作為輸入 和 輸出, IO類型可以由程序員進(jìn)行選擇;
-- 兩個(gè)函數(shù) : map 函數(shù) 和 reduce 函數(shù);
MapReduce作業(yè)組成 : 一個(gè)MapReduce 工作單元, 包括 輸入數(shù)據(jù), MapReduce 程序 和 配置信息;
作業(yè)控制 : 作業(yè)控制由 JobTracker(一個(gè)) 和 TaskTracker(多個(gè)) 進(jìn)行控制的;
-- JobTracker作用 : JobTracker 控制 TaskTracker 上任務(wù)的運(yùn)行, 進(jìn)行統(tǒng)一調(diào)度;
-- TaskTracker作用 : 執(zhí)行具體的 MapReduce ?程序;
-- 統(tǒng)一調(diào)度方式 : TaskTracker 運(yùn)行的同時(shí)將運(yùn)行進(jìn)度發(fā)送給 JobTracker, JobTracker記錄所有的TaskTracker;
-- 任務(wù)失敗處理 : 如果一個(gè) TaskTracker 任務(wù)失敗, JobTracker 會(huì)調(diào)度其它 TaskTracker 上重新執(zhí)行該MapReduce 作業(yè);
2. Map 數(shù)據(jù)流
輸入分片 : MapReduce 程序執(zhí)行的時(shí)候, 輸入的數(shù)據(jù)會(huì)被分成等長(zhǎng)的數(shù)據(jù)塊, 這些數(shù)據(jù)塊就是分片;
-- 分片對(duì)應(yīng)任務(wù) : 每個(gè)分片都對(duì)應(yīng)著一個(gè) Map 任務(wù), 即MapReduce 中的map函數(shù);
-- 并行處理 : 每個(gè)分片 執(zhí)行 Map 任務(wù)要比 一次性處理所有數(shù)據(jù) 時(shí)間要短;
-- 負(fù)載均衡 : 集群中的計(jì)算機(jī) 有的 性能好 有的性能差, 按照性能合理的分配 分片 大小, 比 平均分配效率要高, 充分發(fā)揮出集群的效率;
-- 合理分片 : 分片越小負(fù)載均衡效率越高, 但是管理分片 和 管理map任務(wù) 總時(shí)間會(huì)增加, 需要確定一個(gè)合理的 分片大小, 一般默認(rèn)為 64M, 與塊大小相同;
數(shù)據(jù)本地優(yōu)化 : map 任務(wù)運(yùn)行在 本地存儲(chǔ)數(shù)據(jù)的 節(jié)點(diǎn)上, 才能獲得最好的效率;
-- 分片 = 數(shù)據(jù)塊 : 一個(gè)分片只在單個(gè)節(jié)點(diǎn)上存儲(chǔ), 效率最佳;
-- 分片 > 數(shù)據(jù)塊 :?分片 大于 數(shù)據(jù)塊, 那么一個(gè)分片的數(shù)據(jù)就存儲(chǔ)在了多個(gè)節(jié)點(diǎn)上, map 任務(wù)所需的數(shù)據(jù)需要從多個(gè)節(jié)點(diǎn)傳輸, 會(huì)降低效率;
Map任務(wù)輸出 : Map 任務(wù)執(zhí)行結(jié)束后, 將計(jì)算結(jié)果寫入到 本地硬盤, 不是寫入到 HDFS 中;
-- 中間過渡 : Map的結(jié)果只是用于中間過渡, 這個(gè)中間結(jié)果要傳給 Reduce 任務(wù)執(zhí)行, reduce 任務(wù)的結(jié)果才是最終結(jié)果, map 中間值 最后會(huì)被刪除;
-- map任務(wù)失敗 : 如果 map 任務(wù)失敗, 會(huì)在另一個(gè)節(jié)點(diǎn)重新運(yùn)行這個(gè)map 任務(wù), 再次計(jì)算出中間結(jié)果;
3. Reduce 數(shù)據(jù)流
Reduce任務(wù) : map 任務(wù)的數(shù)量要遠(yuǎn)遠(yuǎn)多于 Reduce 任務(wù);
-- 無本地化優(yōu)勢(shì) : Reduce 的任務(wù)的輸入是 Map 任務(wù)的輸出, reduce 任務(wù)的絕大多數(shù)數(shù)據(jù) 本地是沒有的;
-- 數(shù)據(jù)合并 : map 任務(wù) 輸出的結(jié)果, 會(huì)通過網(wǎng)絡(luò)傳到 reduce 任務(wù)節(jié)點(diǎn)上, 先進(jìn)行數(shù)據(jù)的合并, 然后在輸入到reduce 任務(wù)中進(jìn)行處理;
-- 結(jié)果輸出 : reduce 的輸出直接輸出到 HDFS中;
-- reduce數(shù)量 : reduce數(shù)量是特別指定的, 在配置文件中指定;
MapReduce數(shù)據(jù)流框圖解析 :
-- 單個(gè)MapReduce的數(shù)據(jù)流 :
-- 多個(gè)MapReduce模型 :
-- 沒有Reduce程序的MapReduce數(shù)據(jù)流 :
Map輸出分區(qū) : 多個(gè) reduce 任務(wù), 每個(gè)reduce 任務(wù)都對(duì)應(yīng)著 一些map任務(wù), 我們將這些map 任務(wù) 根據(jù)其輸入reduce 任務(wù)進(jìn)行分區(qū), 為每個(gè)reduce 建立一個(gè)分區(qū);
-- 分區(qū)標(biāo)識(shí) : map結(jié)果有許多種類鍵, 相同的鍵對(duì)應(yīng)的數(shù)據(jù) 傳給 一個(gè)reduce, 一個(gè)map 可能會(huì)給多個(gè)reduce輸出數(shù)據(jù);
-- 分區(qū)函數(shù) : 分區(qū)函數(shù)可以由用戶定義, 一般情況下使用系統(tǒng)默認(rèn)的分區(qū)函數(shù) partitioner, 該函數(shù)通過哈希函數(shù)進(jìn)行分區(qū);
混洗 : map 任務(wù) 和 reduce 任務(wù)之間的數(shù)據(jù)流成為混;
-- reduce數(shù)據(jù)來源 : 每個(gè) reduce 任務(wù)的輸入數(shù)據(jù)來自多個(gè)map
-- map 數(shù)據(jù)去向 : 每個(gè) map 任務(wù)的結(jié)果都輸出到多個(gè) reduce 中;
沒有Reduce : 當(dāng)數(shù)據(jù)可以完全并行處理的時(shí)候, 就可以不適用reduce, 只進(jìn)行map 任務(wù);
4. Combiner 引入
MapReduce瓶頸 : 帶寬限制了 MapReduce 執(zhí)行任務(wù)的數(shù)量, Map 和 Reduce 執(zhí)行過程中需要進(jìn)行大量的數(shù)據(jù)傳輸;\
-- 解決方案 : 合并函數(shù) Combiner, 將 多個(gè) Map 任務(wù)輸出的結(jié)果合并, 將合并后的結(jié)果發(fā)送給 Reduce 作業(yè);
5. Hadoop Streaming
Hadoop多語言支持 : Java, Python, Ruby, C++;
-- 多語言 : Hadoop 允許使用 其它 語言寫 MapReduce 函數(shù);
-- 標(biāo)準(zhǔn)流 : 因?yàn)?Hadoop 可以使用 UNIX 標(biāo)準(zhǔn)流 作為 Hadoop 和 應(yīng)用程序之間的接口, 因此 只要使用標(biāo)準(zhǔn)流, 就可以進(jìn)行 MapReduce 編程;
Streaming處理文本 : Streaming在文本處理模式下, 有一個(gè)數(shù)據(jù)行視圖, 非常適合處理文本;
-- Map函數(shù)的輸入輸出 : 標(biāo)準(zhǔn)流 一行一行 的將數(shù)據(jù) 輸入到 Map 函數(shù), Map函數(shù)的計(jì)算結(jié)果寫到 標(biāo)準(zhǔn)輸出流中;
-- Map輸出格式 : 輸出的 鍵值對(duì) 是以制表符 分隔的行, 以這種形式寫出的標(biāo)準(zhǔn)輸出流中;
-- Reduce函數(shù)的輸入輸出 : 輸入數(shù)據(jù)是 標(biāo)準(zhǔn)輸入流中的 通過制表符 分隔的鍵值對(duì) 行, 該輸入經(jīng)過了Hadoop框架排序, 計(jì)算結(jié)果輸出到標(biāo)準(zhǔn)輸出流中;
6. Hadoop Pipes
Pipes概念 : Pipes 是 MapReduce 的C++ 接口;
-- 理解誤區(qū) : Pipes 不是使用 標(biāo)準(zhǔn) 輸入 輸出流作為 Map 和 Reduce 之間的Streaming, 也沒有使用JNI編程;
-- 工作原理 : Pipes 使用套接字作為 map 和 reduce 函數(shù) 進(jìn)程之間的通信;
Hadoop MapReduce 云計(jì)算
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。