一、hadoop介紹html
hadoop是一個開源分佈式計算平臺框架基於apache協議發佈由java語言開發。官網地址http://hadoop.apache.org/java
hadoop兩大核心組件HDFS分佈式文件系統爲分佈式計算提供了數據存儲和mapreduce應用程序被分區成許多小部分而每一個部分都能在集羣中的任意節點上運行一句話就是任務的分解和結果的彙總node
其餘兩個模塊Common、YARNweb
和hadoop相關的項目Ambari、Avro、Cassandra、Chukwa、Hbase、Hive、Mahout、Pig、Spark、Tez、Zookeeper數據庫
二、hadoop應用apache
hadoop支持由廉價的計算機搭建集羣有強大的冗餘機制。編程
hadoop在各大互聯網企業中應用普遍百度使用hadoop進行搜索日誌的分析和網頁數據的挖掘工做淘寶使用hadoop存儲並處理電子商務交易相關數據facebook使用hadoop進行數據分析和機器學習。服務器
還有哪些企業在使用hadoop http://wiki.apache.org/hadoop/PoweredBy網絡
三、hadoop組件介紹數據結構
Common爲其餘組件提供經常使用工具支持。
YARN做業調度和集羣管理的框架。
Ambari: 是 Apache Software Foundation 中的一個項目。就 Ambari 的做用來講就是建立、管理、監視 Hadoop 的集羣可是這裏的 Hadoop 是廣義指的是 Hadoop 整個生態圈例如 HiveHbaseSqoopZookeeper 等。用一句話來講Ambari 就是爲了讓 Hadoop 以及相關的大數據軟件更容易使用的一個工具。http://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari/index.html
AvroAvro是Hadoop中的一個子項目也是Apache中一個獨立的項目Avro是一個基於二進制數據傳輸高性能的中間件。在Hadoop的其餘項目中例如HBase(Ref)和Hive(Ref)的Client端與服務端的數據傳輸也採用了這個工具。Avro是一個數據序列化的系統。Avro 能夠將數據結構或對象轉化成便於存儲或傳輸的格式。Avro設計之初就用來支持數據密集型應用適合於遠程或本地大規模數據的存儲和交換。http://www.open-open.com/lib/view/open1369363962228.html
Cassandra可擴展的多主數據庫不存在單點故障。
Chukwa是數據收集系統用於監控和分析大型分佈式系統的數據。
HBase是一個分佈式面向列的數據庫。
Hive最先由facebook設計是創建在hadoop基礎之上的數據倉庫它提供了一些用於數據整理、特殊查詢和分析在hadoop文件中數據集工具。
Mahout可擴展的機器學習和數據挖掘庫。
Pig是一種高級語言和並行計算可執行框架它是一個對大型數據集分析和評估的平臺。
Spark一個快速和通用計算的Hadoop數據引擎。和mapreduce相似可是要比mapreduce快。它提供了一個簡單而豐富的編程模型支持多種應用包括ETL、機器學習、數據流處理、圖形計算。 參考文檔http://www.techweb.com.cn/network/system/2016-01-25/2267414.shtml
Tez是Apache最新的支持DAG做業的開源計算框架它能夠將多個有依賴的做業轉換爲一個做業從而大幅提高DAG做業的性能。Tez並不直接面向最終用戶事實上它容許開發者爲最終用戶構建性能更快、擴展性更好的應用程序。Hadoop傳統上是一個大量數據批處理平臺。可是有不少用例須要近乎實時的查詢處理性能。還有一些工做則不太適合MapReduce例如機器學習。Tez的目的就是幫助Hadoop處理這些用例場景。
ZooKeeperZooKeeper是一組工具用來配置和支持分佈式調度。一個重要功能就是對全部節點進行配置的同步。它能處理分佈式應用的「部分失敗」問題。部分失敗是分佈式處理系統的固有特徵即發送者沒法知道接收者是否收到消息它的出現可能和網絡傳輸問題、接收進程意外死掉等有關係。ZooKeeper是Hadoop生態系統的一部分但又遠不止如此它能支持更多相似的分佈式平臺和系統如JubatusCassender等等。並且HBase明確指出至少須要一個ZooKeeper實例的支持。
四、HDFS概述
HDFS設計思想來源於Google的GFS是GFS的開源實現。
HDFS要解決的問題
(1) 存儲超大文件好比TB級別(2) 防止文件丟失
HDFS的特色
(1) 能夠存儲超大文件
(2) 只容許對一個已經打開的文件順序寫入還能夠在現有文件的末尾追加。要想修改一個文件追加內容除外只能刪除後再重寫
(3) 可使用廉價的硬件平臺搭建經過容錯策略來保證數據的高可用默認存儲3份數據任何一份丟失能夠自動恢復
HDFS的缺點
(1) 數據訪問延遲比較高由於它的設計場景是用於大吞吐量數據HDFS是單master全部文件都要通過它當請求數據量很大時延遲就增長了
(2)文件數受限和NameNode有關係
(3) 不支持多用戶寫入也不支持文件任意修改
五、HDFS核心概念
HDFS的幾個概念
數據塊:block大文件會被分割成多個block進行存儲block大小默認爲64MB。每個block會在多個datanode上存儲多份副本默認是3份。
namenodenamenode:負責管理文件目錄、文件和block的對應關係以及block和datanode的對應關係。
SecondaryNameNode:分擔namenode的工做量是NameNode的冷備份它的主要工做是合併fsp_w_picpath元數據鏡像文件和fsedits元數據操做日誌而後再發給namenode。
datanodedatanode:就負責存儲了固然大部分容錯機制都是在datanode上實現的。
rack 是指機櫃的意思一個block的三個副本一般會保存到兩個或者兩個以上的機櫃中固然是機櫃中的服務器這樣作的目的是作防災容錯由於發生一個機櫃掉電或者一個機櫃的交換機掛了的機率仍是蠻高的。
六、HDFS工做流程
HDFS寫流程
HDFS寫文件流程:
Client向遠程的Namenode發起RPC請求;
Namenode會檢查要建立的文件是否已經存在,建立者是否有權限進行操做,成功則會爲文件建立一個記錄,不然會讓客戶端拋出異常
當客戶端開始寫入文件的時候,會將文件切分紅多個packets,並向Namenode申請blocks,獲取用來存儲replicas的合適的datanodes列表,列表的大小根據在Namenode中對replication的設置而定。
此時會造成一個pipline用來傳輸packet。
packet以流的方式寫入第一個datanode,該datanode把packet存儲以後,再將其傳遞給下一個datanode,直到最後一個datanode。
最後一個datanode成功存儲以後會返回一個ack傳遞至客戶端,在客戶端,客戶端確認ack後繼續寫入下一個packet。
若是傳輸過程當中,有某個datanode出現了故障,那麼當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除,剩餘的block會繼續剩下的datanode中繼續以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持replicas設定的數量。
HDFS讀流程
HDFS讀文件流程
Client向遠程的Namenode發起RPC請求
Namenode會視狀況返回文件的部分或者所有block列表,對於每一個block,Namenode都會返回有該block拷貝的DataNode地址
Client會選取離本身最接近的DataNode來讀取block
讀取完當前block的數據後,關閉與當前的DataNode鏈接,併爲讀取下一個block尋找最佳的DataNode
當讀完列表的block後,且文件讀取尚未結束,client會繼續向Namenode獲取下一批的block列表
讀取完block會進行checksum驗證,若是讀取datanode時出現錯誤,客戶端會通知Namenode,而後再從下一個擁有該block拷貝的datanode繼續讀
七、MapReduce模型
MapReduce 是大規模數據(TB 級)計算的利器,Map 和Reduce 是它的主要思想,來源於函數式編程語言。
Map負責將數據打散,Reduce負責對數據進行彙集,用戶只須要實現map 和reduce 兩個接口,便可完成TB級數據的計算。
常見的應用包括:日誌分析和數據挖掘等數據分析應用。另外,還可用於科學數據計算,如圓周率PI 的計算等。
當咱們提交一個計算做業時,MapReduce會首先把計算做業拆分紅若干個Map 任務,而後分配到不一樣的節點上去執行,每個Map 任務處理輸入數據中的一部分,當Map 任務完成後,它會生成一些中間文件,這些中間文件將會做爲Reduce 任務的輸入數據。Reduce 任務的主要目標就是把前面若干個Map 的輸出彙總到一塊兒並輸出
MapReduce 執行過程
Mapper任務的執行過程
每一個 Mapper任務是一個 java 進程,它會讀取 HDFS中的文件,解析成不少的鍵值對,通過咱們map方法處理後,轉換爲不少的鍵值對再輸出;把 Mapper任務的運行過程分爲六個階段。
第一階段是把輸入文件按照必定的標準分片(InputSplit),每一個輸入片的大小是固定的。
第二階段是對輸入片中的記錄按照必定的規則解析成鍵值對。
第三階段是調用 Mapper類中的 map 方法。
l第四階段是按照必定的規則對第三階段輸出的鍵值對進行分區。
第五階段是對每一個分區中的鍵值對進行排序。
第六階段是對數據進行概括處理,也就是 reduce處理。鍵相等的鍵值對會調用一次reduce方法。
Reducer任務的執行過程
每一個 Reducer 任務是一個 java 進程。Reducer 任務接收 Mapper任務的輸出,歸約處理後寫入到 HDFS中。能夠分爲3個階段
第一階段是 Reducer 任務會主動從 Mapper任務複製其輸出的鍵值對。 Mapper任務可能會有不少,所以 Reducer會複製多個Mapper的輸出。
第二階段是把複製到 Reducer本地數據,所有進行合併,即把分散的數據合併成一個大的數據。再對合並後的數據排序。
第三階段是對排序後的鍵值對調用reduce方法。鍵相等的鍵值對調用一次 reduce方法,每次調用會產生零個或者多個鍵值對。最後把這些輸出的鍵值對寫入到HDFS文件中