亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
937
2022-05-29
1.1.2 Hadoop簡介
Hadoop是一個數據存儲與數據處理平臺,項目起源于數據本地化的核心概念。數據本地化(data locality)指在數據存儲的地方處理數據,讓計算靠近數據,而不是像數據庫管理系統那樣向數據存儲請求數據,發到遠端數據處理系統或者主機進行計算。
由于網絡應用快速發展導致大數據的出現,在計算時通過網絡傳輸大量數據的傳統方式不再高效、實用,有時甚至無法實現。
Hadoop讓大型數據集可以在各節點上通過無共享(shared nothing)的方式在本地處理,每個節點可以獨立處理比整個數據集小得多的一個子集,而無須與其他節點通信。這種特性是通過分布式文件系統實現的。
Hadoop在執行寫操作時是沒有結構信息的。這就是所謂的讀時模式(schema-on-read)系統。這意味著Hadoop可以存儲和處理各種各樣的數據,無論是無結構的文本文檔,還是半結構化的JSON(JavaScript Object Notation)文檔或XML文檔,又或是從關系型數據庫中提取的完全結構化的數據。
讀時模式系統和我們所熟知的關系型數據庫有著本質區別。關系型數據庫通常被認為屬于寫時模式(schema-on-read),數據一般具有強結構性,表結構是預定義的,并且在INSERT、UPDATE和UPSERT等操作時要求結構完全匹配。
類似HBase或者Cassandra這樣的NoSQL平臺也屬于讀時模式系統。你會在第6章了解到更多NoSQL平臺相關的內容。
由于在Hadoop的寫操作時并沒有明確的結構信息,所以寫出的文件并沒有索引、統計信息,或是數據庫系統常用的其他一些用于優化查詢操作、篩選或減少返回到客戶端的數據量的數據結構。這進一步凸顯了數據本地化的必要性。
Hadoop的設計思路是通過對大型問題分而治之的方法,運用數據本地化與無共享的概念,將大型問題切分成一系列小規模的問題,實現“大海里撈針”。Spark也使用了非常相似的概念。
1.Hadoop核心組件
Hadoop包含兩個核心組件:HDFS(Hadoop分布式文件系統)和YARN(Yet Another Resource
Negotiator,另一個資源協調器)。HDFS是Hadoop
的存儲系統,而YARN可以當作Hadoop處理或者資源調度的子系統(如圖1.1所示)。
這兩個組件相互獨立,可以各自運行在自己的集群上。當HDFS集群和YARN集群部署在一起時,我們把這兩個系統的組合稱為一個Hadoop集群。Hadoop的這兩個核心組件都可以被Spark利用起來,本章的后續部分會進一步討論。
集群術語
集群(cluster)指一組協同工作執行諸如計算或處理功能的系統。集群中的單個服務器稱為節點(node)。
集群可以有多種拓撲和通信模型。其中一種模型為主-從模型。主-從模型是由一個進程控制其他至少一個進程的通信方式。在某些系統中,直到運行時或處理任務時,主節點才從一組可用的進程中選出來的。但在其他情況下,比如HDFS集群或者YARN集群里,主進程和從進程的角色都是預先分配好的,在集群整個生命周期里不會發生變化。
任何以某種方式與Hadoop交互或者整合的項目都稱為Hadoop“生態圈”項目,比如Flume、Sqoop等數據接入項目,或者Pig、Hive等數據分析工具。Spark可以當作一個Hadoop生態圈項目,不過這有一些爭議,因為Spark無須Hadoop也能運行。
2.HDFS:文件、數據塊、元數據
HDFS是一種虛擬文件系統,其中的文件由分布在集群中至少一個節點上的數據塊(block)組成。在把文件上傳到文件系統的時候,文件會按照配置好的數據塊大小進行分割,這樣的過程稱為數據接入(ingestion)。分割后得到的數據塊分布在整個集群的節點上,每個數據塊會重復出現在幾個節點上,以此實現容錯,并提高本地處理數據的概率(設計目的是“讓計算靠近數據”)。HDFS數據塊由HDFS集群從節點的DataNode進程存儲和管理。
DataNode進程是HDFS從節點守護進程,運行在HDFS集群中至少一個節點上。DataNode負責管理數據塊存儲和數據讀寫訪問,還有數據塊復制,這也是數據接入過程的一部分,如圖1.2所示。
圖1.2 HDFS數據接入、數據塊分布和復制
文件系統的元數據中存儲著文件系統的信息,還有其中的目錄、文件信息,以及組成文件的物理數據塊信息。HDFS的主節點進程稱為NameNode,文件系統元數據就存儲在NameNode進程的常駐內存里。HDFS集群的NameNode通過類似于關系型數據庫事務日志的日志功能為元數據提供持久性。NameNode負責為HDFS客戶端提供讀寫數據塊的具體位置,這樣客戶端就可以直接和DataNode通信并進行數據操作。圖1.3呈現了HDFS讀操作的示意圖,而圖1.4解析了HDFS寫操作的過程。
3.用YARN進行應用調度
YARN管理并協調著Hadoop里的數據處理。在這種場景下,數據一般都以HDFS作為輸入輸出源。YARN集群架構使用的是與HDFS類似的主從集群框架,主節點守護進程稱為ResouceManager,而從節點守護進程稱為NodeManager,至少有一個,運行在集群的從節點上。
圖1.3 HDFS讀操作解析
圖1.4 HDFS寫操作解析
ResourceManager負責為集群上運行的應用分配集群計算資源。資源以容器作為單位分配,容器有預定義好的CPU核心數和內存限制。容器分配的最大最小閾值等都可以在集群中進行配置。使用容器可以保障進程間的資源隔離。
ResourceManager也會在隨應用退出并釋放所占資源時維護集群剩余可用的資源量,同時還跟蹤集群上當前運行的應用的狀態。ResourceManager默認會在所運行主機的8088端口上提供內嵌的網頁版用戶交互界面,這對于查看應用狀態很有用,無論應用正在運行、運行完成或是運行失敗,如圖1.5所示。這個用戶界面在管理YARN集群上運行的Spark應用狀態時需要經常用到。
圖1.5 YARN資源管理器ResourceManager用戶界面
客戶端把應用(比如一個Spark應用程序)提交到ResourceManager,然后ResourceManager首先從集群中一個可用的NodeManager里分配出應用的第一個容器,作為應用的委托進程,這個進程就是ApplicationMaster。然后ApplicationMaster繼續為應用申請運行任務所需的其余容器。
NodeManager是YARN從節點守護進程,管理從節點主機上運行的容器。容器用于執行應用里的任務。回想一下無共享的概念,Hadoop解決大規模問題的思路是“分而治之”,大規模問題被分解為一堆小規模任務,很多任務可以并發執行。這些任務都運行在容器里,該容器由運行著NodeManager進程的主機分配。
大多數容器只是運行任務。不過,ApplicationMaster會額外負責管理整個應用。前面介紹過,ApplicationMaster是由ResourceManager從NodeManager上分配的第一個容器。它的任務是規劃整個應用,包括決定需要什么資源(通常基于要處理多少數據)以及為應用的各階段(稍后會介紹)安排資源。ApplicationMaster代表應用向ResourceManager申請這些資源。ResourceManager從NodeManager上(可以是同一個NodeManager,也可以是其他的NodeManager)給ApplicationMaster分配資源以供該應用使用,直到該應用退出。后面會詳細介紹,對于Spark而言,ApplicationMaster會監控任務、階段(一組可以并發執行的Spark任務)還有依賴的進度。綜述信息會傳給ResouceManager,展示在前面介紹過的用戶界面中。圖1.6展示了YARN應用提交、調度和執行的過程的概況。
圖1.6描述的過程如下所述:
1)客戶端把應用提交給ResourceManager。
2)ResourceManager在一個擁有足夠容量的NodeManager上分配出一個ApplicationMaster進程。
3)ApplicationMaster向ResourceManager申請容器用于在NodeManager上運行任務(運行著ApplicationMaster的NodeManager也可以再分配任務容器),并且把應用的處理任務分發到這些NodeManager提供的任務容器里。
4)各NodeManager把任務嘗試的狀態和進度匯報給ApplicationMaster。
圖1.6 YARN中的應用提交、調度,以及執行(Hadoop 2.6)
5)ApplicationMaster向ResourceManager匯報應用的進度和狀態。
6)ResourceManager向客戶端匯報應用進度、狀態以及執行結果。
我們會在第3章中探索如何利用YARN來調度和協調運行在Hadoop集群上的Spark程序。
Hadoop MapReduce(映射-歸約)
谷歌在2003年發布的白皮書《The Google File System》影響了HDFS項目,緊接著谷歌又在2004年12月發布了題為《MapReduce: Simplified Data Processing on Large Clusters》的白皮書。MapReduce的白皮書從高層描述了谷歌的數據處理方式,尤其是搜索引擎中的海量文本數據的索引和排位。MapReduce成為了Hadoop的核心編程模型,最終也啟發并影響了Spark項目。
Spark python spark Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。