1. 程式人生 > >大資料學習(一) | 初識 Hadoop

大資料學習(一) | 初識 Hadoop

作者: seriouszyx
首發地址:https://seriouszyx.top/
程式碼均可在 Github 上找到(求Star)

最近想要了解一些前沿技術,不能一門心思眼中只有 web,因為我目前對 Java 語言及其生態相對熟悉,所以在網上搜集了 Hadoop 相關文章,並做了整合。

本篇文章在於對大資料以及 Hadoop 有一個直觀的概念,並上手簡單體驗。

Hadoop 基礎概念

Hadoop 是一個用 Java 實現的開源框架,是一個分散式的解決方案,將大量的資訊處理所帶來的壓力分攤到其他伺服器上。

在瞭解各個名詞之前,我們必須掌握一組概念。

結構化資料 vs 非結構化資料

結構化資料即行資料,儲存在資料庫裡,可以用二維表結構來表達,例如:名字、電話、家庭住址等。

常見的結構化資料庫為 mysql、sqlserver。

zhhihu1.jpg

非結構化資料庫是指其欄位長度可變,並且每個欄位的記錄又可以由可重複或不可重複的子欄位構成的資料庫。無法用結構化的資料模型表示,例如:文件、圖片、聲音、視訊等。在大資料時代,對非關係型資料庫的需求日益增加,資料庫技術相應地進入了“後關係資料庫時代”。

非結構化資料庫代表為 HBase、mongodb。

v2-27e5113596ab21aae1d64516ef015100_1200x500.jpg

可以大致歸納,結構化資料是先有結構、再有資料;非結構化資料是先有資料、再有結構。

Hadoop 是大資料儲存和計算的開山鼻祖,現在大多數開源大資料框架都依賴 Hadoop 或者與它能很好地相容,下面開始講述 Hadoop 的相關概念。

Hadoop 1.0 vs Hadoop 2.0

Hadoop-1-vs-Hadoop-2-Architecture.png

HDFS 和 MapReduce

Hadoop 為解決儲存分析大量資料而生,所以這兩部分也是 Hadoop 的狹義說法(廣義指 Hadoop 生態)。HDFS 提供了一種安全可靠的分散式檔案儲存系統,MapReduce 提供了基於批處理模式的資料分析框架。

HDFS(Hadoop Distributed File System)的設計本質上是為了大量的資料能橫跨很多臺機器,但是你看到的是一個檔案系統而不是很多個檔案系統。就好比訪問 /hdfs/tmp/file1 的資料,引用的是一個檔案路徑,但是實際資料可能分佈在很多機器上,當然 HDFS 為你管理這些資料,使用者並不需要了解它如何管理。

關於 MapReduce,這裡通過一個具體模型來解釋。

考慮如果你要統計一個巨大的文字檔案儲存在類似 HDFS 上,你想要知道這個文本里各個詞的出現頻率。你啟動了一個 MapReduce 程式。Map 階段,幾百臺機器同時讀取這個檔案的各個部分,分別把各自讀到的部分分別統計出詞頻,產生類似(hello, 12100次),(world,15214次)等等這樣的 Pair(我這裡把 Map 和 Combine 放在一起說以便簡化);這幾百臺機器各自都產生了如上的集合,然後又有幾百臺機器啟動 Reduce 處理。Reducer 機器 A 將從 Mapper 機器收到所有以 A 開頭的統計結果,機器 B 將收到 B 開頭的詞彙統計結果(當然實際上不會真的以字母開頭做依據,而是用函式產生 Hash 值以避免資料串化。因為類似 X 開頭的詞肯定比其他要少得多,而你不希望資料處理各個機器的工作量相差懸殊)。然後這些Reducer將再次彙總,(hello,12100)+(hello,12311)+(hello,345881)= (hello,370292)。每個 Reducer 都如上處理,你就得到了整個檔案的詞頻結果。

這就是一個簡單的 WordCount 的例子,Map+Reduce 這種簡單模型暴力好用,不過很笨重,關於更高效的解決方法,以後再詳細描述。

Hadoop 構建模組

下面從底層實現的角度解釋 HDFS 和 MapReduce 的一些概念。

NameNode 是 Hadoop 守護程序中最重要的一個。NameNode 位於 HDFS 的主端,指導 DataNode 執行底層的 IO 任務。NameNode 的執行消耗大量記憶體和 IO 資源,所以 NameNode 伺服器不會同時是 DataNode 或 TaskTracker。

NameNode 和 DataNode 為主/從結構(Master/Slave)。每一個叢集上的從節點都會駐留一個 DataNode 守護程序,來執行分散式檔案系統的繁重工作,將 HDFS 資料塊讀取或者寫入到本地檔案系統的實際檔案中。當希望對 HDFS 檔案進行讀寫時,檔案被分割為多個塊,由NameNode 告知客戶端每個資料塊駐留在那個 DataNode。客戶端直接與 DataNode 守護程序通訊,來處理與資料塊相對應的本地檔案。

SNN(Scondary NameNode)是監測 HDFS 叢集狀態的輔助守護程序。SNN 快照有助於加少停機的時間並降低資料丟失的風險。

JobTracker 守護程序是應用程式和 Hadoop 之間的紐帶。一旦提交程式碼到叢集上,JobTracker 就會確定執行計劃,包括決定處理哪些檔案,為不同的任務分配節點以及監控所有任務的執行。如果任務失敗,JobTracker 將自動重啟任務,但所分配的節點可能會不同,同時受到預定義的重試次數限制。每一個Hadoop叢集只有一個JobTracker守護程序,它通常執行在伺服器叢集的主節點上。

JobTracker 和 TaskTracker 也是主/從結構。JobTracker 作為主節點,監測 MapReduce 作業的整個執行過程,同時,TaskTracker 管理各個任務在每個從節點上的執行情況。TaskTracker 的一個職責就是負責持續不斷地與 JobTracker 通訊。如果 JobTracker 在指定的時間內沒有收到來自 TaskTracker 的心跳,它會假定 TaskTracker 已經崩潰了,進而重新提交相應的任務到叢集的其他節點中。

嘗試使用 Hadoop

Hadoop 安裝可以直接看官方文件,或是 Google 一些不錯的教程,比如 Hadoop 的安裝Mac 系統安裝Hadoop 2.7.3

按照操作配置 Hadoop 併成功執行,訪問localhost:50070localhost:8088 分別顯示一下頁面。

90496E3D-A8FB-41CE-9FF0-3B962184AFAE.png

1CBC323A-55DC-40AC-B258-3725DD0D4350.png

執行偽分散式樣例:

31D3E6A6-5864-4C6E-865E-AE576A64E647.png

HDFS 目錄/檔案操作命令

HDFS 是一種檔案系統,它可以將一個很大的資料集儲存為一個檔案,而大多數其他檔案系統無力於這一點。Hadoop 也為它提供了一種與 Linux 命令類似的命令列工具,我們可以進行一些簡單的操作。

Hadoop 的檔案命令採取的形式為

hadoop fs -cmd <args>

其中 cmd 為具體的檔案命令,通常與 UNIX 對應的命令名相同,比如:

hadoop fs -ls
hadoop fs -mkdir /user/seriouszyx
hadoop fs -lsr /
hadoop fs -rm example.txt

還有一些本地檔案系統和 HDFS 互動的命令,也經常使用到。

hadoop fs -put example.txt /user/seriouszyx
hadoop fs -get example.txt

Hadoop 構建模組的原理

MapReduce 如何分而治之

MapReduce 是用來處理大規模資料的一個並行程式設計框架,採用了對資料“分而治之”的方法。

40658-2de7c5066daf7ab1.png

MapReduce 是一個離線計算框架,它將計算分為兩個階段,Map(並行處理輸入資料)和 Reduce(對 Map 結果彙總)。其中 Map 和 Reduce 函式提供了兩個高層介面,由使用者去程式設計實現。

Map 的一般處理邏輯為:(k1;v1) ---->map 處理---->[(k2;v2)]

Reduce 函式的一般處理邏輯是:(k2;[v2])---->reduce 處理---->[(k3;v3)]

可以看出 map 處理的輸出與 reduce 的輸入並不完全相同,這是因為輸入引數在進入 reduce 前,一般會將相同鍵 k2 下的所有值 v2 合併到一個集合中處理:[(k2;v2)]--->(k2;[v2]),這個過程叫 Combiner。

在經過 Map 和 Reduce 的抽象後,並行結構模型就變成了下面這樣:

40658-df82b7a1775fac75.png

上圖中可以發現,中間有一個同步障(Barrier),其作用是等所有的 map 節點處理完後才進入 reduce,並且這個階段同時進行資料加工整理過程(Aggregation & Shuffle),以便 reduce 節點可以完全基於本節點上的資料計算最終結果。

不過這仍然不是完整的 MapReduce 模型,在上述框架圖中,還少了兩個步驟 Combiner 和 Partitioner。

40658-39cc7b851195657c.png

上述圖以詞頻統計(WordCount)為例。

Combiner 用來對中間結果資料網路傳輸進行優化,比如 map 處理完輸出很多鍵值對後,某些鍵值對的鍵是相同的,Combiner 就會將相同的鍵合併,比如有兩個鍵值對的鍵相同(good,1)和(good,2),便可以合成(good,3)。

這樣,可以減少需要傳輸的中間結果資料量,打倒網路資料傳輸優化,因為 map 傳給 reduce 是通過網路來傳的。

Partitioner 負責對中間結果進行分割槽處理。比如詞頻統計,將所有主鍵相同的鍵值對傳輸給同一個 Reduce 節點,以便 Reduce 節點不需要訪問其他 Reduce 節點的情況下,一次性對分過來的中間結果進行處理。

副本機制

我們再說回 HDFS 誕生的原因,hdfs 由 Google 最先研發,其需求是單獨一臺計算機所能儲存的空間是有限的,而隨著計算機儲存空間的加大,其價格是呈幾何倍的增長。而 hdfs 架構在相對廉價的計算機上,以分散式的方式,這樣想要擴大空間之遙增加叢集的數量就可以了。

大量相對廉價的計算機,那麼說明宕機就是一種必然事件,我們需要讓資料避免丟失,就只用採取冗餘資料儲存,而具體的實現的就是副本機制

hdfs 主要使用三副本機制

  • 第一副本:如果上傳節點是 DN,則上傳該節點;如果上傳節點是 NN,則隨機選擇 DN
  • 第二副本:放置在不同機架的 DN 上
  • 第三副本:放置在與第二副本相同機架的不同 DN 上

除了極大程度地避免宕機所造成的資料損失,副本機制還可以在資料讀取時進行資料校驗。

NameNode 在做些什麼

在 Hadoop 1.0 時代,Hadoop 兩大核心元件 HDFS NameNode 和 JobTracker 都存在著單點問題,其中以 NameNode 最為嚴重。因為 NameNode 儲存了整個 HDFS 的元資料資訊,一旦 NameNode 掛掉,整個 HDFS 就無法訪問,同時 Hadoop 生態系統中依賴於 HDFS 的各個元件,包括 MapReduce、Hive、Pig 以及 HBase 等也都無法正常工作,並且重新啟動 NameNode 和進行資料恢復的過程也會比較耗時。

這些問題在給 Hadoop 的使用者帶來困擾的同時,也極大地限制了 Hadoop 的使用場景,使得 Hadoop 在很長的時間內僅能用作離線儲存和離線計算,無法應用到對可用性和資料一致性要求很高的線上應用場景中。

所幸的是,在 Hadoop2.0 中,HDFS NameNode 和 YARN ResourceManger(JobTracker 在 2.0 中已經被整合到 YARN ResourceManger 之中) 的單點問題都得到了解決,經過多個版本的迭代和發展,目前已經能用於生產環境。

從上圖中我們可以看到,有兩臺 NameNode——Active NameNode 和 Standby NameNode,一臺處於 Active 狀態,為主 NameNode,另外一臺處於 Standby 狀態,為備 NameNode,只有主 NameNode 才能對外提供讀寫服務。

Yarn

Yarn 是 Hadoop 叢集的新一代資源管理系統。Hadoop 2.0 對 MapReduce 框架做了徹底的設計重構,我們稱 Hadoop 2.0 中的 MapReduce 為 MRv2 或者 Yarn。

20151029092726524 (2).jpg

在 Hadoop 2.x 中,Yarn 把 job 的概念換成了 application,因為執行的應用不只是 MapReduce 了,還可能是其他應用,如一個 DAG(有向無環圖 Directed Acyclic Graph,例如 Storm 應用)。

Yarn 另一個目標是擴充套件 Hadoop,使得它不僅僅可以支援 MapReduce 計算,還能很方便地管理諸如 Hive、Pig、Hbase、Spark/Shark 等應用。

這種新的架構設計能夠使得各種型別的應用執行在 Hadoop 上面,並通過 Yarn 從系統層面進行統一的管理,也就是說,有了 Yarn,各種應用就可以互不干擾的執行在同一個 Hadoop 系統中,共享整個叢集資源。

ResourceManager 在做些什麼

剛剛提到的 Yarn 也採用了 Master/Slave 結構,其中 Master 為 ResourceManager,負責整個叢集的資源管理與排程;Slave 實現為 NodeManager,負責單個節點的組員管理與任務啟動。

ResourceManager 是整個 Yarn 叢集中最重要的元件之一,它的功能較多,包括 ApplicationMaster 管理(啟動、停止等)、NodeManager 管理、Application 管理、狀態機管理等。

ResourceManager 主要完成以下幾個功能:

  • 與客戶端互動,處理來自客戶端的請求
  • 啟動和管理 ApplicationMaster,並在它失敗時重新啟動它
  • 管理 NodeManager,接受來自 NodeManager 的資源管理彙報資訊,並向 NodeManager 下達管理命令或把資訊按照一定的策略分配給各個應用程式(ApplicationManager)等
  • 資源管理與排程,接受來自 ApplicationMaster 的資源申請請求,併為之分配資源(核心)

在 Master/Slave 架構中,ResourceManager 同樣存在單點故障(高可用問題,High Availability)問題。為了解決它,通常採用熱備方案,即叢集中存在一個對外服務的 Active Master 和若干個處於就緒狀態的 Standy Master,一旦 Active Master 出現故
障,立即採用一定的側率選取某個 Standy Master 轉換為 Active Master 以正常對外提供服務。

總結

本文介紹了 Hadoop 的相關概念,包括量大核心部件 HDFS 和 MapReduce,並對其進行了進一步剖析,Hadoop 2.0 的 Yarn 的簡單介紹,以及一些問題的解決方法(如 HA)。

也通過配置第一次在本機上配置了 Hadoop 的執行環境,運行了偽分散式樣例。

接下來會結合一個具體問題深入理解 Hadoop 的方方面面。


References:
大資料學習筆記
一文讀懂大資料平臺——寫給大資料開發初學者的話!
Hadoop HDFS和MapReduce
HDFS檔案操作
hadoop筆記4--MapReduce框架
Hadoop Yarn詳解
Hadoop NameNode 高可用 (High Availability) 實現解析
Hadoop -YARN ResourceManager 剖析