第一章:Hadoop生態系統及執行MapReduce任務介紹!

趙鈺瑩發表於2018-09-04

我們生活在大資料時代,企業日常需要處理的資料量超出了單個主機的儲存和處理能力。大資料帶來了兩大基本挑戰:儲存和處理大量資料以及理解資料並將其轉化為競爭優勢。

透過高效儲存和計算能力,Hadoop的出現填補了市場空白。Hadoop是一個由分散式檔案系統組成的分散式系統,提供了在一組機器上並行化執行程式的方法(見圖1.1)。目前,Hadoop已經成為大資料領域的事實標準,因為它已經被Yahoo、Facebook、Twitter、阿里巴巴、百度等大型企業採用,並且正在進軍所有領域。

 

圖1.1

本文作為《Hadoop從入門到精通》大型專題的第一章,主要介紹Hadoop基礎概念、安裝及執行MapReduce任務等方面的知識。本章適用於具備簡單Hadoop實踐經驗,瞭解MapReduce和HDFS等元件的基本概念,並具備中級Java知識儲備的工程師。

1.1  Hadoop是什麼?

Hadoop是一個分散式儲存和計算平臺,其誕生之初是為了解決Nutch中存在的伸縮性問題。Nutch是一個開源Java實現的爬蟲和搜尋引擎,谷歌曾發表論文描述了其新穎的分散式檔案系統——谷歌檔案系統(GFS)和並行處理計算框架MapReduce,宣稱可以解決Nutch的問題。在Nutch成功實現這些概念之後,它被分成了兩個獨立的專案,其中一個就是Hadoop,目前已經成為Apache頂尖專案。Nutch專案,以及Hadoop,均由Doug Cutting和Mike Cafarella主導。

本節將從架構角度介紹Hadoop,研究行業如何使用以及Hadoop的優劣。

 

圖1.2 Hadoop分散式主從架構

如上圖所示,Hadoop由以下部分組成:

  • 一個通訊模型,其中一個程式(稱為主程式)控制一個或多個其他程式,稱為從程式。

  • 用於儲存資料的Hadoop分散式檔案系統(HDFS)。

  • 在Hadoop 2中引入了資源排程器(YARN),它是通用排程程式和資源管理器,任何YARN應用程式都可在Hadoop叢集上執行。

  • MapReduce,基於批處理的計算引擎。在Hadoop 中,MapReduce是作為YARN應用程式實現的。

Hadoop的固有特徵是大資料集的資料分割槽和平行計算,其儲存和計算能力隨著主機新增到Hadoop叢集而擴充套件,擁有數百臺主機的叢集可以輕鬆達到數PB級別的資料量。

1.1.1 Hadoop核心元件

要了解Hadoop基礎架構,我們首先需要了解HDFS。

HDFS

HDFS是Hadoop儲存元件,它是一個以Google檔案系統(GFS)為模型的分散式檔案系統。HDFS針對高吞吐量進行了最佳化,在讀取和寫入大檔案(千兆位元組或更大)時效果最佳。為了支援高吞吐量,HDFS通常使用較大的(對於檔案系統)塊和資料區域性性最佳化來減少網路I/O。

可擴充套件性和可用性也是HDFS的關鍵特性,部分原因在於資料複製和容錯。HDFS按配置的指定次數複製檔案,容忍軟體和硬體故障,並自動在已失敗節點上重新複製資料塊。

 

圖1.3

上圖顯示了HDFS中元件的邏輯表示:Name-Node和DataNode。同時,它顯示了使用Hadoop檔案系統庫訪問HDFS的應用程式。

Hadoop 2為HDFS引入了兩個重要的新功能 ——Federation和高可用(HA):

  • Federation允許在多個NameNode主機間共享HDFS後設資料,這有助於HDFS擴充套件並提供資料隔離,允許不同應用程式或團隊執行自己的NameNode,而不必擔心影響同一叢集上的其他NameNode。

  • HDFS中的高可用性消除了Hadoop 1中存在的單點故障,其中,NameNode故障將導致叢集中斷。HDFS的高可用性提供故障轉移功能(備用節點從失敗的主NameNode接管工作的過程)以實現自動化。

YARN

YARN是Hadoop分散式資源排程程式。YARN是Hadoop 2.0版本新增的功能,旨在應對Hadoop 1架構帶來的如下挑戰:

  • 大於4,000個節點的部署遇到可伸縮性問題,新增其他節點並未產生預期的線性可伸縮性改進。

  • 僅支援MapReduce工作負載,這意味著不適合執行執行模型,例如通常需要迭代計算的機器學習演算法。

在之後的Hadoop版本中,這些問題透過從MapReduce提取排程函式並將其重新編寫為通用應用程式排程程式(稱為YARN)來解決。透過此更改,Hadoop叢集不再侷限於執行MapReduce工作負載,YARN允許在Hadoop本地支援一組新的工作負載,並允許其他處理模型(如圖處理和流處理)與MapReduce共存。

YARN的架構很簡單,因為它主要是排程和管理Hadoop叢集中的資源。

 

圖1.4

上圖顯示了YARN核心元件的邏輯表示:ResourceManager和NodeManager,顯示了特定於YARN應用程式的元件,即YARN應用程式客戶端、ApplicationMaster和容器。

Hadoop 1中有“插槽”(slot)的概念,允許在單個節點上執行固定數量的map和reduce程式。這在叢集利用方面是浪費的,並且在MapReduce操作期間導致資源利用不足,對對映和任務施加了記憶體限制。使用YARN,ApplicationMaster請求的每個容器都可以具有不同的記憶體和CPU特性,這使YARN應用程式可以完全控制完成工作所需的資源。

MapReduce

MapReduce是一個批次分散式計算框架,可參考Google關於MapReduce的論文。MapReduce允許並行處理大量原始資料,例如將Web日誌與來自OLTP資料庫的關係資料相結合,以模擬使用者與網站的互動方式。使用傳統序列程式設計技術可能需要數天或更長時間來完成這類工作,使用Hadoop叢集上的MapReduce幾分鐘內便可完成。MapReduce模型透過抽象出使用分散式系統所涉及的複雜性(例如計算並行化、工作分配以及不可靠的硬體和軟體)來簡化並行處理過程。

透過這種抽象,MapReduce允許程式設計師專注於解決業務需求,而不是陷入分散式系統的複雜性中,MapReduce將客戶端提交的工作分解為小型並行化對映並減少任務。

 

圖1.5

如上圖所示,透過使用map和reduce結構,客戶端向MapReduce提交作業,將任務分解為較小的map並處理。

MapReduce是從Lisp函數語言程式設計語言中演變而來,使用無共享模型刪除不需要的執行間依賴。程式設計師的工作是定義map和reduce函式,其中map函式輸出鍵/值元組,由reduce函式處理以產生最終輸出。

 

圖1.6

上圖顯示了對映函式關於其輸入和輸出的虛擬碼定義,MapReduce的強大功能發生在shuffle和sort階段的map輸出和reduce輸入之間。

 

圖1.7  MapReduce的shuffle和排序階段

 

圖1.8  reduce函式的虛擬碼定義

隨著YARN的出現,MapReduce已被重寫為YARN應用程式,現在稱為MapReduce 2(或MRv2)。從開發人員的角度來看,Hadoop後期版本中MapReduce的工作方式與Hadoop 1大致相同,為Hadoop 1編寫的程式碼將在2.7及以後版本上執行而無需更改。

1.1.2 Hadoop生態系統

Hadoop生態系統是多樣化且日益增長的,跟蹤以某種形式與Hadoop互動的所有專案是不可能的。本節的重點是目前使用者使用最多的工具,如圖1.9所示。

 

圖1.9

1.1.3硬體要求

商用硬體配置通常用於描述Hadoop在叢集生產環境中的部署硬體要求。事實上,Hadoop可以執行在目前可挖掘到的任何舊伺服器上,但如果希望叢集執行良好且不把時間浪費在診斷和修復硬體問題上,我們自然需要更好的配置。商用硬體配置指的是具有雙插槽的中級機架式伺服器,儘可能多的錯誤校正RAM以及針對RAID儲存最佳化的SATA驅動器。在DataNode上使用RAID強烈建議不要使用儲存HDFS內容的檔案系統,因為HDFS內建了複製和錯誤檢查功能。在NameNode上,強烈建議使用RAID以提高安全性。

從網路拓撲角度來看,關於交換機和防火牆,所有主節點和從節點必須能夠相互開啟連線。對於小型叢集,所有主機都將執行連線到單個高質量交換機的1 GB網路卡。對於較大叢集,請參考10 GB架頂式交換機,這些交換機至少具有多個1 GB上行鏈路到雙中心交換機,客戶端節點還需要能夠與所有主節點和從節點通訊。

1.1.4  Hadoop發行版

一旦決定使用Hadoop,我們必須選擇一個發行版。Hadoop是Apache開源專案,可以直接從Apache專案網站(http:// hadoop.apache.org/releases.html#Download)下載該軟體的常規版本並安裝。如果決定繼續使用vanilla Hadoop發行版,必須具備專業知識來管理叢集,通常只有熟悉Hadoop DevOps的專業工程師才可以。如果不滿足上述條件,你可以轉向Hadoop商業發行版,商業發行版的好處是可以隨時解決企業生產過程中遇到的問題。當然,這些都不是免費的,如果你在Hadoop上執行任務關鍵型服務並且沒有專業的團隊做技術支援,那麼選擇商用Hadoop發行版是明智的。

選擇合適的商用發行版需要與供應商合作,從功能、支援和成本角度瞭解各發行版是否符合企業需求。每個供應商都會突出其優勢,同時暴露其競爭對手的劣勢,因此與兩個或更多供應商交談將讓你更加真實地瞭解各大供應商的優劣,確保下載並測試驗證是否可在現有軟體和硬體堆疊中整合和正常工作。目前,我們有許多發行版可供選擇,本節只簡要總結主流發行版的特點。

Apache

Apache是維護核心Hadoop程式碼和分發的組織,並且因為所有程式碼都是開源的,所以企業可以破解喜歡的IDE並瀏覽原始碼以瞭解其工作原理。從歷史上看,Apache發行版面臨的挑戰是僅靠開源社群成員的一點支援,無法保證使用者問題及時響應和修復。話雖如此,但Hadoop社群依然是非常友好且活躍的社群,對問題的回答通常很快,即使實際修復時間可能超過使用者的承受能力。

隨著Apache Ambari的出現,管理流程被極大簡化。Apache Hadoop發行版變得更加完善,Apache Ambari提供了GUI幫助配置和管理叢集。相比於複雜的商業軟體,Ambari更加簡單易用。

Cloudera

Cloudera是最受期待的Hadoop發行版,公司僱傭了大量Hadoop(包括Hadoop生態系統)程式碼提交者。Doug Cutting與Mike Caferella最初建立了Hadoop,現在是Cloudera的首席架構師。總的來說,這意味著與具有較少提交者的Hadoop發行版相比,Cloudera的錯誤修復和功能請求響應更加及時。除了維護和支援Hadoop之外,Cloudera還透過開發解決了Hadoop的一些弱點,在Hadoop領域進行了創新,比如Impala,它提供了SQL-on-Hadoop系統,類似於Hive,但專注於近乎實時的使用者體驗,而傳統上的Hive是一個高延遲系統。Cloudera還有許多其他專案,比如Flume,一個日誌收集和分發系統;Sqoop,用於將關係資料移入和移出Hadoop;Cloudera Search,提供近實時搜尋。

Hortonworks

Hortonworks同樣由大量Hadoop提交者組成,在快速解決核心Hadoop及其生態系統問題和功能請求方面具備與Cloudera相同的優勢。從創新角度來看,Hortonworks採用了與Cloudera略有不同的方法。比如Hive,Cloudera的方法是開發一個全新的SQL-on-Hadoop系統,但Hortonworks是考慮在Hive內部進行創新,以消除其高延遲的枷鎖並新增新的功能,例如支援ACID。Hortonworks也是下一代YARN平臺的主要驅動者,這是與Hadoop開源生態保持相關性的關鍵戰略。同樣,Hortonworks使用Apache Ambari作為其管理工具,而不是開發內部專有管理工具。Hortonworks專注於開發和擴充套件Apache生態系統工具,這對社群有直接好處,因為它讓所有使用者都可以使用其工具。

MapR

MapR團隊中的Hadoop提交者數量少於其他發行版,因此其修復和塑造Hadoop未來的能力比同行更有限。從創新角度來看,MapR從一開始就決定棄用HDFS作為企業級檔案系統,而開發了專有檔案系統,並提供了一些新功能,如POSIX合規性(提供隨機寫入支援和原子操作),高可用性,NFS安裝,資料映象和快照。其中一些功能已經引入Hadoop 後續版本,可見這些功能非常強大。作為評估標準的一部分,MapR的部分內容(例如其檔案系統和HBase產品)是封源和專有的,這會影響工程師向社群提供補丁的能力。相比之下,Cloudera和Hortonworks的大部分堆疊都是開源的,尤其是Hortonworks,它的獨特之處在於整個堆疊(包括管理平臺)都是開源的。MapR的一大亮點是在亞馬遜雲中提供,作為亞馬遜Elastic MapReduce的替代品,並與Google的Compute Cloud整合。

星環科技

在國內,星環科技提供的Transwarp Data Hub(簡稱TDH)是國內落地案例最多的一站式Hadoop發行版,也是Gartner認可的Hadoop國際主流發行版本。TDH解決了Hadoop的效能問題,解決了企業需要MPP或混合架構的問題。對於現在還不太成熟的Spark生態而言,唯一的優勢可能就是速度夠快,但穩定性不足,企業很難嘗試。TDH解決了Hadoop的速度問題,讓Spark失去抗衡條件。

1.1.5 使用Hadoop的公司有哪些?

Hadoop在高科技公司具有很高滲透率,並且已經開始進入其他領域。Facebook使用Hadoop、Hive和HBase進行資料倉儲和實時應用服務。Facebook的資料倉儲叢集規模為PB級,有數千個節點且使用單獨的HBase驅動實時叢集進行訊息傳遞和分析。雅虎使用Hadoop進行資料分析、機器學習、搜尋排名、垃圾郵件處理、廣告最佳化、ETL等。雅虎內部有超過40,000臺執行Hadoop和170 PB儲存的伺服器。Twitter是一個主要的大資料創新者,其透過Scalding,一個用於級聯的Scala API等專案為Hadoop做出了顯著貢獻。Summingbird可用於實現Nathan Marz lambda架構部分元件。當然,還有各種其他公司在使用Hadoop,比如Bijection、Algebird、eBay、Rackspace、Groupon、LinkedIn、阿里巴巴、百度、騰訊等。

隨著使用Hadoop的企業數量日益增長,如果在財富500強企業工作,幾乎肯定會以某種身份使用Hadoop叢集。與所有技術一樣,能夠與Hadoop有效合作的關鍵是瞭解其缺點,設計和構建適合企業的解決方案以儘可能規避這些缺點。

1.1.6 Hadoop的限制

高可用性和安全性通常是引用Hadoop的首要問題,其中許多問題已在Hadoop 2及後續版本中得到了解決。使用Hadoop 1及更早版本的企業可能需要擔心高可用性和安全性,因為在Hadoop 1中,所有主程式都是單點故障,這意味著主程式故障會導致中斷。在Hadoop的後續版本中,HDFS具有高可用性支援,並且使用YARN重新構建MapReduce已經消除了單點故障。

高可用性

高可用性通常在具有高正常執行時間SLA要求的企業中被強制要求,以確保系統始終處於開啟狀態,即使節點由於計劃內或外的情況而發生故障也是如此。在Hadoop 2之前,主HDFS程式只能在單個節點上執行,導致單點故障。Hadoop 2便帶來了NameNode高可用性(HA)支援,這意味著可以執行同一Hadoop叢集的多個NameNode。目前,其中一個NameNode處於活動狀態,另一個NameNode被指定為備用程式。如果活動NameNode意外中斷,備用NameNode將接管活動NameNode,這被稱為故障轉移程式。此故障轉移可以配置為自動,無需人為干預,發生NameNode故障轉移對Hadoop客戶端是透明的。MapReduce主程式(JobTracker)在Hadoop 2中沒有HA支援,但現在每個MapReduce作業都有自己的JobTracker程式(一個單獨的YARN ApplicationMaster),HA支援可能不那麼重要了。但是,YARN主程式(ResourceManager)中的HA支援很重要。

多資料中心支援

多資料中心支援是企業軟體設計預期中的一大關鍵功能,因為它保證了資料在多個資料中心之間複製而帶來的安全等問題。Apache Hadoop及其大多數商業發行版從未支援多個資料中心,這對在多個資料中心執行軟體的企業提出了挑戰。WANdisco是目前唯一可用於Hadoop多資料中心支援的解決方案。Hadoop確實提供了安全模型,但預設情況下它被禁用。禁用安全模型後,Hadoop中唯一存在的安全功能是HDFS檔案級和目錄級所有權和許可權,但對於惡意攻擊來說,這很容易破解。

HDFS

HDFS的弱點主要是缺乏高可用性(在Hadoop 1.x及更早版本中),對小檔案的處理效率較低,以及缺乏透明壓縮。HDFS不支援隨機寫入檔案(僅支援附加),並且通常設計為支援對大檔案進行高吞吐量順序讀取和寫入。

MapReduce

MapReduce是一種基於批處理的體系結構,這意味著它無法用於需要實時資料訪問的案例。需要全域性同步或共享可變資料的任務不適合MapReduce,因為它是一種無共享架構,可能會對某些演算法帶來挑戰。

版本不相容性

Hadoop 2版本帶來了一些關於MapReduce API執行時相容性的問題,特別是在org.hadoop.mapreduce包中。這些問題經常導致執行時出現問題,這些程式碼是針對Hadoop 1(及更早版本)編譯的,解決方案通常是針對Hadoop 2重新編譯,Hive可能也需要重新編譯才能使用Hadoop版本而不是它所構建的版本。Pig也有相容性問題,例如,Pig 0.8版本不適用於Hadoop 0.20.203,需要手動干預才能解決此問題。這是使用Apache之外的Hadoop發行版的優勢之一,因為這些相容性問題已得到修復。如果需要使用vanilla Apache發行版,那麼值得一看Bigtop(),這是一個Apache開源自動構建和合規系統。它包括所有主要的Hadoop生態系統元件,並執行整合測試,以確保彼此協同工作。

1.2 輕鬆使用MapReduce執行任務

假設想構建倒排索引,MapReduce是一個很好的選擇,因為它可以並行建立索引(一個常見的MapReduce用例)。輸入是文字檔案,輸出是元組列表,其中每個元組都是一個單詞和包含該單詞的檔案列表。使用標準處理技術,這將要求找到將所有單詞連線在一起的機制。一種簡單的方法是在記憶體中執行此連線,但如果有大量唯一鍵,則可能會耗盡記憶體。你可以使用中間資料儲存,例如資料庫,但效率低下。更好的方法是標記每一行並生成一個包含每行單詞的中間檔案,然後對中間檔案進行排序。最後一步是開啟所有已排序的中間檔案,併為每個唯一單詞呼叫函式,這就是MapReduce所做的,儘管是以分散式的方式。

 

圖1.10  MapReduce中簡單倒排索引示例

 以下是mapper程式碼:

   

此mapper的目的是為每個單詞建立一個輸出行,並顯示單詞出現的文件ID列表。MapReduce框架負責將每個對映器輸出的唯一鍵呼叫reducer,以及文件ID列表。在reducer中需要做的就是將所有文件ID組合在一起,並在reducer中輸出,如下面的程式碼所示:

 

最後一步是編寫驅動程式程式碼,該程式碼將設定所有必要屬性以保證MapReduce任務正常執行。你需要讓框架知道應該為map使用哪些類並減少函式,並讓它知道輸入和輸出資料位置。預設情況下,MapReduce假定正在處理文字。如果正在處理更復雜的文字結構或完全不同的資料儲存技術,需要告訴MapReduce應該如何從這些資料來源和接收器讀取和寫入。以下原始碼顯示完整的驅動程式程式碼:

 

首先,你需要在HDFS中建立兩個簡單的輸入檔案:

 

接下來,執行MapReduce程式碼,使用shell指令碼來執行,提供兩個輸入檔案作為引數以及任務輸出目錄:

$ hip hip.ch1.InvertedIndexJob --input hip1/input --output hip1/output

在本章中,大多數示例都透過hip指令碼啟動,該指令碼位於bin目錄。任務完成後,你可以檢查任務輸出檔案的HDFS並檢視其內容:

   

Hadoop是一個分散式系統,用於處理、生成和儲存大型資料集。其MapReduce實現提供了一種容錯機制,用於異構結構化和非結構化資料來源的大規模資料分析,YARN支援同一Hadoop叢集上多租戶的不同應用程式。本章,我們從功能和物理架構角度審視了Hadoop,並完成了安裝Hadoop以及執行MapReduce任務。本專題的其餘部分將介紹如何解決使用Hadoop時遇到的常見技術問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31077337/viewspace-2213549/,如需轉載,請註明出處,否則將追究法律責任。

相關文章