Apache的開源項目開發流程 : node
-- 主幹分支 : 新功能都是在 主幹分支(trunk)上開發;程序員
-- 特性獨有分支 : 不少新特性穩定性不好, 或者不完善, 在這些分支的獨有特定很完善以後, 該分支就會併入主幹分支;數據庫
-- 候選分支 : 按期從主幹分支剝離, 通常候選分支發佈, 該分支就會中止更新新功能, 若是候選分支有BUG修復, 就會從新針對該候選分支發佈一個新版本;候選分支就是發佈的穩定版本;編程
形成Hadoop版本混亂的緣由 : 安全
-- 主要功能在分支版本開發 : 0.20分支發佈以後, 主要功能一直在該分支上進行開發, 主幹分支並無合併這個分支, 0.20分支成爲了主流;網絡
-- 低版本的後發佈 : 0.22版本 發佈 要晚於 0.23版本;數據結構
-- 版本重命名 : 0.20分支的 0.20.205版本重命名爲 1.0版本, 這兩個版本是同樣的, 只是名字改變了;app
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 功能;
.
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 可使用各類語言編寫, 例如 Java, Ruby, Python, C ++ ;
-- 並行本質 : 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 做業;
輸入分片 : MapReduce 程序執行的時候, 輸入的數據會被分紅等長的數據塊, 這些數據塊就是分片;
-- 分片對應任務 : 每一個分片都對應着一個 Map 任務, 即MapReduce 中的map函數;
-- 並行處理 : 每一個分片 執行 Map 任務要比 一次性處理全部數據 時間要短;
-- 負載均衡 : 集羣中的計算機 有的 性能好 有的性能差, 按照性能合理的分配 分片 大小, 比 平均分配效率要高, 充分發揮出集羣的效率;
-- 合理分片 : 分片越小負載均衡效率越高, 可是管理分片 和 管理map任務 總時間會增長, 須要肯定一個合理的 分片大小, 通常默認爲 64M, 與塊大小相同;
數據本地優化 : map 任務運行在 本地存儲數據的 節點上, 才能得到最好的效率;
-- 分片 = 數據塊 : 一個分片只在單個節點上存儲, 效率最佳;
-- 分片 > 數據塊 : 分片 大於 數據塊, 那麼一個分片的數據就存儲在了多個節點上, map 任務所需的數據須要從多個節點傳輸, 會下降效率;
Map任務輸出 : Map 任務執行結束後, 將計算結果寫入到 本地硬盤, 不是寫入到 HDFS 中;
-- 中間過渡 : Map的結果只是用於中間過渡, 這個中間結果要傳給 Reduce 任務執行, reduce 任務的結果纔是最終結果, map 中間值 最後會被刪除;
-- map任務失敗 : 若是 map 任務失敗, 會在另外一個節點從新運行這個map 任務, 再次計算出中間結果;
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 任務;
MapReduce瓶頸 : 帶寬限制了 MapReduce 執行任務的數量, Map 和 Reduce 執行過程當中須要進行大量的數據傳輸;\
-- 解決方案 : 合併函數 Combiner, 將 多個 Map 任務輸出的結果合併, 將合併後的結果發送給 Reduce 做業;
Hadoop多語言支持 : Java, Python, Ruby, C++;
-- 多語言 : Hadoop 容許使用 其它 語言寫 MapReduce 函數;
-- 標準流 : 由於 Hadoop 可使用 UNIX 標準流 做爲 Hadoop 和 應用程序之間的接口, 所以 只要使用標準流, 就能夠進行 MapReduce 編程;
Streaming處理文本 : Streaming在文本處理模式下, 有一個數據行視圖, 很是適合處理文本;
-- Map函數的輸入輸出 : 標準流 一行一行 的將數據 輸入到 Map 函數, Map函數的計算結果寫到 標準輸出流中;
-- Map輸出格式 : 輸出的 鍵值對 是以製表符 分隔的行, 以這種形式寫出的標準輸出流中;
-- Reduce函數的輸入輸出 : 輸入數據是 標準輸入流中的 經過製表符 分隔的鍵值對 行, 該輸入通過了Hadoop框架排序, 計算結果輸出到標準輸出流中;
Pipes概念 : Pipes 是 MapReduce 的C++ 接口;
-- 理解誤區 : Pipes 不是使用 標準 輸入 輸出流做爲 Map 和 Reduce 之間的Streaming, 也沒有使用JNI編程;
-- 工做原理 : Pipes 使用套接字做爲 map 和 reduce 函數 進程之間的通訊;