Hadoop與Google同樣,都是小孩命名的,是一個虛構的名字,沒有特別的含義。從計算機專業的角度看,Hadoop是一個分佈式系統基礎架構,由Apache基金會開發。Hadoop的主要目標是對分佈式環境下的「大數據」以一種可靠... |
Hadoop與Google同樣,都是小孩命名的,是一個虛構的名字,沒有特別的含義。從計算機專業的角度看,Hadoop是一個分佈式系統基礎架 構,由Apache基金會開發。Hadoop的主要目標是對分佈式環境下的「大數據」以一種可靠、高效、可伸縮的方式處理。設想一個場景,假如您須要 grep一個100TB的大數據文件,按照傳統的方式,會花費很長時間,而這正是Hadoop所須要考慮的效率問題。 php
關於Hadoop的結構,有各類不一樣的說法。咱們這裏簡單的理解爲Hadoop主要由三部分組成:HDFS(Hadoop Distributed File System),MapReduce與Hbase。 html
1.Hadoop組件之一:HDFS分佈式文件系統具備哪些優勢? node
HDFS做爲一種分佈式文件系統,它和現有的分佈式文件系統有不少共同點。好比,Hadoop文件系統管理的物理存儲資源不必定直接鏈接在本地 節點上,而是經過計算機網絡與節點相連。對於Client端而言,HDFS就像一個傳統的分級文件系統,能夠建立、刪除、移動或重命名文件等等。與此同 時,HDFS與其餘的分佈式文件系統的區別也是顯而易見的。 sql
首先,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的統一調度下進行數據塊的建立、刪除和複製。
圖1 HDFS體系結構圖
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並無改變輸入字符串列表,而是返回一個新的字符串列表。
圖2 Map函數處理
第二次叫Reducing,如圖3所示。MapReduce將Input List做爲Reducing函數的輸入參數,通過迭代處理,把這些數據聚集,返回一個輸出值給Output Value。從這個意義上來講,Reducing通常用來生成」總結「數據,把大規模的數據轉變成更小的總結數據。例如,"+"能夠用來做一個 reducing函數,去返回輸入數據列表的值的總和。
圖3 Reduce函數處理
從工做流程來說,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。
圖4 MySQL表結構
圖5 爲遷移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均以二進制格式存儲,用戶須要自行進行類型轉換。
圖5 HBase表結構
總之,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做爲一種分佈式基礎架構,可使用戶在不瞭解分佈式底層細節的狀況下,開發分佈式程序。
關於Hadoop的價值,思科的James Urquhart指出:「Hadoop能夠說是不涉及任何現有專利的開源項目在企業軟件方面所取得的首個里程碑式成功。」在業界,Hadoop也贏得「龐 大數據問題的通用解決方案」的頭銜。咱們不得不說,Hadoop前途不可估量。