- Hadoop簡介和歷史
- Hadoop架構體系
- Master和Slave節點
- 資料分析面臨的問題和Hadoop思想
由於工作原因,必須學習和深入一下Hadoop,特此記錄筆記。
什麼是hadoop?
Apache Hadoop是一款支援資料密集型分散式應用並以Apache 2.0許可協議釋出的開源軟體框架。它支援在商品硬體構建的大型叢集上執行的應用程式。Hadoop是根據Google公司發表的MapReduce和Google檔案系統的論文自行實作而成。
Hadoop框架透明地為應用提供可靠性和資料移動。它實現了名為MapReduce的程式設計正規化:應用程式被分割成許多小部分,而每個部分都能在叢集中的任意節點上執行或重新執行。此外,Hadoop還提供了分散式檔案系統,用以儲存所有計算節點的資料,這為整個叢集帶來了非常高的頻寬。MapReduce和分散式檔案系統的設計,使得整個框架能夠自動處理節點故障。它使應用程式與成千上萬的獨立計算的電腦和PB級的資料。
hadoop歷史
Hadoop由 Apache Software Foundation 於 2005 年秋天作為Lucene的子專案Nutch的一部分正式引入。它受到最先由 Google Lab 開發的 Map/Reduce 和 Google File System(GFS) 的啟發。
2006 年 3 月份,Map/Reduce 和 Nutch Distributed File System (NDFS) 分別被納入稱為 Hadoop 的專案中。Hadoop 是最受歡迎的在 Internet 上對搜尋關鍵字進行內容分類的工具,但它也可以解決許多要求極大伸縮性的問題。例如,如果您要 grep 一個 10TB 的巨型檔案,會出現什麼情況?在傳統的系統上,這將需要很長的時間。但是 Hadoop 在設計時就考慮到這些問題,採用並行執行機制,因此能大大提高效率。
- Hadoop Common:在0.20及以前的版本中,包含HDFS、MapReduce和其他專案公共內容,從0.21開始HDFS和MapReduce被分離為獨立的子專案,其餘內容為Hadoop Common
- HDFS:Hadoop分散式檔案系統(Distributed File System)-HDFS(Hadoop Distributed File System)
- MapReduce:平行計算框架,0.20前使用org.apache.hadoop.mapred舊介面,0.20版本開始引入org.apache.hadoop.mapreduce的新API
- Apache HBase:分散式NoSQL列資料庫,類似谷歌公司BigTable。
- Apache Hive:構建於hadoop之上的資料倉儲,通過一種類SQL語言HiveQL為使用者提供資料的歸納、查詢和分析等功能。Hive最初由Facebook貢獻。
- Apache Mahout:機器學習演算法軟體包。
- Apache Sqoop:結構化資料(如關聯式資料庫)與Apache Hadoop之間的資料轉換工具。
- Apache ZooKeeper:分散式鎖設施,提供類似Google Chubby的功能,由Facebook貢獻。
- Apache Avro:新的資料序列化格式與傳輸工具,將逐步取代Hadoop原有的IPC機制。
hadoop平臺子專案
現在普遍認為整個Apache Hadoop“平臺”包括Hadoop核心、MapReduce、Hadoop分散式檔案系統(HDFS)以及一些相關專案,有Apache Hive和Apache HBase等等。Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的資料提供了儲存,則MapReduce為海量的資料提供了計算。
如圖,最下面一層就是hadoop的核心程式碼,核心程式碼之上實現了兩個最核心的功能:MapReduce和HDFS,這是hadoop的兩大支柱!因為hadoop是Java寫的,為了方便其他對Java語言不熟悉的程式設計師,在這之上又有Pig,這是一個輕量級的語言,使用者可以使用Pig用於資料分析和處理,系統會自動把它轉化為MapReduce程式。
還有一個Hive,很重要!這是一個傳統的SQL到MapReduce的對映器,面向傳統的資料庫工程師。但是不支援全部SQL。還有一個子專案叫HBase,一個非關聯式資料庫,NoSQL資料庫,資料是列儲存的,提高響應速度,減少IO量,可以做成分散式叢集。
ZooKeeper負責伺服器節點和程式間的通訊,是一個協調工具,因為Hadoop的幾乎每個子專案都是用動物做logo,故這個協調軟體叫動物園管理員。
Hadoop架構
如圖,兩個伺服器機櫃,每個圓柱代表一個物理機,各個物理節點通過網線連線,連線到交換機,然後客戶端通過網際網路來訪問。其中各個物理機上都執行著Hadoop的一些後臺程式。
Namenode
也叫名稱節點,是HDFS的守護程式(一個核心程式),對整個分散式檔案系統進行總控制,會紀錄所有的後設資料分佈儲存的狀態資訊,比如檔案是如何分割成資料塊的,以及這些資料塊被儲存到哪些節點上,還有對記憶體和I/O進行集中管理,使用者首先會訪問Namenode,通過該總控節點獲取檔案分佈的狀態資訊,找到檔案分佈到了哪些資料節點,然後在和這些節點打交道,把檔案拿到。故這是一個核心節點。
不過這是個單點,發生故障將使叢集崩潰。
Secondary Namenode
在Hadoop中,有一些命名不好的模組,Secondary NameNode是其中之一。從它的名字上看,它給人的感覺就像是NameNode的備份,比如有人叫它第二名稱節點,彷彿給人感覺還有後續……但它實際上卻不完全是。
最好翻譯為輔助名稱節點,或者檢查點節點,它是監控HDFS狀態的輔助後臺程式,可以儲存名稱節點的副本,故每個叢集都有一個,它與NameNode進行通訊,定期儲存HDFS後設資料快照。NameNode故障可以作為備用NameNode使用,目前還不能自動切換。但是功能絕不僅限於此。所謂後備也不是它的主要功能。後續詳細解釋。
叫資料節點,每臺從伺服器節點都執行一個,負責把HDFS資料塊讀、寫到本地檔案系統。這三個東西組成了Hadoop平臺其中一個支柱——HDFS體系。
再看另一個支柱——MapReduce,有兩個後臺程式。
叫作業跟蹤器,執行到主節點(Namenode)上的一個很重要的程式,是MapReduce體系的排程器。用於處理作業(使用者提交的程式碼)的後臺程式,決定有哪些檔案參與作業的處理,然後把作業切割成為一個個的小task,並把它們分配到所需要的資料所在的子節點。
Hadoop的原則就是就近執行,資料和程式要在同一個物理節點裡,資料在哪裡,程式就跑去哪裡執行。這個工作是JobTracker做的,監控task,還會重啟失敗的task(於不同的節點),每個叢集只有唯一一個JobTracker,類似單點的nn,位於Master節點(稍後解釋Master節點和slave節點)。
叫任務跟蹤器,MapReduce體系的最後一個後臺程式,位於每個slave節點上,與datanode結合(程式碼與資料一起的原則),管理各自節點上的task(由jobtracker分配),每個節點只有一個tasktracker,但一個tasktracker可以啟動多個JVM,用於並行執行map或reduce任務,它與jobtracker互動通訊,可以告知jobtracker子任務完成情況。
Master與Slave
Master節點:執行了Namenode、或者Secondary Namenode、或者Jobtracker的節點。還有瀏覽器(用於觀看管理介面),等其它Hadoop工具。Master不是唯一的!
Slave節點:執行Tasktracker、Datanode的機器。
資料分析者面臨的問題和Hadoop的思想
目前需要我們處理的資料日趨龐大,無論是入庫和查詢,都出現效能瓶頸,使用者的應用和分析結果呈整合趨勢,對實時性和響應時間要求越來越高。使用的模型越來越複雜,計算量指數級上升。
故,人們希望出現一種技術或者工具來解決效能瓶頸,在可見未來不容易出現新瓶頸,並且學習成本儘量低,使得過去所擁有的技能可以平穩過渡。比如SQL、R等,還有轉移平臺的成本能否控制最低,比如平臺軟硬體成本,再開發成本,技能再培養成本,維護成本等。
而Hadoop就能解決如上問題——分而治之,化繁為簡。
補充:
Hadoop是一個能夠對大量資料進行分散式處理的軟體框架,實現了Google的MapReduce程式設計模型和框架,能夠把應用程式分割成許多的小的工作單元,並把這些單元放到任何叢集節點上執行。在MapReduce中,一個準備提交執行的應用程式稱為“作業(job)”,而從一個作業劃分出得、執行於各個計算節點的工作單元稱為“任務(task)”。此外,Hadoop提供的分散式檔案系統(HDFS)主要負責各個節點的資料儲存,並實現了高吞吐率的資料讀寫。
在分散式儲存和分散式計算方面,Hadoop都是用從/從(Master/Slave)架構。在一個配置完整的叢集上,想讓Hadoop這頭大象奔跑起來,需要在叢集中執行一系列後臺(deamon)程式。不同的後臺程式扮演不用的角色,這些角色由NameNode、DataNode、Secondary NameNode、JobTracker、TaskTracker組成。其中NameNode、Secondary NameNode、JobTracker執行在Master節點上,而在每個Slave節點上,部署一個DataNode和TaskTracker,以便這個Slave伺服器執行的資料處理程式能儘可能直接處理本機的資料。對Master節點需要特別說明的是,在小叢集中,Secondary NameNode可以屬於某個從節點;在大型叢集中,NameNode和JobTracker被分別部署在兩臺伺服器上。
1.NameNode
NameNode是HDFS的守護程式,負責記錄檔案時如何分割成資料塊的,以及這些資料塊分別被儲存在哪些資料節點上。它的主要功能是對記憶體及I/O的集中管理。
一般來說,NameNode所在的伺服器不儲存任何使用者資訊或執行計算任務,以避免這些程式降低伺服器的效能。如果其他從伺服器當機,Hadoop叢集仍舊可以繼續運作,或者快速重啟。但是,由於NameNode是Hadoop叢集中的單點,一旦NameNode伺服器當機,整個系統將無法運轉。
2.DataNode
叢集中的每個伺服器都執行一個DataNode後臺程式,這個後臺程式負責把HDFS資料塊讀寫到本地的檔案系統。當需要通過客戶端讀/寫某個資料時,先由NameNode告訴客戶端去哪個DataNode進行具體的讀/寫操作,然後,客戶端直接與這個DataNode伺服器上的後臺程式進行通訊,並且對相關的資料塊進行讀/寫操作。
3.Secondary NameNode
Secondary NameNode是一個用來監控HDFS狀態的輔助後臺程式。就想NameNode一樣,每個叢集都有一個Secondary NameNode,並且部署在一個單獨的伺服器上。Secondary NameNode不同於NameNode,它不接受或者記錄任何實時的資料變化,但是,它會與NameNode進行通訊,以便定期地儲存HDFS後設資料的快照。由於NameNode是單點的,通過Secondary NameNode的快照功能,可以將NameNode的當機時間和資料損失降低到最小。同時,如果NameNode發生問題,Secondary NameNode可以及時地作為備用NameNode使用。
4.JobTracker
JobTracker後臺程式用來連線應用程式與Hadoop。使用者程式碼提交到叢集以後,由JobTracker決定哪個檔案將被處理,並且為不同的task分配節點。同時,它還監控所有的task,一旦某個task失敗了,JobTracker就會自動重新開啟這個task,在大多數情況下這個task會被放在不用的節點上。每個Hadoop叢集只有一個JobTracker,一般執行在叢集的Master節點上。
5.TaskTracker
TaskTracker與負責儲存資料的DataNode相結合,其處理結構上也遵循主/從架構。JobTracker位於主節點,統領MapReduce工作;而TaskTrackers位於從節點,獨立管理各自的task。每個TaskTracker負責獨立執行具體的task,而JobTracker負責分配task。雖然每個從節點僅有一個唯一的一個TaskTracker,但是每個TaskTracker可以產生多個java虛擬機器(JVM),用於並行處理多個map以及reduce任務。TaskTracker的一個重要職責就是與JobTracker互動。如果JobTracker無法準時地獲取TaskTracker提交的資訊,JobTracker就判定TaskTracker已經崩潰,並將任務分配給其他節點處理。