一.什麼是Hadoop?node
Hadoop能夠簡單的理解爲一個數據存儲和數據分析分佈式系統。隨着互聯網的普及產生的數據是很是的龐大的,那麼咱們怎麼去處理這麼大量的數據呢?傳統的單一計算機確定是完成不了的,那麼大致的出路只有兩條,第一種是研究更牛逼的計算機(好比說超級計算機和量子計算機),可是超級計算機和量子計算機研究耗費的時間和金錢是不可思議的,第二條就是集羣計算(數據量巨大一臺計算機不行,我一百臺,一萬臺計算機處理總能夠了吧?)那麼Hadoop就是後者。程序員
Hadoop並非去強化某一臺計算機的計算能力而是去解決一百臺、一萬臺計算機集羣計算時的故障和異常,爲這一百臺、一萬臺計算機集羣計算提供可能性服務。在簡單來講就是Hadoop就是讓這麼多計算機一塊兒去處理一批數據,保證數據在這麼多的機子上還不出錯。算法
二.Hadoop的發展歷史數據庫
在這裏咱們不得不去提一下Apache軟件基金會,他是一個是專門爲支持開源軟件項目而辦的一個非盈利性組織。在它所支持的Apache項目與子項目中,所發行的軟件產品都遵循Apache許可證(Apache License)。編程
那麼Hadoop就是在這個基金會下誕生的。服務器
最開始咱們仍是要講到谷歌,谷歌爲了擺脫IOE(IBM小型機、Oracle數據庫以及EMC存儲)就建立了他們的GFS(Google File System)也是一個文件分佈式系統,並發表了三篇分別有關與GFS、MapReduce、BigTable的論文可是沒有開源GFS的核心技術。而後在論文的指導下Doug Cutting(Hadoop之父)對其作了開發而且開源。最後Apache軟件基金會對Doug Cutting的開發和其餘公司的開發其進行了整合完善推出了Hadoop。網絡
三.爲何要使用Hadoop?數據結構
3.1開始咱們必定會有這樣的問題就是爲何MySQL、Oracle等等數據庫不能知足大量的數據的查詢呢?併發
首先傳統的數據庫底層仍是對磁盤的一個讀寫操做,那麼讀寫操做就要涉及到一個尋找地址的操做,可是這個尋址操做是十分耗費時間的(雖然在數據庫上有不少的優化包括索引操做等等),那麼讀取大量數據的時候這個時間必然會很長(再好的算法在合理的數據結構設計仍是會去遍歷數據)。app
在一個就是就是更改數據庫操做,對於有大量的數據數據庫咱們去更新它的時候每每會增長這個數據庫的壓力,並且效率較爲低下。
3.2那麼傳統的數據庫在大數據(PB級別 1PB=1024TB)存在必定的缺陷那麼咱們該怎麼去解決呢?
如今咱們就要引入MapReduce這個概念,首先來了解一下MapReduce,在後面咱們會詳細的去學習Hadoop中的MapReduce,MapReduce的簡單介紹以下:
MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。概念"Map(映射)"和"Reduce(歸約)",和它們的主要思想,都是從函數式編程語言裏借來的,還有從矢量編程語言裏借來的特性。它極大地方便了編程人員在不會分佈式並行編程的狀況下,將本身的程序運行在分佈式系統上。 當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定併發的Reduce(歸約)函數,用來保證全部映射的鍵值對中的每個共享相同的鍵組。(其實我如今也不太懂MapReduce這個編程模型,可是經過咱們後期的學習必定能夠搞懂)
那麼我麼來對比一下他們MapReduce和傳統的關係型數據庫的對比
3.3MapReduce的三大設計目標
1.服務於只須要短短几分鐘或者幾個小時就能夠完成任務
2.運行於同一個內部有高速網絡鏈接的數據中心內
3.數據中心內部的計算機都是可靠的專門的硬件
四.部分專業名詞介紹
4.1MapReduce中的專業名詞
job:一個MapReduce程序就是一個job。
task:在一個job中能夠有多個task,task能夠是Map Task,Reduce Task,這個task就是每一個節點計算機的計算任務。
HDFS:Hadoop分佈式文件系統(Hadoop distributed file system)
Namenode:它維護着文件系統樹(filesystem tree)以及文件樹中全部的文件和文件夾的元數據(metadata),沒有namenode那麼HDFS就不能運行
Secondary Namenode:主要做用是按期的將Namespace鏡像與操做日誌文件(edit log)合併,以防止操做日誌文件(edit log)變得過大,若是namenode宕機了,secondary namenode中的文件就會用的上。大多數狀況下會與NFS遠程掛載。
DateNode:Datanode是文件系統的工做節點,他們根據客戶端或者是namenode的調度存儲和檢索數據,而且按期向namenode發送他們所存儲的塊(block)的列表。集羣中的每一個服務器都運行一個DataNode後臺程序,這個後臺程序負責把HDFS數據塊讀寫到本地的文件系統。當須要經過客戶端讀/寫某個 數據時,先由NameNode告訴客戶端去哪一個DataNode進行具體的讀/寫操做,而後,客戶端直接與這個DataNode服務器上的後臺程序進行通 信,而且對相關的數據塊進行讀/寫操做。
JobTracker:負責任務的管理和調度(一個hadoop集羣中只有一臺JobTracker)
TaskTracker:負責執行工做,在DataNode節點上執行(Map函數和Reduce函數運行的節點)
五.理解MapReduce
5.1MapReduce高度抽象
將多臺計算機聯合起來處理一個問題那麼這個過程必定是至關複雜的,可是Hadoop將其高度的抽象了,他只須要程序員去編寫map函數和reduce函數便可。
5.2MapReduce的工做流
圖片來自:https://blog.csdn.net/chaojixiaozhu/article/details/78931413
5.3map任務和reduce任務做用介紹
map任務將其輸出寫入本地硬盤,而非HDFS。這是爲何?由於map的輸出是中間結果:該中間結果由reduce任務處理後才產生最終輸出結果,並且一旦做業完成,map的輸出結果就能夠刪除。所以,若是把它存儲在HDFS中並實現備份,不免有些小題大作。若是該節點上運行的map任務在將map中間結果傳送給reduce任務以前失敗,Hadoop將在另外一個節點上從新運行這個map任務以再次構建map中間結果。
reduce任務並不具有數據本地化的優點——單個reduce任務的輸入一般來自於全部mapper的輸出。在本例中,咱們僅有一個reduce任務,其輸入是全部map任務的輸出。所以,排過序的map輸出需經過網絡傳輸發送到運行reduce任務的節點。數據在reduce端合併,而後由用戶定義的reduce函數處理。reduce的輸出一般存儲在HDFS中以實現可靠存儲。對於每一個reduce輸出的HDFS塊,第一個副本存儲在本地節點上,其餘副本存儲在其餘機架節點中。所以,將reduce的輸出寫入HDFS確實須要佔用網絡帶寬,但這與正常的HDFS流水線寫入的消耗同樣。(該部分截取自 https://blog.csdn.net/universe_ant/article/details/56494398)