Hadoop初探

hadoop是什麼?
(1)Hadoop是一個開源的框架,可編寫和運行分佈式應用處理大規模數據,是專爲離線和大規模數據分析而設計的,並不適合那種對幾個記錄隨機讀寫的在線事務處理模式。Hadoop=HDFS(文件系統,數據存儲技術相關)+ Mapreduce(數據處理),Hadoop的數據來源可以是任何形式,在處理半結構化和非結構化數據上與關係型數據庫相比有更好的性能,具有更靈活的處理能力,不管任何數據形式最終會轉化爲key/value,key/value是基本數據單元。用函數式變成Mapreduce代替SQL,SQL是查詢語句,而Mapreduce則是使用腳本和代碼,而對於適用於關係型數據庫,習慣SQL的Hadoop有開源工具hive代替。

(2)Hadoop就是一個分佈式計算的解決方案

hadoop能做什麼?

 hadoop擅長日誌分析,facebook就用Hive來進行日誌分析,2009年時facebook就有非編程人員的30%的人使用HiveQL進行數據分析;淘寶搜索中    的 自定義篩選也使用的Hive;利用Pig還可以做高級的數據處理,包括Twitter、LinkedIn 上用於發現您可能認識的人,可以實現類似Amazon.com的協同過濾的推薦效果。淘寶的商品推薦也是!在Yahoo!的40%的Hadoop作業是用pig運行的,包括垃圾郵件的識別和過濾,還有用戶特徵建模。(2012年8月25新更新,天貓的推薦系統是hive,少量嘗試mahout!)

     下面舉例說明:

      設想一下這樣的應用場景. 我有一個100M 的數據庫備份的sql 文件.我現在想在不導入到數據庫的情況下直接用grep操作通過正則過濾出我想要的內容。例如:某個表中 含有相同關鍵字的記錄那麼有幾種方式,一種是直接用linux的命令 grep 還有一種就是通過編程來讀取文件,然後對每行數據進行正則匹配得到結果好了 現在是100M 的數據庫備份.上述兩種方法都可以輕鬆應對.
那麼如果是1G , 1T 甚至 1PB 的數據呢 ,上面2種方法還能行得通嗎? 答案是不能.畢竟單臺服務器的性能總有其上限.那麼對於這種 超大數據文件怎麼得到我們想要的結果呢?
有種方法 就是分佈式計算, 分佈式計算的核心就在於 利用分佈式算法 把運行在單臺機器上的程序擴展到多臺機器上並行運行.從而使數據處理能力成倍增加.但是這種分佈式計算一般對編程人員要求很高,而且對服務器也有要求.導致了成本變得非常高.
Haddop 就是爲了解決這個問題誕生的.Haddop 可以很輕易的把 很多linux的廉價pc 組成 分佈式結點,然後編程人員也不需要知道分佈式算法之類,只需要根據mapreduce的規則定義好接口方法,剩下的就交給Haddop. 它會自動把相關的計算分佈到各個結點上去,然後得出結果.
例如上述的例子 : Hadoop 要做的事 首先把 1PB的數據文件導入到 HDFS中, 然後編程人員定義好 map和reduce, 也就是把文件的行定義爲key,每行的內容定義爲value , 然後進行正則匹配,匹配成功則把結果 通過reduce聚合起來返回.Hadoop 就會把這個程序分佈到N 個結點去並行的操作.
那麼原本可能需要計算好幾天,在有了足夠多的結點之後就可以把時間縮小到幾小時之內.

MapReduce與Hadoop之比較
Hadoop是Apache軟件基金會發起的一個項目,在大數據分析以及非結構化數據蔓延的背景下,Hadoop受到了前所未有的關注。
Hadoop是一種分佈式數據和計算的框架。它很擅長存儲大量的半結構化的數據集。數據可以隨機存放,所以一個磁盤的失敗並不會帶來數據丟失。Hadoop也非常擅長分佈式計算——快速地跨多臺機器處理大型數據集合。
MapReduce是處理大量半結構化數據集合的編程模型。編程模型是一種處理並結構化特定問題的方式。例如,在一個關係數據庫中,使用一種集合語言執行查詢,如SQL。告訴語言想要的結果,並將它提交給系統來計算出如何產生計算。還可以用更傳統的語言(C++,Java),一步步地來解決問題。這是兩種不同的編程模型,MapReduce就是另外一種。
MapReduce和Hadoop是相互獨立的,實際上又能相互配合工作得很好。
Hadoop 的最常見用法之一是 Web 搜索。雖然它不是唯一的軟件框架應用程序,但作爲一個並行數據處理引擎,它的表現非常突出。Hadoop 最有趣的方面之一是 Map and Reduce 流程,它受到google開發的啓發。這個流程稱爲創建索引,它將 Web爬行器檢索到的文本 Web 頁面作爲輸入,並且將這些頁面上的單詞的頻率報告作爲結果。然後可以在整個 Web 搜索過程中使用這個結果從已定義的搜索參數中識別內容。
MapReduce
最簡單的 MapReduce應用程序至少包含 3 個部分:一個 Map函數、一個 Reduce 函數和一個 main 函數。main 函數將作業控制和文件輸入/輸出結合起來。在這點上,Hadoop 提供了大量的接口和抽象類,從而爲 Hadoop應用程序開發人員提供許多工具,可用於調試和性能度量等。
MapReduce 本身就是用於並行處理大數據集的軟件框架。MapReduce 的根源是函數性編程中的 map 和 reduce 函數。它由兩個可能包含有許多實例(許多 Map 和 Reduce)的操作組成。Map 函數接受一組數據並將其轉換爲一個鍵/值對列表,輸入域中的每個元素對應一個鍵/值對。Reduce 函數接受 Map 函數生成的列表,然後根據它們的鍵(爲每個鍵生成一個鍵/值對)縮小鍵/值對列表。
這裏提供一個示例,幫助您理解它。假設輸入域是 one small step for man,one giant leap for mankind。在這個域上運行 Map 函數將得出以下的鍵/值對列表:
(one,1) (small,1) (step,1) (for,1) (man,1)(one,1) (giant,1) (leap,1) (for,1) (mankind,1)
如果對這個鍵/值對列表應用 Reduce 函數,將得到以下一組鍵/值對:
(one,2) (small,1) (step,1) (for,2) (man,1)(giant,1) (leap,1) (mankind,1)
結果是對輸入域中的單詞進行計數,這無疑對處理索引十分有用。但是,假設有兩個輸入域,第一個是 one small step for man,第二個是 one giant leap for mankind。您可以在每個域上執行 Map 函數和 Reduce 函數,然後將這兩個鍵/值對列表應用到另一個 Reduce 函數,這時得到與前面一樣的結果。換句話說,可以在輸入域並行使用相同的操作,得到的結果是一樣的,但速度更快。這便是 MapReduce 的威力;它的並行功能可在任意數量的系統上使用。圖 2 以區段和迭代的形式演示這種思想。
回到 Hadoop 上,它是如何實現這個功能的?一個代表客戶機在單個主系統上啓動的 MapReduce應用程序稱爲 JobTracker。類似於 NameNode,它是 Hadoop 集羣中惟一負責控制 MapReduce應用程序的系統。在應用程序提交之後,將提供包含在 HDFS 中的輸入和輸出目錄。JobTracker 使用文件塊信息(物理量和位置)確定如何創建其他 TaskTracker 從屬任務。MapReduce應用程序被複制到每個出現輸入文件塊的節點。將爲特定節點上的每個文件塊創建一個惟一的從屬任務。每個 TaskTracker 將狀態和完成信息報告給 JobTracker。圖 3 顯示一個示例集羣中的工作分佈。
Hadoop 的這個特點非常重要,因爲它並沒有將存儲移動到某個位置以供處理,而是將處理移動到存儲。這通過根據集羣中的節點數調節處理,因此支持高效的數據處理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章