1. 程式人生 > >大資料學習-2 認識Hadoop

大資料學習-2 認識Hadoop

一.什麼是Hadoop?

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等等資料庫不能滿足大量的資料的查詢呢?

首先傳統的資料庫底層還是對磁碟的一個讀寫操作,那麼讀寫操作就要涉及到一個尋找地址的操作,但是這個定址操作是十分耗費時間的(雖然在資料庫上有很多的優化包括索引操作等等),那麼讀取大量資料的時候這個時間必然會很長(再好的演算法在合理的資料結構設計還是會去遍歷資料)。

在一個就是就是更改資料庫操作,對於有大量的資料資料庫我們去更新它的時候往往會增加這個資料庫的壓力,而且效率較為低下。

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