先說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為海量資料提供了計算架構。
如果你對大資料開發感興趣,想系統學習大資料的話,可以加入大資料技術學習交流扣群:數字522+數字189+307,私信管理者即可免費領取開發工具以及入門學習資料
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搜尋引擎實作了大規模資料集的并行分析運算。
(Google内心OS:我去她媽的)
2006年,Doug Cutting将NDFS和MapReduce進行了更新改造,并重新命名為Hadoop。NDFS也改名為HDFS(Hadoop Distributed File System)。
此後,大名鼎鼎的大資料架構系統——Hadoop誕生。而Doug Cutting也被人們稱為Hadoop之父。
(Google:Doug Cutting你好意思嗎?)
是以說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:我能放過嗎?當然不能啊)
于是Doug Cutting在自己的hadoop系統裡面又引入了BigTable,并命名為HBase。
(Google:。。。。。。)
簡單介紹Hadoop生态系統的主要構成元件:
HDFS: 基礎的檔案系統,Hadoop分布式檔案系統
MapReduce:并行計算架構,運作在Yarn之上
HBase: 類似Google BigTable的分布式NoSQL列分布式資料庫。适用于實時快速查詢的場景。
Hive:資料倉庫工具。處理的是海量結構化日志資料的統計問題。可以将結構化的資料檔案映射為一張資料庫表,通過類SQL語句快速實作簡單的MapReduce統計,不必開發專門的MapReduce應用,十分适合資料倉庫的統計分析。
Zookeeper:分布式協調服務,“動物園管理者”角色,是一個對叢集服務進行管理的架構,主要是用來解決分布式應用中經常遇到的一些資料管理問題,簡化分布式應用協調及其管理的難度。
Pig: 一個基于Hadoop的大規模資料分析工具,該語言的編譯器會把類SQL的資料分析請求轉換為一系列經過優化處理的MapReduce運算。
Sqoop:在Hadoop與傳統的資料庫間進行資料的傳遞。
Mahout:一個可擴充的機器學習和資料挖掘庫,實作了很多資料挖掘的經典算法,幫助使用者很友善地建立應用程式。
Oozie:一個工作流排程引擎,用來處理具有依賴關系的作業排程。
Flume:日志收集架構。将多種應用伺服器上的日志,統一收集到HDFS上,這樣就可以使用hadoop進行處理
對于大資料領域最早的應用者阿裡巴巴對大資料的研究是一直走在前列的。感興趣的使用者可以看看一本書:《阿裡巴巴大資料之路》書中很詳細的介紹了阿裡巴巴的整體大資料架構。
阿裡巴巴的大資料架構是在開源Hadoop的基礎上自研的一套體系。
阿裡大資料體系的主要元件介紹:
usertrack:阿裡巴巴APP端日志資料采集技術方案
aplus.js:阿裡巴巴web端日志資料采集技術方案
dataX :阿裡巴巴離線資料庫同步工具
Maxcompute :阿裡巴巴大資料處理系統離線計算平台
streamcompute:阿裡巴巴大資料處理系統實時計算平台——全鍊路流計算開發平台
TimeTunnel:阿裡巴巴實時資料傳輸平台
TDDL:阿裡巴巴分布式資料庫通路引擎
onedata:阿裡巴巴資料計算層資料整合及管理體系
DQC:阿裡巴巴資料品質中心
在彼岸:阿裡巴巴大資料系統的自動化測試平台
D2:在雲端,阿裡巴巴統一開發平台
SQLCSCAN:阿裡巴巴開發平台代碼規則庫
apsara core :阿裡巴巴大資料計算平台maxcompute計算層(飛天核心)
伏羲:阿裡雲飛天系統核心的分布式資源排程系統
女娲:阿裡雲飛天系統核心的分布式一緻性協同服務系統
盤古:阿裡雲飛天系統核心的分布式檔案儲存系統
ODS:阿裡巴巴流式資料模型操作資料層-阿裡巴巴對從源系統同步到資料倉庫的第一層資料
DWD:阿裡巴巴流式資料模型公共明細層
DWS:阿裡巴巴流式資料模型公共彙總層
ADS:阿裡巴巴流式資料模型應用資料層