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