深度好文:Hadoop生態系統入門必備!

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

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

深度好文:Hadoop生態系統入門必備!

圖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的優劣。

深度好文: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按配置的指定次數複製文件,容忍軟件和硬件故障,並自動在已失敗節點上重新複製數據塊。

深度好文:Hadoop生態系統入門必備!

圖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集群中的資源。

深度好文: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將客戶端提交的工作分解為小型並行化映射並減少任務。

深度好文:Hadoop生態系統入門必備!

圖1.5

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

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

深度好文:Hadoop生態系統入門必備!

圖1.6

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

深度好文:Hadoop生態系統入門必備!

圖1.7 MapReduce的shuffle和排序階段

深度好文:Hadoop生態系統入門必備!

圖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所示。

深度好文:Hadoop生態系統入門必備!

圖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(http://bigtop.apache.org/),這是一個Apache開源自動構建和合規系統。它包括所有主要的Hadoop生態系統組件,並運行集成測試,以確保彼此協同工作。

1.2 輕鬆使用MapReduce運行任務

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

深度好文:Hadoop生態系統入門必備!

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

以下是mapper代碼:

深度好文:Hadoop生態系統入門必備!

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

深度好文:Hadoop生態系統入門必備!

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

深度好文:Hadoop生態系統入門必備!

首先,你需要在HDFS中創建兩個簡單的輸入文件:

深度好文:Hadoop生態系統入門必備!

接下來,運行MapReduce代碼,使用shell腳本來運行,提供兩個輸入文件作為參數以及任務輸出目錄:

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

在本章中,大多數示例都通過hip腳本啟動,該腳本位於bin目錄。任務完成後,你可以檢查任務輸出文件的HDFS並查看其內容:

深度好文:Hadoop生態系統入門必備!

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


分享到:


相關文章: