大資料學習之Hadoop如何高效處理大資料

web前端開發交流發表於2018-09-20

Hadoop與Google一樣,都是小孩命名的,是一個虛構的名字,沒有特別的含義。從計算機專業的角度看,Hadoop是一個分散式系統基礎架構,由Apache基金會開發。Hadoop的主要目標是對分散式環境下的“大資料”以一種可靠、高效、可伸縮的方式處理。設想一個場景,假如您需要grep一個100TB的大資料檔案,按照傳統的方式,會花費很長時間,而這正是Hadoop所需要考慮的效率問題。大資料學習群119599574

關於Hadoop的結構,有各種不同的說法。我們這裡簡單的理解為Hadoop主要由三部分組成:HDFS(Hadoop Distributed File System),MapReduce與Hbase。

1.Hadoop元件之一:HDFS分散式檔案系統具有哪些優點?

HDFS作為一種分散式檔案系統,它和現有的分散式檔案系統有很多共同點。比如,Hadoop檔案系統管理的物理儲存資源不一定直接連線在本地節點上,而是通過計算機網路與節點相連。對於Client端而言,HDFS就像一個傳統的分級檔案系統,可以建立、刪除、移動或重新命名檔案等等。與此同時,HDFS與其他的分散式檔案系統的區別也是顯而易見的。

首先,HDFS設計目標之一是適合執行在通用硬體(commodity hardware)上的分散式檔案系統。HDFS假設的硬體錯誤不是異常,而是常態。因為HDFS面向的是成百上千的伺服器叢集,每臺伺服器上儲存著檔案系統的部分資料,並且這些機器的價格都很低廉。這就意味著總是有一部分硬體因各種原因而無法工作。因此,錯誤檢測和快速、自動的恢復是HDFS最核心的架構目標。從這個角度說,HDFS具有高度的容錯性。

第二,HDFS的另一個設計目標是支援大檔案儲存。與普通的應用不同,HDFS應用具有很大的資料集,一個典型HDFS檔案大小一般都在G位元組至T位元組。這就意味著HDFS應該能提供比較高的資料傳輸頻寬與資料訪問吞吐量。相應的,HDFS開放了一些POSIX的必須介面,容許流式訪問檔案系統的資料。

第三,HDFS還要解決的一個問題是高資料吞吐量。HDFS採用的是“一次性寫,多次讀”這種簡單的資料一致性模型。換句話說,檔案一旦建立後寫入,就不需要再更改了。網路爬蟲程式就很適合使用這樣的模型。

第四,移動計算環境比移動資料划算。HDFS提供了API,以便把計算環境移動到資料儲存的地方,而不是把資料傳輸到計算環境執行的地方。這對於資料大檔案尤其適用,可以有效減少網路的擁塞、提高系統的吞吐量。

HDFS的體系結構與工作流程

下面簡單看一下HDFS的結構。圖1所示為HDFS的體系結構圖。HDFS採用的是Master/Slave架構。

NameNode節點作為Master伺服器,有三部分功能。第一:處理來自客戶端的檔案訪問。第二:管理檔案系統的名稱空間操作,如'開啟'、'關閉'、'重新命名'等。第三:負責資料塊到資料節點之間的對映。從這個意義上說,它扮演中心伺服器的角色。

DataNode節點作為Slave伺服器,同樣有三部分功能。第一:管理掛載在節點上的儲存裝置。第二:響應客戶端的讀寫請求。第三:從內部看,每個檔案被分成一個或多個資料塊,被存放到一組DataNode,在Namenode的統一排程下進行資料塊的建立、刪除和複製。

HDFS採用Java語言開發,因此任何支援Java的機器都可以部署Namenode或Datanode。相應地,GNU/Linux作業系統支援Namenode與Datanode。一個典型的部署場景是,一臺GNU/Linux作業系統上執行一個Namenode例項,作為Master中心伺服器。而叢集中的其它GNU/Linux作業系統分別執行一個Datanode例項,作為Slave伺服器叢集。

2.Hadoop元件之二:什麼是MapReduce程式設計模型, MapReduce的工作流程是什麼?

MapReduce是一種程式設計模型,用於大規模資料集(大於1TB)的並行運算。MapReduce的設計目標是方便程式設計人員在不熟悉分散式並行程式設計的情況下,將自己的程式執行在分散式系統上。

MapReduce的命名規則由兩個術語組成,分別是Map(對映)與Reduce(化簡)。這些術語來自於列表處理語言,如:LISP,Scheme,或ML。從概念上來講,MapReduce將輸入元素列表(Input List)轉換成輸出元素列表(Output List),按照Map與Reduce規則各一次。

從MapReduce框架的實現角度看,MapReduce程式有著兩個元件:一個實現了 Mapper,另一個實現了Reducer。

第一次叫Mapping,如圖2所示。MapReduce將Input List作為Mapping函式的輸入引數,經過處理,把結果返回給Output List。舉例來說,有一個函式toUpper(str),用來返回輸入字串的大寫版本。那麼這裡的Input List指的是轉換前的常規字串列表,Mapping Function指的是toUpper函式,而Output List指的是轉換後的大寫字串列表。值得注意的是,在這裡Mapping並沒有改變輸入字串列表,而是返回一個新的字串列表。

第二次叫Reducing,如圖3所示。MapReduce將Input List作為Reducing函式的輸入引數,經過迭代處理,把這些資料彙集,返回一個輸出值給Output Value。從這個意義上來說,Reducing一般用來生成”總結“資料,把大規模的資料轉變成更小的總結資料。例如,+可以用來作一個reducing函式,去返回輸入資料列表的值的總和。

從工作流程來講,MapReduce對應的作業Job首先把輸入的資料集切分為若干獨立的資料塊,並由Map元件以Task的方式並行處理。處理結果經過排序後,依次輸入給Reduce元件,並且以Task的形式並行處理。MapReduce對應的輸入輸出資料由HDFS的DataNode儲存。MapReduce對應的Job部署在Master伺服器,由Master JobTracker負責Task的排程,監控,重新執行失敗的任務等等。MapReduce對應的Job部署在若干不同的Slave伺服器,每個叢集節點含一個slave TaskTracker,負責執行由master指派的任務。

Hadoop框架由Java實現的,它提供了兩種主要工具。Hadoop Streaming是一種執行作業的實用工具,它允許使用者建立和執行任何可執行程式(例如:Shell工具)來做為mapper和reducer。Hadoop Pipes是一個與SWIG相容的C++ API (沒有基於JNITM技術),它也可用於實現Map/Reduce應用程式。這樣,開發人員就可以利用MapReduce框架,開發分散式應用程式,執行在由上千個商用機器組成的大型叢集上,並以一種可靠容錯的方式並行處理上T級別的資料集。

3.Hadoop元件之三:什麼是面向列開源分散式資料庫Hbase?

HBase是一個分散式的、面向列的開源資料庫,由Apache基金會開發。HBase不同於一般的關聯式資料庫,它是一個適合於非結構化資料儲存的資料庫。它基於列的而不是基於行的模式。使用者儲存資料行在一個表裡。一個資料行擁有一個可選擇的鍵和任意數量的列。使用者可根據鍵訪問行,以及對於一系列的行進行掃描和過濾。HBase一個可以橫向擴張的表儲存系統,能夠為大規模資料提供速度極快的低等級更新。主要用於需要隨機訪問,實時讀寫大資料(Big Data)。這正是資訊系統所需要的功能。

下面的例子演示的是將原來存放在MySQL中Blog中的資料遷移到HBase中的過程:

圖4為MySQL中現有的表結構:表Blogtable表示部落格本身,包括5個欄位,BlogId為每位使用者對應的部落格ID號,型別為Int,作為主鍵欄位;Author為該使用者的部落格名稱,型別為Varchar;Title為該使用者的部落格簽名,型別為Varchar;URL為部落格網址連結,型別為Varchar;Text為部落格的內容,型別為Varchar。Comment表示部落格評論,包括5個欄位。ID為發表評論的使用者ID,型別為Int,作為主鍵欄位;BlogId為部落格的原文ID,型別為Varchar。其中,BlogId作為Comment表的外來鍵,指向表Blogtable的主鍵。Title為評論標題,型別為Varchar;Author為發表該評論的使用者名稱稱,型別為Varchar;Text欄位為評論內容,型別為Varchar。

遷移HBase中的表結構:HBase以表的形式儲存資料。表有行和列組成。列劃分為若干個列族(row family)。表Blogtable表示部落格本身。ID為Row Key,即Table的主鍵,用來檢索記錄。Table在水平方向有一個或者多個Column Family組成。表BlogTable包含5個Column Family, Info的資料結構分為Info:Author,Info:Title,Info:URL。如果想新增其它屬性X,則對應的結構為Info:X。需要說明的是,Column Family支援動態擴充套件,無需預先定義Column的數量以及型別,但是,所有Column均以二進位制格式儲存,使用者需要自行進行型別轉換。

總之,Hbase目標主要依靠橫向擴充套件,通過不斷增加廉價的商用伺服器,來增加計算和儲存能力。簡單的理解,Hbase介於nosql和RDBMS之間。Hbase僅能通過主鍵(row key)和主鍵的range來檢索資料,不支援條件查詢以及排序等,僅支援單行事務。Habase主要用來儲存非結構化和半結構化的鬆散資料。針對Hbase的不足,Hadoop的一個資料倉儲工具Hive對此做出了彌補。Hive可以將結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,並將SQL語句轉換為MapReduce任務執行。針對Hbase單行事務的限制,Hive也提供了擴充套件。據說,Facebook之所以選擇了Hbase,是因為他們HBase適用於處理以下兩種型別的資料模式:1.一小組經常變化的臨時資料;2.一組不斷增加但很少訪問的資料。

Hadoop為企業來帶了什麼?

如今,“大資料”這一術語在IT經理人中變得越來越流行。美國國家海洋與大氣管理局NOAA利用“大資料”進行氣象、生態系統、天氣和商務研究。《紐約時報》使用“大資料”工具進行文字分析和Web資訊挖掘。迪斯尼則利用它們關聯和了解跨不同商店、主題公園和Web資產的客戶行為。

“大資料”不僅適用於大型企業,而是適用於各種不同規模的企業。例如,通過評估某位客戶在網站上的行為,來更好地瞭解他們需要什麼支援或尋找什麼產品,或者弄清當前天氣和其他條件對於送貨路線和時間安排的影響。

面對“大資料”,Hadoop為揭示深奧的企業與外部資料的關鍵內幕提供了基礎。從技術上看,Hadoop分散式檔案系統(HDFS)保證了大資料的可靠儲存,而另一Hadoop核心元件MapReduce則提供高效能並行資料處理服務。這兩項服務提供了一個使對結構化和複雜“大資料”的快速、可靠分析變為現實的基礎。

Hadoop已經迅速成長為首選的、適用於非結構化資料的大資料分析解決方案。基於Hadoop、利用商品化硬體對海量的結構化和非結構化資料進行批處理,給資料分析領域帶來了深刻的變化。通過挖掘機器產生的非結構化資料中蘊藏的知識,企業可以做出更好的決策,促進收入增長,改善服務,降低成本。

Google與Hadoop有著千絲萬縷的聯絡。如前所述,Hadoop主要是由HDFS、MapReduce和Hbase組成。而HDFS是Google File System(GFS)的開源實現,MapReduce是Google MapReduce的開源實現,HBase是Google BigTable的開源實現。Hadoop分散式框架很有創造性,而且有極大的擴充套件性,使得Google在系統吞吐量上有很大的競爭力。因此Apache基金會用Java實現了一個開源版本,支援Fedora、Ubuntu等Linux平臺。

考慮到Hadoop在應對大規模非結構型資料中所起到的重要作用,微軟也不得不放下架子,近日宣佈開發一個相容Windows Server與Windows Azure平臺的Hadoop開源版本。

IBM宣佈在Hadoop上建立新的儲存架構,作為群集執行DB2或Oracle資料庫,目的是讓應用程式,支援高效能分析,資料倉儲應用程式和雲端計算的目的。

EMC也推出了世界上第一個定製的、高效能的Hadoop專用資料協同處理裝置——Greenplum HD資料計算裝置,為客戶提供了最強大、最高效率的方法,充分挖掘大資料的價值。

網際網路搜尋巨頭百度也在考慮使用Hadoop。不過,出於效能與安全的考慮,百度在採用Hadoop架構的時候,將Hadoop計算層進行了重新編寫。

Hadoop作為一種分散式基礎架構,可以使使用者在不瞭解分散式底層細節的情況下,開發分散式程式。大資料學習群119599574

相關文章