前言
說(shuō)起Hadoop,知道它是一個(gè)開源的、可運(yùn)行于大規(guī)模集群上的分布式計(jì)算平臺(tái),實(shí)現(xiàn)了MapReduce計(jì)算模型和分布式文件系統(tǒng)HDFS等功能;但對(duì)Hadoop整個(gè)的生態(tài)不夠了解,本著愛學(xué)習(xí)的態(tài)度,一塊來(lái)探探hadoop的生態(tài)圈。
關(guān)于Hadoop
日常生活中我們一看到大數(shù)據(jù)和大數(shù)據(jù)相關(guān)的信息就會(huì)想到了hadoop,但要說(shuō)具體點(diǎn),又不知從何說(shuō)起。
hadoop是基于Java開發(fā)的,所以在跨平臺(tái)上有很大的優(yōu)勢(shì),并且可以部署在廉價(jià)的計(jì)算機(jī)集群中,所以導(dǎo)致hadoop的火熱程度。hadoop的核心是HDFS和MapReduce,HDFS是針對(duì)谷歌文件系統(tǒng)(GFS)的開源實(shí)現(xiàn),具有較高的讀寫速度、容錯(cuò)性、可伸縮性,采用MapReduce的整合,可以在不了解分布式系統(tǒng)底層細(xì)節(jié)的情況下開發(fā)。這樣就可以輕松的完成海量數(shù)據(jù)的存儲(chǔ)和計(jì)算。
Hadoop的特性
-
高可靠:采用冗余數(shù)據(jù)存儲(chǔ)方式,這個(gè)即使一個(gè)副本發(fā)生故障,還有其它的副本保證正常對(duì)外服務(wù)。 -
高效:采用了分布式存儲(chǔ)和分布式處理兩大核心,能夠很高效的處理大量的數(shù)據(jù)。 -
高可擴(kuò)展:前面說(shuō)了部署在廉價(jià)的計(jì)算機(jī)集群上,擴(kuò)展起來(lái)很方便。 -
成本低:參考高可擴(kuò)展。 -
高容錯(cuò):參考高可靠,能夠自動(dòng)將失敗任務(wù)重新分配。 -
平臺(tái):運(yùn)行在Linux上,基于java開發(fā)的hadoop跨平臺(tái)優(yōu)勢(shì)可以很好完成。 - 支持多種語(yǔ)言編程
Hadoop生態(tài)系統(tǒng)
hadoop除了HDFS和MapReduce外,還還包括了其它很多的功能組件。例如:經(jīng)常聽到的zookeeper、hbase、hive、pig、mahout、sqoop、flume、ambari等功能組件。

下面對(duì)各個(gè)組件做一個(gè)簡(jiǎn)單的概述,比較常用的著重描述。
-
Ambari:一種基于web的工具,就作用來(lái)說(shuō),就是創(chuàng)建、管理、監(jiān)視Hadoop生態(tài)圈的集群;就是為了讓 Hadoop 以及相關(guān)的大數(shù)據(jù)軟件更容易使用的一個(gè)工具。
Ambari的Dashboard頁(yè)面 -
Zookeeper:為分布式系統(tǒng)提供一致性協(xié)同服務(wù),像配置服務(wù)、命名服務(wù)、分布式同步等,前面服務(wù)發(fā)現(xiàn)這篇文章中也講到了為什么Zookeeper不適合做發(fā)現(xiàn)服務(wù),感興趣的可以去了解下,還有消息中間件里面也講到了Kafka使用Zookeeper來(lái)維護(hù)集群信息。
下面講講Zookeeper特性-
最終一致性:最重要的性能,client不論連接到哪個(gè)server,展示都是同一個(gè)視圖。 -
可靠性:具有簡(jiǎn)單、健壯、良好性能,如果消息被一臺(tái)server接受,它將被所有server接受。 -
實(shí)時(shí)性:保證client在一個(gè)時(shí)間間隔范圍內(nèi)獲得server的更新信息/失效信息,但存在網(wǎng)絡(luò)延時(shí)等原因,不能保證所有client同時(shí)得到,應(yīng)該在讀數(shù)據(jù)之前調(diào)用sync接口同步。 -
等待無(wú)關(guān):互不相關(guān),慢的或者失效的client不得干涉快的client的請(qǐng)求。 -
原子性:只有成功或者失敗,沒有中間狀態(tài)。 -
順序性:從同一客戶端發(fā)起的事務(wù)請(qǐng)求,都會(huì)最終被嚴(yán)格的按照其發(fā)送順序被應(yīng)用到zk中,包括全局有序和偏序兩種,全局有序好理解,就是所有的server的發(fā)布消息順序一樣;偏序存在無(wú)法比較的現(xiàn)象,如果一個(gè)消息B在消息A后被同一個(gè)發(fā)布者發(fā)布,A必將排在B前面。
Zookeeper的核心是原子廣播,這個(gè)機(jī)制保證了各個(gè)server之間的同步,leader崩潰,由server發(fā)起選舉。
典型的應(yīng)用場(chǎng)景(配置文件管理、集群管理、同步鎖、leader選舉、隊(duì)列管理等)
最典型集群模式: Master/Slave 模式(主備模式),Master負(fù)責(zé)寫,Slave負(fù)責(zé)讀,但Zookeeper沒有使這種模式,采用了三種角色。
Zookeeper中三種角色
-
領(lǐng)導(dǎo)者(leader):負(fù)責(zé)進(jìn)行發(fā)起投票和決議,更新系統(tǒng)狀態(tài)。 -
學(xué)習(xí)者:分為跟隨著(follower)和觀察者(observer),前者用于接收客戶請(qǐng)求并向客戶端返回結(jié)果,參與投票;后者接收客戶端寫請(qǐng)求,轉(zhuǎn)發(fā)給領(lǐng)導(dǎo)者,不參與投票,只同步領(lǐng)導(dǎo)者的狀態(tài)。 -
客戶端:請(qǐng)求發(fā)起方。
zookeeper
-
-
Hbase:一個(gè)實(shí)時(shí)讀寫、分布式的列式數(shù)據(jù)庫(kù),主要是為了彌補(bǔ)Hadoop對(duì)實(shí)時(shí)操作的缺陷。和傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)有一個(gè)很重要的區(qū)別是,一個(gè)是基于行,一個(gè)是基于列??梢哉f(shuō)它是鍵值存儲(chǔ),也可以說(shuō)它是多時(shí)間版本映射的數(shù)據(jù)庫(kù)。
四個(gè)描述-
行鍵(rowkey):可以理解它為唯一ID,唯一標(biāo)識(shí),Hbase是不允許跨行的事務(wù),所有rowkey和列族的設(shè)計(jì)就尤為重要和取巧。 -
列族/列鍵(column family):一個(gè)表中必須至少有一個(gè)列族,列族是由多個(gè)列組成的,列族是能影響數(shù)據(jù)存儲(chǔ)的物理特性。 -
列限定符(column key):可以理解為列。列族里的數(shù)據(jù)是通過(guò)列限定符來(lái)定位。列限定符不需要事前定義,這也是和關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別,支持任意擴(kuò)展。 -
時(shí)間戳(timestamp):可以理解為行鍵、列族、列限定符組成了一個(gè)單元(cell),cell是有時(shí)間版本,用時(shí)間戳標(biāo)識(shí),默認(rèn)是3個(gè)。
-
Hive:sql轉(zhuǎn)換MapReduce程序語(yǔ)言,可以減少M(fèi)apReduce jobs編寫工作,Hive提供了類似sql語(yǔ)言的查詢語(yǔ)言-Hive QL,可以通過(guò)Hive QL語(yǔ)句快速實(shí)現(xiàn)簡(jiǎn)單的MapReduce統(tǒng)計(jì),十分適合做數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析。Pig:在MapReduce上創(chuàng)建了更簡(jiǎn)單的過(guò)程語(yǔ)言抽象,提供了一種更接近結(jié)構(gòu)化查詢語(yǔ)言(SQL)的接口,可以理解為Pig最大的作用就是對(duì)MapReduce算法(框架)實(shí)現(xiàn)了一套shell腳本 ,稱之為:Pig Latin。Mahout:用于機(jī)器學(xué)習(xí)的一個(gè)框架,旨在幫助更方便快捷創(chuàng)建智能應(yīng)用程序,包含許多實(shí)現(xiàn),聚類、分類、推薦過(guò)濾、頻繁子項(xiàng)挖掘等。MapReduce:一種離線計(jì)算框架,用于大規(guī)模數(shù)據(jù)集的平行運(yùn)算,將并行計(jì)算過(guò)程高度抽象到了兩個(gè)函數(shù),Map和Reduce;這樣就可以在不了解分布式系統(tǒng)底層細(xì)節(jié)的情況下進(jìn)行平行應(yīng)用開發(fā),核心思想是:“分而治之”,把輸入的數(shù)據(jù)集切分為若干獨(dú)立的數(shù)據(jù)庫(kù),分發(fā)給各個(gè)分節(jié)點(diǎn)共同平行完成,最后聚合結(jié)果得到最終結(jié)果。YARN:調(diào)度系統(tǒng),資源管理器,最初是為了修復(fù)MapReduce實(shí)現(xiàn)的不足,因?yàn)镸apReduce是采用了Master/Slave 模式,一個(gè)JobTracker負(fù)責(zé)作業(yè)調(diào)度和資源管理,多個(gè)TaskTracker負(fù)責(zé)執(zhí)行被指派的具體任務(wù),所以會(huì)存在單點(diǎn)故障、任務(wù)過(guò)重、內(nèi)存溢出、資源劃分不合理等缺陷。HDFS:Hadoop分布式文件系統(tǒng),是針對(duì)谷歌文件系統(tǒng)GFS的開源實(shí)現(xiàn),具有處理超大數(shù)據(jù)、流式處理、可以運(yùn)行在廉價(jià)商用服務(wù)器上等有點(diǎn)。Flume:分布式的海量日志采集,聚合和傳輸?shù)南到y(tǒng),F(xiàn)lume具有高可用,分布式,配置工具,其設(shè)計(jì)的原理也是基于將數(shù)據(jù)流,如日志數(shù)據(jù)從各種網(wǎng)站服務(wù)器上匯集起來(lái)存儲(chǔ)到HDFS,HBase等集中存儲(chǔ)器中。Sqoop:SQL-to-Hadoop的縮寫,主要用來(lái)在Hadoop和關(guān)系數(shù)據(jù)庫(kù)之間交換數(shù)據(jù),通過(guò)Sqoop可以方便的將數(shù)據(jù)從關(guān)系數(shù)據(jù)庫(kù)中導(dǎo)入Hadoop,或者將數(shù)據(jù)從Hadoop導(dǎo)出到關(guān)系數(shù)據(jù)庫(kù),Sqoop主要通過(guò)JDBC和關(guān)系數(shù)據(jù)庫(kù)進(jìn)行交互。
附加幾個(gè)其它的功能組件
Storm:Storm是Twitter開源的分布式實(shí)時(shí)大數(shù)據(jù)處理框架,流計(jì)算平臺(tái),優(yōu)點(diǎn)是無(wú)延遲,缺點(diǎn)是不夠靈活,想要統(tǒng)計(jì)的東西必須預(yù)知道;要達(dá)到更新實(shí)時(shí),在數(shù)據(jù)流進(jìn)來(lái)的時(shí)候就開始處理,比如廣告點(diǎn)擊計(jì)算,它的實(shí)時(shí)性要遠(yuǎn)遠(yuǎn)好于MapReduce計(jì)算框架。Spark:MapReduce計(jì)算框架不適合迭代計(jì)算和交互計(jì)算,MapReduce是一種磁盤計(jì)算框架,而Spark則是一種內(nèi)存計(jì)算框架,它將數(shù)據(jù)盡可能放到內(nèi)存中提高迭代應(yīng)用和交互式應(yīng)用的計(jì)算效率。Pregel:Pregel是Google提出的大規(guī)模分布式圖計(jì)算平臺(tái),專門用來(lái)解決網(wǎng)頁(yè)鏈接分析、社交數(shù)據(jù)挖掘等實(shí)際應(yīng)用中涉及的大規(guī)模分布式圖計(jì)算問(wèn)題,Pregel作為分布式圖計(jì)算的計(jì)算框架,主要用于圖遍歷、最短路徑、PageRank計(jì)算等。
針對(duì)Hadoop的改進(jìn)和提升
Hadoop框架自身的改進(jìn),從1.0到2.0
| 組件 | Hadoop1.0的問(wèn)題 | Hadoop2.0的改進(jìn) |
|---|---|---|
| HDFS | 單一名稱節(jié)點(diǎn),存在單點(diǎn)失效問(wèn)題 | 設(shè)計(jì)了HDFS HA,提供名稱節(jié)點(diǎn)熱備份機(jī)制 |
| 單一命名空間,無(wú)法實(shí)現(xiàn)資源隔離 | 設(shè)計(jì)了HDFS聯(lián)邦,管理多個(gè)命名空間 | |
| MapReduce | 資源管理效率底 | 設(shè)計(jì)了新的資源管理框架YARN |
不斷完善的Hadoop生態(tài)系統(tǒng)
| 組件 | 功能 | 解決Hadoop中存在的問(wèn)題 |
|---|---|---|
| Pig | 處理大規(guī)模數(shù)據(jù)的腳本語(yǔ)言,用戶只要編寫幾條簡(jiǎn)單的語(yǔ)句,系統(tǒng)會(huì)自動(dòng)轉(zhuǎn)換為MapReduce作業(yè) | 抽象層次低,需要手工編寫大量代碼 |
| Oozie | 工作流和協(xié)作服務(wù)引擎,協(xié)調(diào)Hadoop上運(yùn)行的不同任務(wù) | 沒有提供作業(yè)依賴關(guān)系管理機(jī)制,需要用戶自己處理作業(yè)之間的依賴關(guān)系 |
| Tez | 支持DAG作業(yè)的計(jì)算框架,對(duì)作業(yè)的操作進(jìn)行重新分解和組合,形成一個(gè)搭的DAG作業(yè),減少不必要操作 | 不同的MapReduce任務(wù)之間存在重復(fù)操作,降低了效率 |
| Kafka | 分布式發(fā)布訂閱消息系統(tǒng),不同類型的分布式系統(tǒng)可以統(tǒng)一接入到Kafka,實(shí)現(xiàn)和Hadoop各個(gè)組件之間的不同類型數(shù)據(jù)的實(shí)時(shí)高效交換 | Hadoop生態(tài)系統(tǒng)中各個(gè)組件和其它產(chǎn)品之間缺乏統(tǒng)一的、高效的數(shù)據(jù)交換中介 |
結(jié)語(yǔ)
這里主要是對(duì)Hadoop生態(tài)系統(tǒng)的一些功能組件做一個(gè)簡(jiǎn)單的歸類描述,不涉及到具體的實(shí)現(xiàn)。
感興趣的可以看看個(gè)別組件功能的詳細(xì)實(shí)戰(zhàn)。
淺談Hbase與中間的一些設(shè)計(jì)策略
個(gè)人博客~
簡(jiǎn)書~

