很多人問阿里的飛天大數據平臺、雲梯2、MaxCompute、實時計算到底是什麼,和自建Hadoop平臺有什麼區別。
先說Hadoop
什麼是Hadoop?
Hadoop是一個開源、高可靠、可擴展的分佈式大數據計算框架系統,主要用來解決海量數據的存儲、分析、分佈式資源調度等。Hadoop最大的優點就是能夠提供並行計算,充分利用集群的威力進行高速運算和存儲。
Hadoop的核心有兩大板塊:HDFS和MapReduce。
HDFS全稱Hadoop Distributed File System,是一種分佈式文件存儲系統。分佈式文件系統是指將固定於某個地點的某個文件系統,擴展到任意多個文件系統,眾多的節點組成一個文件系統網絡。每個節點可以分佈在不同的地點,通過網絡進行節點間的通信和數據傳輸。人們在使用分佈式文件系統時,無需關心數據是存儲在哪個節點上、或者是從哪個節點獲取的,只需要像使用本地文件系統一樣管理和存儲文件系統中的數據。HDFS有著高容錯性,可以部署在低廉的硬件;提供高吞吐量來訪問應用程序的數據;可以有效解決超大數據量存儲和管理難題的分佈式文件系統屬性的特點。因此HDFS天然適合有著超大數據集的應用程序,或者說本身就是為超大規模數據量處理的應用程序而設計的。
MapReduce是一個分佈式離線並行計算框架,能夠對大數據集進行並行處理。MapReduce就是將一個超大規模計算量的任務或者說數據量分割成無數小的計算任務與計算文件,然後再將計算結果進行合併的過程。MapReduce主要分為Map和Reduce兩個階段。Map是計算階段,計算足夠小的計算任務。Reduce是彙總階段,將map階段的計算結果彙總合併起來。
Hadoop的初始版本或者說核心就是這兩大板塊:HDFS為海量數據提供了存儲,而MapReduce為海量數據提供了計算框架。
Hadoop的歷史
1998年9月4日,Google公司在美國硅谷成立。
與此同時,一位名叫Doug Cutting的美國工程師,也迷上了搜索引擎。他做了一個用於文本搜索的函數庫,命名為Lucene。Lucene是用JAVA寫成的,因為好用而且開源,非常受程序員們的歡迎。
2001年底,Lucene成為Apache軟件基金會jakarta項目的一個子項目。
2004年,Doug Cutting在Lucene的基礎上和Apache開源夥伴Mike Cafarella合作開發了一款開源搜索引擎,命名為Nutch。Nutch是一個建立在Lucene核心之上的網頁搜索應用程序,類似於Google。
隨著時間的推移,互聯網發展迅速,數據量暴增,搜索引擎需要檢索的對象的數據量也在不斷增大。尤其是Google,需要不斷優化自己的搜索算法,提升搜索效率。在這個過程中Google提出了不少的新方法與思路。
2003年,Google發表了一篇技術學術論文,公開了自己的谷歌文件系統GFS(Google File System)。這是Google公司為了存儲海量搜索數據而設計的專用文件系統。
第二年,2004年,Doug Cutting基於Google的GFS論文,實現了分佈式文件存儲系統,並將它命名為NDFS(Nutch Distributed File System)。
2004年,Google又發表了一篇技術學術論文,公開了自己的MapReduce編程模型。MapReduce用於大規模數據集的並行分析運算。
第二年,2005年,Doug Cutting又基於MapReduce,在Nutch搜索引擎實現了大規模數據集的並行分析運算。
2006年,Doug Cutting將NDFS和MapReduce進行了升級改造,並重新命名為Hadoop。NDFS也改名為HDFS(Hadoop Distributed File System)。
此後,大名鼎鼎的大數據框架系統——Hadoop誕生。而Doug Cutting也被人們稱為Hadoop之父。
所以說Hadoop的核心就兩大部分:為大數據提供存儲的HDFS和為大數據計算的MapReduce。
HDFS與MapReduce的核心工作原理
HDFS
HDFS主要有兩個角色:NameNode、DataNode和Client。
NameNode是HDFS的守護程序,也是是Master節點,主節點。NameNode中會存儲文件的元數據信息,記錄文件是如何分割成數據塊的,以及這些數據塊被存儲到哪些節點上,可以對內存和I/O進行集中管理。NameNode單點在發生故障時將使集群崩潰。
DataNode是Slave節點,從節點。DataNode負責把HDFS數據塊讀寫到本地文件系統,是真正存儲文件的節點。一個文件會被切割成一個或者多個block塊,這些block塊會被存儲在一系列的DataNode節點中,並且每一個塊可能會在多個DataNode上存在備份。
Client:用戶與HDFS的橋樑。主要用於切分用戶提交的文件,與NameNode交互,獲得文件位置信息。然後直接與DataNode交互,讀取和寫入數據。
HDFS寫入流程(參考的現有文檔):
1、用戶向Client(客戶機)提出請求。例如,需要寫入200MB的數據。
2、Client制定計劃:將數據按照64MB為塊,進行切割;所有的塊都保存三份。
3、Client將大文件切分成塊(block)。
4、針對第一個塊,Client告訴NameNode(主控節點),請幫助我,將64MB的塊複製三份。
5、NameNode告訴Client三個DataNode(數據節點)的地址,並且將它們根據到Client的距離,進行了排序。
6、Client把數據和清單發給第一個DataNode。
7、第一個DataNode將數據複製給第二個DataNode。
8、第二個DataNode將數據複製給第三個DataNode。
9、如果某一個塊的所有數據都已寫入,就會向NameNode反饋已完成。
10、對第二個Block,也進行相同的操作。
11、所有Block都完成後,關閉文件。NameNode會將數據持久化到磁盤上。
HDFS讀取流程:
1、用戶向Client提出讀取請求。
2、Client向NameNode請求這個文件的所有信息。
3、NameNode將給Client這個文件的塊列表,以及存儲各個塊的數據節點清單(按照和客戶端的距離排序)。
4、Client從距離最近的數據節點下載所需的塊。
MapReduce
MapReduce主要也有兩個角色:JobTracker和TaskTracker。
JobTracker,類似於 NameNode。JobTracker是 Hadoop 集群中惟一負責控制 MapReduce應用程序的系統,位於Master節點上。在用戶計算作業的應用程序提交之後,JobTracker決定有哪些文件參與處理,使用文件塊信息確定如何創建其他 TaskTracker 從屬任務,同時監控task並且於不同的節點上重啟失敗的task。TaskTracker位於slave從節點上與dataNode結合管理各自節點上由jobtracker分配的task,每個節點只有一個tasktracker,但一個tasktracker可以啟動多個JVM,用於並行執行map或reduce任務。每個 TaskTracker 將狀態和完成信息報告給 JobTracker。
(實際上MapReduce計算邏輯非常複雜,以上只是簡化描述)
HDFS和MapReduce的組合只是Hadoop的1.0版本,這個版本有一些比較大的缺陷:
1、可伸縮性問題:JobTracker負載較重,JobTracker 必須不斷跟蹤數千個 TaskTracker、數百個作業,以及數萬個 map 和 reduce 任務。相反,TaskTracker 通常只運行十來個任務。JobTracker存在單點故障,成為性能瓶頸。
2、可靠性差,NameNode只有一個,萬一掛掉,整個系統就會崩潰。
為了解決一些問題,2012年5月,Hadoop推出了 2.0版本 。
2.0版本中,在HDFS與MapReduce之間,增加了YARN資源管理框架層。
YARN全稱Yet Another Resource Negotiator是一個資源管理模塊,負責整個集群資源的管理和調度,例如對每個作業,分配CPU,內存等等,都由yarn來管理。它的特點是擴展性,容錯性,多框架資源統一調度。區別於hadoop1.0只支持MapReduce作業,yarn之上可以運行不同類型的作業。很多應用都可以運行在yarn之上,由yarn統一進行調度。
YARN的運行原理:
YARN的一個基本思想是講資源管理和作業調度/監視的功能分解為獨立的守護進程。其思想是有一個全局的ResourceManager (RM) 和每一個應用的ApplicationMaster (AM)。一個應用可以是單個的job,也可以是一組job。
YARN框架由ResourceManager節點和NodeManager組成。ResourceManager具有著應用系統中資源分配的最終權威。NodeManager是每臺機器的一個框架代理,監控每臺機器的資源使用情況(cpu、內存、磁盤、網絡),同時上報給ResourceManager。每一個應用的ApplicationMaster是一個框架特定的庫,它的任務是向ResourceManager協調資源並與NodeManager一起執行監視任務。
從流程上來說:當用戶提交了一個計算任務,ResourceManager首先會在一個NodeManager為這個任務生成一個ApplicationMaster作為任務的管理者,ApplicationMaster向ResourceManager申請所需要的資源,ResourceManager會告訴NodeManager分配資源,NodeManager分配資源來供任務進行計算。NodeManager在不斷的向ResourceManager彙報資源使用情況。
其實MapReduce與HDFS並不是一定要互相耦合工作的,兩個都可以彼此獨立工作,MapReduce也可以連接本地文件服務來進行計算,但是他們互相配合的時候才能發揮出最大的能力。
大數據架構體系——Hadoop生態系統
目前業界內最流行的大數據架構體系就是Hadoop的生態系統。目前,包括Yahoo、IBM、Facebook、亞馬遜、阿里巴巴、華為、百度、騰訊等公司,都採用Hadoop構建自己的大數據系統,當然,是在Hadoop的基礎上進行二次開發。
Hadoop生態系統是指以大數據分佈式存儲(HDFS),分佈式計算(MapReduce)和資源調度(YARN)為基礎聯合其他各種組件在內的一整套軟件。Hadoop生態系統的每一個子系統只解決某一個特定的問題域。不是一個全能系統,而是多個小而精的系統。
在這之前有個插曲:
2006年,Google又發論文了。這次,Google介紹了自己的BigTable,一種分佈式數據存儲系統,用來處理海量數據的非關係型數據庫。
於是Doug Cutting在自己的Hadoop系統裡面又引入了BigTable,並命名為HBase。
簡單介紹Hadoop生態系統的主要構成組件:
HDFS: 基礎的文件系統,Hadoop分佈式文件系統
MapReduce:並行計算框架,運行在Yarn之上
HBase: 類似Google BigTable的分佈式NoSQL列分佈式數據庫。適用於實時快速查詢的場景。
Hive:數據倉庫工具。處理的是海量結構化日誌數據的統計問題。可以將結構化的數據文件映射為一張數據庫表,通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
Zookeeper:分佈式協調服務,“動物園管理員”角色,是一個對集群服務進行管理的框架,主要是用來解決分佈式應用中經常遇到的一些數據管理問題,簡化分佈式應用協調及其管理的難度。
Pig: 一個基於Hadoop的大規模數據分析工具,該語言的編譯器會把類SQL的數據分析請求轉換為一系列經過優化處理的MapReduce運算。
Sqoop:在Hadoop與傳統的數據庫間進行數據的傳遞。
Mahout:一個可擴展的機器學習和數據挖掘庫,實現了很多數據挖掘的經典算法,幫助用戶很方便地創建應用程序。
Oozie/Azkaban:一個工作流調度引擎,用來處理具有依賴關係的作業調度。
Presto/Kylin:一個交互式的查詢引擎,實現低延時查詢。
Flume:日誌收集框架。將多種應用服務器上的日誌,統一收集到HDFS上,這樣就可以使用hadoop進行處理
對於大數據領域最早的應用者阿里巴巴對大數據的研究是一直走在前列的。感興趣的用戶可以看看一本書:《阿里巴巴大數據之路》書中很詳細的介紹了阿里巴巴的整體大數據架構。
阿里巴巴飛天大數據平臺是在開源Hadoop的基礎上自研的一套體系,這種Serverless大數據服務成為當下主流趨勢,可以減少企業本地服務器部署壓力,顯著提升企業工作效率的同時減少了企業在開發和人力方面的成本投入,讓企業能更專注於業務發展,培養更多面向業務的技術人員。
7月25日,阿里雲飛天大數據平臺亮相阿里雲峰會上海站,擁有中國唯一自主研發的計算引擎,是全球集群規模最大的計算平臺,最大可擴展至10萬臺計算集群,支撐海量數據存儲和計算。
閱讀更多 阿里云云棲號 的文章