從一個統計氣象學的例子,來引出MapReduce的寫法,對比了一下新舊API的區別以及不一樣。新的API主要採用的是虛類而不是接口的方式來提供服務。討論了數據流:Hadoop的存儲,以及工做原理,還有Combiner函數的使用。最後,談到了使用不一樣語言來實現mapreduce功能(Streaming, Pipes),緣由是由於Hadoop使用了Unix標準做爲流做爲輸入輸出和應用程序之間的接口,因此咱們可使用任何編程語言經過標準輸入輸出來寫MapReduce程序。java
首先講解了文件系統的概念,以及Hadoop文件系統的特色:超大文件、流式數據訪問、商用硬件、不知足低延遲數據訪問、不適合大量小文件、不支持多寫入以及任意修改等等。而後又介紹了塊存儲的特色。利用塊存儲的原理的優勢是:node
而後又繼續講解了namenode和datanode這兩個老生常談的話題,你須要知道這兩個node的功能是什麼。須要注意的是namenode的安全機制,由於它事關整個文件系統的生死。關於Hadoop文件系統HDFS的高可用性的實現,有不少文章都探討過了,你們能夠去網上搜搜。web
此外這一章節還談到了文件系統的基本操做,好比複製,對比之類的。數據庫
而後接下來比較重點講的是HDFS的訪問,書中介紹了這麼幾個方式:編程
而後介紹了讀寫HDFS的方法,揭示了客戶端與HDFS交互的背後的原理,這個在個人博文中也有詳細的講到。還講到了文件一致性,以及數據導入程序Flume和Sqoop,而後是並行複製工具distcp。最後講Hadoop的存檔工具。安全
既然涉及到hadoop的IO,就會有文件的讀寫,那麼讀寫確定要防止差錯,那麼監測數據是否損壞的常見措施,就是看數據在第一次引入系統的時候計算校驗和,而且在數據統統過一個不可靠的通道進行傳輸時候再次計算校驗和,這樣就能發現數據是否損壞。而檢測校驗和是否匹配並不能糾錯,因此這也正是不可使用低端硬件的緣由,換句話說,必定要使用ECC內存(由於ECC內存和普通內存的區別是,ECC是一種普遍應用於計算機領域中的指令糾錯技術,ECC內存的意思就是將這種技術應用於內存的製造中)。咱們經常採用CRC-32技術進行校檢,默認狀況下讀取512個字節,而因爲CRC的校驗和是4個字節,因此存儲校驗和的額外開銷低於1%。服務器
hadoop自帶一套原子操做用於用於數據IO操做,其中有一些技術比Hadoop自己更經常使用。好比數據的完整性和數據壓縮。由於涉及到IO確定要涉及到內存以及數據流量的大小。具體使用哪種壓縮方式,還須要根據Hadoop提供的各類壓縮方式的優缺點來斷定。咱們能夠根據hadoop提供的壓縮命令來調整使用哪一種壓縮策略,譬如:gzip -1 filename gzip表明的是壓縮方式,而-1爲優化壓縮速度,-9表明了優化壓縮空間。這兩個選項是矛盾的。網絡
因此咱們不只僅要根據現實狀況實現不一樣種類的數據壓縮,還能夠根據壓縮文件名後綴進行壓縮方式的判斷,並且在使用mapreduce的時候要考察該壓縮方式是否支持切片操做。此外在map和reduce之間也能夠進行壓縮來進行提速。框架
IO意味着傳輸,而傳輸就意味着序列化,而序列化在分佈式數據處理領域中常常出現:一個是進程間通訊,另外一個則是永久儲存。Hadoop系統中多個節點間的通訊是經過RPC協議進行的,RPC序列化的格式以下:maven
緊湊的格式可以充分利用網絡帶寬
進程間通訊造成了分佈式系統的骨架,因此須要儘可能減小序列化和反序列化性能的開銷,這個是最基本的。
爲了知足新的需求,協議不斷變化,因此在控制客戶端和服務器端的過程當中,須要直接引進相應的協議。例如可以在方法調用的過程當中增添新的參數,而且新的服務器須要可以接受來自老客戶端的老格式消息。
對於某些系統來講,但願能支持以不一樣語言寫的客戶端與服務器交互,因此須要設計一種特定的格式來知足這種需求。
爲了支持序列化,hadoop本身採用的是writable類型的,它的特色是緊湊,速度快,可是不易於擴展。爲了克服這個缺點,Apache開發了序列化框架Avro。咱們想一下,須要本身開發序列化框架的緣由是啥,仍是由於咱們的字符編碼方式有着千差萬別,而序列化講究的是無障礙的快速傳輸,因此要達到這一點,必需要實現本身的統一編碼方式,換句話說就是通用的序列化框架。那麼咱們可能會有疑問,爲何咱們不用java自帶的java object serialization?由於高效,高性能的進程間通訊是hadoop的關鍵,咱們須要精確的控制鏈接,延遲和緩衝的處理方式,因此RMI無能爲力。總而言之,
因而乎,Avro就成爲了本章節詳細介紹的重點。那麼什麼是Avro,如何去理解Avro,我會專門開一篇博文介紹一下。
首先介紹了MP的編寫流程及注意事項,我以爲不只僅是MP,並且是針對全部的大數據計算程序的必須遵循的步驟,因此這裏仍是要囉嗦一下如何確保程序的正確性:
MP的編程遵循必定的特殊流程,首先編寫map函數和reduce函數,最好使用單元測試來確保函數的運行是否符合預期。若是小數據集測試合格,那麼再放到大數據集合上測試。當程序在數據集上運行的時候,可能會出現不少問題,那麼再進行測試修復。當程序邏輯性真確無誤後,那麼再進行優化調試。
首先,用於配置的API都是經過XML配置文件運行的,此外全部的依賴也是經過maven來管理的,因此這個跟web開發的套路差很少。同時爲了簡化以命令行的方式運行做業,Hadoop也提供了輔助類,相似GenericOptionsParser,Tool和ToolRunner。此外用MRUnit可很方便的編寫測試類。在全部程序都寫好了之後,能夠在本地運行和集羣上運行。在本地上運行沒有什麼能夠說的,那麼在集羣上運行,分爲如下幾個步驟:
1. 打包做業 2.啓動做業 3.獲取結果 4.做業調試 5.做業調優
以上就是Hadoop的運行流程,那麼在實際過程當中,咱們如何將複雜的問題轉換成MapReduce的工做流。本書的這個章節也作了一個具體的例子分析,這裏就再也不贅述。
這個章節詳細介紹了1.X版本的hadoop和2.X的不一樣,主要就是在YARN上面。基本的流程很少扯,在我以前的幾篇博文裏面都有提到,簡而言之就是:
1.做業的提交 2.做業的初始化 3.任務的分配 4.任務的執行 5.進度和狀態的更新 6.做業的完成
而YARN的誕生主要是解決了節點數超過4000之後MP系統擴展性的瓶頸,該章節也詳細介紹了yarn在設計理念基礎,以及每一個方面與經典mapreduce的不一樣。另外還講述了map到reduce之間的shuffle和排序的細節。
maperduce數據處理模型很簡單:map和reduce函數的輸入和輸出是鍵值對,第七章主要介紹各類類型的數據如何在MapReduce中使用。
這個章節繼續探討了MapReduce的一些高級特性
計數器(各類各樣的計數器類型) 排序 鏈接 邊數據 MP庫類等等。
以前的幾個章節咱們已經瞭解瞭如何在單機上配置hadoop,本章節講述瞭如何在計算機集羣上構建hadoop系統。
在當集羣創建好了以後,就是如何管理該集羣了。
Pig爲大型數據集的處理提供了更高層次的抽象
這個這裏很少作贅述,我在博客:不跟你談情懷,只跟你聊聊Hive中也有所介紹。
HBase是一個在HDFS上開發的面向列的分佈式數據庫。