1、hadoop介紹
hadoop是一個開源分佈式計算平臺框架基於apache協議發佈由java語言開發。官網地址http://hadoop.apache.org/
hadoop兩大核心組件HDFS分佈式文件系統爲分佈式計算提供了數據存儲和mapreduce應用程序被分區成許多小部分而每個部分都能在集羣中的任意節點上運行一句話就是任務的分解和結果的彙總
其他兩個模塊Common、YARN
和hadoop相關的項目Ambari、Avro、Cassandra、Chukwa、Hbase、Hive、Mahout、Pig、Spark、Tez、Zookeeper
2、hadoop應用
hadoop支持由廉價的計算機搭建集羣有強大的冗餘機制。
hadoop在各大互聯網企業中應用廣泛百度使用hadoop進行搜索日誌的分析和網頁數據的挖掘工作淘寶使用hadoop存儲並處理電子商務交易相關數據facebook使用hadoop進行數據分析和機器學習。
還有哪些企業在使用hadoop http://wiki.apache.org/hadoop/PoweredBy
3、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實例的支持。
4、HDFS概述
HDFS設計思想來源於Google的GFS是GFS的開源實現。
HDFS要解決的問題
(1) 存儲超大文件比如TB級別(2) 防止文件丟失
HDFS的特點
(1) 可以存儲超大文件
(2) 只允許對一個已經打開的文件順序寫入還可以在現有文件的末尾追加。要想修改一個文件追加內容除外只能刪除後再重寫
(3) 可以使用廉價的硬件平臺搭建通過容錯策略來保證數據的高可用默認存儲3份數據任何一份丟失可以自動恢復
HDFS的缺點
(1) 數據訪問延遲比較高因爲它的設計場景是用於大吞吐量數據HDFS是單master所有文件都要經過它當請求數據量很大時延遲就增加了
(2)文件數受限和NameNode有關係
(3) 不支持多用戶寫入也不支持文件任意修改
5、HDFS核心概念
HDFS的幾個概念
數據塊:block大文件會被分割成多個block進行存儲block大小默認爲64MB。每一個block會在多個datanode上存儲多份副本默認是3份。
namenodenamenode:負責管理文件目錄、文件和block的對應關係以及block和datanode的對應關係。
SecondaryNameNode:分擔namenode的工作量是NameNode的冷備份它的主要工作是合併fsimage元數據鏡像文件和fsedits元數據操作日誌然後再發給namenode。
datanodedatanode:就負責存儲了當然大部分容錯機制都是在datanode上實現的。
rack 是指機櫃的意思一個block的三個副本通常會保存到兩個或者兩個以上的機櫃中當然是機櫃中的服務器這樣做的目的是做防災容錯因爲發生一個機櫃掉電或者一個機櫃的交換機掛了的概率還是蠻高的。
6、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繼續讀
7、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文件中