本文對hadoop生態(tài)圈技術做一個概要的介紹,文章中的前半部分的信息大多來自于網(wǎng)絡赐写,這里只是按照自己的學習思路整理了下。包括如下內(nèi)容:
- hadoop誕生記
- hadoop生態(tài)圈
- 常見組件簡介
- 組件下載
- 學習路線
一、hadoop誕生記
最早Doug Cutting(后面被稱為hadoop之父)領導創(chuàng)立了Apache的項目Lucene,然后Lucene又衍生出子項目Nutch拖云,Nutch又衍生了子項目Hadoop。Lucene是一個功能全面的文本搜索和查詢庫应又,Nutch目標就是要試圖以Lucene為核心建立一個完整的搜索引擎宙项,并且能達到提到Google商業(yè)搜索引擎的目標。網(wǎng)絡搜索引擎和基本文檔搜索區(qū)別就在規(guī)模上株扛,Lucene目標是索引數(shù)百萬文檔尤筐,而Nutch應該能處理數(shù)十億的網(wǎng)頁。因此Nutch就面臨了一個極大的挑戰(zhàn)洞就,即在Nutch中建立一個層盆繁,來負責分布式處理、冗余旬蟋、故障恢復及負載均衡等等一系列問題油昂。
曙光的到來,2004年倾贰,Google發(fā)表了兩篇論文來論述Google文件系統(tǒng)(GFS)和MapReduce框架冕碟,并且使用了這兩項技術來拓展自己的搜索系統(tǒng),于是Doug Cutting看到了這兩篇論文的價值并帶領他的團隊便實現(xiàn)了這個框架匆浙,并將Nutch移植上去鸣哀,于是Nutch的可擴展性得到極大的提高。這個新的框架就是最初的hadoop吞彤。2005年我衬,Hadoop作為Lucene的子項目Nutch的一部分正式引入Apache基金會。
在2006年1月饰恕,雅虎雇傭Doug Cutting挠羔,并讓他和一個專門的團隊來一起改進Hadoop,并將其作為一個開源項目繼續(xù)發(fā)展埋嵌。
二破加、hadoop生態(tài)圈
我們通常說到的hadoop包括兩部分,一是Hadoop核心技術(或者說狹義上的hadoop)雹嗦,對應為apache開源社區(qū)的一個項目范舀,主要包括三部分內(nèi)容:hdfs,mapreduce了罪,yarn锭环。其中hdfs用來存儲海量數(shù)據(jù),mapreduce用來對海量數(shù)據(jù)進行計算泊藕,yarn是一個通用的資源調(diào)度框架(是在hadoop2.0中產(chǎn)生的)辅辩。
另一部分指廣義的,廣義上指一個生態(tài)圈,泛指大數(shù)據(jù)技術相關的開源組件或產(chǎn)品玫锋,如hbase蛾茉、hive、spark撩鹿、pig谦炬、zookeeper、kafka节沦、flume吧寺、phoenix、sqoop等散劫。
生態(tài)圈中的這些組件或產(chǎn)品相互之間會有依賴稚机,但又各自獨立。比如habse和kafka會依賴zookeeper获搏,hive會依賴mapreduce赖条。
下面圖給出了Hadoop技術生態(tài)圈的一個大致組件分布圖:
需要說明的是,上圖并沒有包括當前生態(tài)圈中的所有組件常熙。而且hadoop生態(tài)圈技術在不斷的發(fā)展纬乍,會不斷有新的組件出現(xiàn),一些老的組件也可能被新的組件替代裸卫。需要持續(xù)關注Hadoop開源社區(qū)的技術發(fā)展才能跟得上變化仿贬。
三、常見組件簡介
(一)Hdfs
Hdfs是一種分布式文件系統(tǒng)墓贿,是Hadoop體系中數(shù)據(jù)存儲管理的基礎茧泪。它是一個高度容錯的系統(tǒng),能檢測和應對硬件故障聋袋,用于在低成本的通用硬件上運行队伟。Hdfs簡化了文件的一致性模型,通過流式數(shù)據(jù)訪問幽勒,提供高吞吐量應用程序數(shù)據(jù)訪問功能嗜侮,適合帶有大型數(shù)據(jù)集的應用程序。
(二)Mapreduce
MapReduce分為第一代(稱為 MapReduce 1.0或者MRv1啥容,對應hadoop第1代)和第二代(稱為MapReduce 2.0或者MRv2锈颗,對應hadoop第2代)。第一代MapReduce計算框架咪惠,它由兩部分組成:編程模型(programming model)和運行時環(huán)境(runtime environment)击吱。它的基本編程模型是將問題抽象成Map和Reduce兩個階段,其中Map階段將輸入數(shù)據(jù)解析成key/value硝逢,迭代調(diào)用map()函數(shù)處理后姨拥,再以key/value的形式輸出到本地目錄,而Reduce階段則將key相同的value進行規(guī)約處理渠鸽,并將最終結(jié)果寫到HDFS上叫乌。它的運行時環(huán)境由兩類服務組成:JobTracker和TaskTracker,其中徽缚,JobTracker負責資源管理和所有作業(yè)的控制憨奸,而TaskTracker負責接收來自JobTracker的命令并執(zhí)行它。
MapReduce 2.0或者MRv2具有與MRv1相同的編程模型凿试,唯一不同的是運行時環(huán)境排宰。MRv2是在MRv1基礎上經(jīng)加工之后,運行于資源管理框架YARN之上的MRv1那婉,它不再由JobTracker和TaskTracker組成板甘,而是變?yōu)橐粋€作業(yè)控制進程ApplicationMaster,且ApplicationMaster僅負責一個作業(yè)的管理详炬,至于資源的管理盐类,則由YARN完成。
總結(jié)下呛谜,MRv1是一個獨立的離線計算框架在跳,而MRv2則是運行于YARN之上的MRv1。
(三)Hive
Hive是一種基于Hadoop的數(shù)據(jù)倉庫隐岛,由facebook開源猫妙,最初用于解決海量結(jié)構(gòu)化的日志數(shù)據(jù)統(tǒng)計問題。Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉(zhuǎn)化為MapReduce任務在Hadoop上執(zhí)行聚凹。通常用于離線分析割坠。
(四)Hbase
HBase是Google Bigtable的克隆版。它是一個針對結(jié)構(gòu)化數(shù)據(jù)的可伸縮妒牙、高可靠韭脊、高性能、分布式和面向列的動態(tài)模式數(shù)據(jù)庫单旁。和傳統(tǒng)關系數(shù)據(jù)庫不同沪羔,HBase采用了BigTable的數(shù)據(jù)模型:增強的稀疏排序映射表(Key/Value),其中象浑,鍵由行關鍵字蔫饰、列關鍵字和時間戳構(gòu)成。HBase提供了對大規(guī)模數(shù)據(jù)的隨機愉豺、實時讀寫訪問篓吁,同時,HBase中保存的數(shù)據(jù)可以使用MapReduce來處理蚪拦,它將數(shù)據(jù)存儲和并行計算完美地結(jié)合在一起杖剪。
(五)Zookeeper
ZooKeeper是一個分布式的冻押,開放源碼的分布式應用程序協(xié)調(diào)服務,是Google的Chubby一個開源的實現(xiàn)盛嘿。它是一個為分布式應用提供一致性服務的軟件洛巢,提供的功能包括:配置維護、域名服務次兆、分布式同步稿茉、組服務等。ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務芥炭,將簡單易用的接口和性能高效漓库、功能穩(wěn)定的系統(tǒng)提供給用戶。ZooKeeper包含一個簡單的原語集园蝠,提供Java和C的接口渺蒿。
(六)Sqoop
Sqoop是一款開源的工具,主要用于在Hadoop和傳統(tǒng)的數(shù)據(jù)庫(mysql彪薛、postgresql等)進行數(shù)據(jù)的傳遞蘸嘶,可以將一個關系型數(shù)據(jù)庫(例如:MySQL、Oracle陪汽、Postgres等)中的數(shù)據(jù)導進到Hadoop的HDFS中训唱,也可以將HDFS的數(shù)據(jù)導進到關系型數(shù)據(jù)庫中。
Sqoop分為一代(稱為Sqoop1)和二代(稱為Sqoop2)挚冤,其中Sqoop1的架構(gòu)况增,僅僅使用一個Sqoop客戶端,Sqoop2的架構(gòu)训挡,引入了Sqoop server集中化管理connector澳骤,以及rest api,web澜薄,UI为肮,并引入權(quán)限安全機制。
(七)Pig
Apache Pig是MapReduce的一個抽象肤京。它是一個工具/平臺颊艳,用于分析較大的數(shù)據(jù)集,并將它們表示為數(shù)據(jù)流忘分。Pig通常與 Hadoop 一起使用棋枕;我們可以使用Apache Pig在Hadoop中執(zhí)行所有的數(shù)據(jù)處理操作。要編寫數(shù)據(jù)分析程序妒峦,Pig提供了一種稱為 Pig Latin 的高級語言重斑。該語言提供了各種操作符,程序員可以利用它們開發(fā)自己的用于讀取肯骇,寫入和處理數(shù)據(jù)的功能窥浪。
要使用 Apache Pig 分析數(shù)據(jù)祖很,程序員需要使用Pig Latin語言編寫腳本。所有這些腳本都在內(nèi)部轉(zhuǎn)換為Map和Reduce任務漾脂。Apache Pig有一個名為 Pig Engine 的組件假颇,它接受Pig Latin腳本作為輸入,并將這些腳本轉(zhuǎn)換為MapReduce作業(yè)符相。
所以使用PIG拆融,可以讓不太擅長編寫Java程序的程序員來進行大數(shù)據(jù)分析處理蠢琳。
(八)Mahout
Mahout起源于2008年啊终,最初是Apache Lucent的子項目,它在極短的時間內(nèi)取得了長足的發(fā)展傲须,現(xiàn)在是Apache的頂級項目蓝牲。
Mahout的主要目標是創(chuàng)建一些可擴展的機器學習領域經(jīng)典算法的實現(xiàn),旨在幫助開發(fā)人員更加方便快捷地創(chuàng)建智能應用程序泰讽。Mahout現(xiàn)在已經(jīng)包含了聚類例衍、分類、推薦引擎(協(xié)同過濾)和頻繁集挖掘等廣泛使用的數(shù)據(jù)挖掘方法已卸。除了算法佛玄,Mahout還包含數(shù)據(jù)的輸入/輸出工具、與其他存儲系統(tǒng)(如數(shù)據(jù)庫累澡、MongoDB 或Cassandra)集成等數(shù)據(jù)挖掘支持架構(gòu)梦抢。
(九)Flume
Flume是Cloudera(一個知名的基于開源hadoop的大數(shù)據(jù)發(fā)行商)設計開發(fā)的一個開源的日志收集工具, 具有分布式愧哟、高可靠奥吩、高容錯、易于定制和擴展的特點蕊梧。它將數(shù)據(jù)從產(chǎn)生霞赫、傳輸、處理并最終寫入目標的路徑的過程抽象為數(shù)據(jù)流肥矢,在具體的數(shù)據(jù)流中端衰,數(shù)據(jù)源支持在Flume中定制數(shù)據(jù)發(fā)送方,從而支持收集各種不同協(xié)議數(shù)據(jù)甘改。同時靴迫,F(xiàn)lume數(shù)據(jù)流提供對日志數(shù)據(jù)進行簡單處理的能力,如過濾楼誓、格式轉(zhuǎn)換等玉锌。此外,F(xiàn)lume還具有能夠?qū)⑷罩緦懲鞣N數(shù)據(jù)目標(可定制)的能力疟羹≈魇兀總的來說禀倔,F(xiàn)lume是一個可擴展、適合復雜環(huán)境的海量日志收集系統(tǒng)参淫。
(十)Spark
Spark是一個通用計算引擎救湖,能對大規(guī)模數(shù)據(jù)進行快速分析,可用它來完成各種各樣的運算涎才,包括 SQL 查詢鞋既、文本處理、機器學習等耍铜,而在 Spark 出現(xiàn)之前邑闺,我們一般需要學習各種各樣的引擎來分別處理這些需求。Spark不依賴于MapReduce棕兼,它使用了自己的數(shù)據(jù)處理框架陡舅。Spark使用內(nèi)存進行計算,速度更快伴挚。Spark本身就是一個生態(tài)系統(tǒng)靶衍,除了核心API之外,Spark生態(tài)系統(tǒng)中還包括其他附加庫茎芋,可以在大數(shù)據(jù)分析和機器學習領域提供更多的能力颅眶,如Spark SQL,Spark Streaming田弥,Spark MLlib涛酗,Spark GraphX,BlinkDB皱蹦,Tachyon等煤杀。
(十一)Storm
Storm是Twitter開源的分布式實時大數(shù)據(jù)處理框架,最早開源于github沪哺,從0.9.1版本之后沈自,歸于Apache社區(qū),被業(yè)界稱為實時版Hadoop辜妓。它與Spark Streaming的最大區(qū)別在于它是逐個處理流式數(shù)據(jù)事件枯途,而Spark Streaming是微批次處理,因此籍滴,它比Spark Streaming更實時酪夷。
(十二)Impala
Impala是Cloudera公司主導開發(fā)的新型查詢系統(tǒng),它提供SQL語義孽惰,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數(shù)據(jù)晚岭。已有的Hive系統(tǒng)雖然也提供了SQL語義,但由于Hive底層執(zhí)行使用的是MapReduce引擎勋功,仍然是一個批處理過程坦报,難以滿足查詢的交互性库说。相比之下,Impala的最大特點也是最大賣點就是它的快速片择。
另外Impala可以Hive結(jié)合使用潜的,它可以直接使用Hive的元數(shù)據(jù)庫Metadata。
(十三)Kafka
Kafka是一種分布式的字管,基于發(fā)布/訂閱的消息系統(tǒng),類似于消息對列的功能啰挪,可以接收生產(chǎn)者(如webservice、文件嘲叔、hdfs亡呵、hbase等)的數(shù)據(jù),本身可以緩存起來借跪,然后可以發(fā)送給消費者(同上)政己,起到緩沖和適配的作酌壕。
(十四)Yarn
Yarn是一種新的 Hadoop 資源管理器掏愁,它是一個通用資源管理系統(tǒng),可為上層應用提供統(tǒng)一的資源管理和調(diào)度卵牍。它將資源管理和處理組件分開果港,它的引入為集群在利用率、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來了巨大好處糊昙⌒谅樱可以把它理解為大數(shù)據(jù)集群的操作系統(tǒng)∈臀可以在上面運行各種計算框架(包括MapReduce萝衩、Spark、Storm没咙、MPI等)猩谊。
(十五)Hue
Hue是一個開源的Apache Hadoop UI系統(tǒng),通過使用Hue我們可以在瀏覽器端的Web控制臺上與Hadoop集群進行交互來分析處理數(shù)據(jù),例如操作HDFS上的數(shù)據(jù)祭刚,運行MapReduce Job等等牌捷。
(十六)Oozie
在Hadoop中執(zhí)行的任務有時候需要把多個Map/Reduce作業(yè)連接到一起,這樣才能夠達到目的涡驮。Oozie讓我們可以把多個Map/Reduce作業(yè)組合到一個邏輯工作單元中暗甥,從而完成更大型的任務。wuOozie是一種Java Web應用程序捉捅,它運行在Java servlet容器中撤防,并使用數(shù)據(jù)庫來存儲相關信息。
(十七)Ambari
Ambari是一個開源的大數(shù)據(jù)集群管理系統(tǒng)棒口,可以用來就是創(chuàng)建寄月、管理焰情、監(jiān)視 Hadoop 的集群,并提供WEB可視化的界面來讓用戶進行管理剥懒。
四内舟、組件下載
我們可以有兩種途徑獲取相關的大數(shù)據(jù)開源組件,一種是直接獲取apache提供的原始組件初橘。另外一種是從一些知名的大數(shù)據(jù)發(fā)行商(如cloudera验游,簡稱CDH)獲取。
這兩種方式各有優(yōu)劣保檐,從apache獲取原始組件耕蝉,好處是可以及時追蹤最新的版本和補丁。從發(fā)行商獲取的組件夜只,是經(jīng)過發(fā)行商測試垒在、甚至改進的,可能會更加穩(wěn)定扔亥。如果只是自己學習使用场躯,從哪獲取沒啥區(qū)別了。有一點需要注意的是旅挤,各個組件都有各自獨立的版本規(guī)劃和演進踢关,之間存在相互依賴的問題,需要考慮彼此間的版本匹配問題粘茄。
我們下面舉例如何從apache上獲取原生組件:
Hadoop生態(tài)圈的各種組件和產(chǎn)品都在apache上签舞。我們可以到apache官網(wǎng)上(https://www.apache.org)上去下載,一般會鏈接到相關的鏡像站點上柒瓣。比如我們進入如下的頁面儒搭,會看到大量的組件目錄列表,下圖是截圖的一部分:
上圖中每行都代表了apache下的一個開源軟件芙贫,按字母順序排列的搂鲫,我們可以看到有hadoop,hbase屹培,hive默穴,impala這幾個大數(shù)據(jù)的組件。我們以hadoop為例來繼續(xù)褪秀,點擊上面列表中的hadoop目錄蓄诽,會出現(xiàn)如下的界面:
出現(xiàn)了三個目錄節(jié)點,其中最后ozone是新一代的一個分布式存儲組件媒吗,我們暫時不管仑氛。上面的common和core目錄的內(nèi)容是一樣的。我們再點擊common目錄,會出現(xiàn)如下界面:
上面每個目錄對應的是hadoop的一個版本锯岖,我們選擇自己需要的版本介袜,比如我們點擊hadoop-2.7.6目錄,會出現(xiàn)如下界面:
上面有兩個目錄出吹,名稱中含src的表示是源代碼遇伞,如果下載源代碼,需要自己編譯打包捶牢。我們直接下載編譯打包好的鸠珠,這樣下載后直接部署即可,對應上面的就是hadoop-2.7.6.tar.gz目錄秋麸。
下載到本地解壓后渐排,我們會看到如下的目錄結(jié)構(gòu):
上面是hadoop下載包中的內(nèi)容,其中包含了Hdfs灸蟆,mapreduce驯耻,yarn這三個核心部件。我們可以進行相關的配置炒考,然后運行相關的腳本可缚,就可以啟動hdfs,yarn服務票腰。
五城看、學習路線
(一)女气、預備知識
1杏慰、 linux基礎
因為hadoop一般都是在linux下運行,我們要在linux進行大數(shù)據(jù)環(huán)境的安裝和配置炼鞠,肯定需要對linux有所熟悉缘滥。另外很多組件在設計上也參考了linux的一些特點,比如hdfs的文件目錄樹也是類似Linux的目錄結(jié)構(gòu)谒主,相關的文件操作命令也是類似linux的文件命令朝扼。熟悉linux的相關操作對更好的理解相關組件也是很有幫助的。
2霎肯、 java等編程語言
這個可以從兩個角度來看擎颖,一是各個大數(shù)據(jù)組件都是由某種編程語言開發(fā)出來的,比如hdfs,hbase,hive等是用java語言開發(fā)出來的观游;比如spark,kafka等是用scala語言開發(fā)出來的搂捧;比如impla是用c++語言開發(fā)出來的。這些大數(shù)據(jù)組件作為開源產(chǎn)品懂缕,如果我們要深入學習和了解的話允跑,就需要去閱讀源碼,甚至可以發(fā)現(xiàn)源碼中的問題和可以補充的功能,往開源社區(qū)提交代碼聋丝,作開源貢獻索烹。
目前來說JAVA語言是各大數(shù)據(jù)組件使用最多的編程語言,但如上面所列的也有組件使用非JAVA的編程語言弱睦,而且相信隨著大數(shù)據(jù)技術的發(fā)展百姓,越來越多的編程語言會被用到。作為大數(shù)據(jù)技術的學習者况木,我們可能要學習多門編程語言瓣戚,以便與熟悉更多的大數(shù)據(jù)組件技術。
另外一個層面是焦读,每個開源組件都提供了對外的API子库,以讓程序員可以編寫代碼來使用這些開源組件,有些開源組件除了提供與本身開發(fā)語言相同的API外矗晃,甚至提供了其它編程語言的API仑嗅。我們要使用這些組件,肯定要使用到某種或某幾種API张症,這樣必須要熟悉所使用的API對應的編程語言仓技。
3、 關系數(shù)據(jù)庫與sql語句
很多大數(shù)據(jù)分析和處理組件俗他,如hive ,spark,impala等都提供了類似關系數(shù)據(jù)庫sql的操作數(shù)據(jù)的機制脖捻。如果對關系數(shù)據(jù)庫及sql已經(jīng)很熟悉,則對掌握這些組件提供的類sql功能有非常大的幫助兆衅。
(二)地沮、環(huán)境準備
hadoop各種組件一般都是運行在linux系統(tǒng)上,部分組件也可以在windows下運行羡亩。我們最好是準備一個linux的環(huán)境來學習摩疑。獲取Linux環(huán)境方式很多,如:
1畏铆、 在一臺機器上安裝Linux操作系統(tǒng) 或 windows和Linux雙操作系統(tǒng)
2雷袋、 可以在windows或linux操作系統(tǒng)的機器上安裝虛擬機軟件(如virualbox,vmware等)辞居,然后創(chuàng)建linux操作系統(tǒng)的虛擬機
3楷怒、 可以直接在網(wǎng)上(如阿里、騰訊等)租賃一臺Linux主機
因為hadoop核心組件和很多組件都是基于Jvm運行的瓦灶,所以機器上一定要安裝java運行環(huán)境鸠删。建議安裝java1.8版本。
(三)倚搬、分階段學習
1冶共、先從單個組件學習
一般是先從hadoop核心組件HDFS,maperduce開始學習,然后再逐步學習其它組件。
2捅僵、單個組件的基礎學習
先掌握單個組件(以及依賴組件)的安裝和運行家卖,開始可以先是單機安裝,hadoop生態(tài)圈的各個組件基本都支持在一臺機器上進行安裝和運行庙楚,以便于簡化開發(fā)階段的環(huán)境準備上荡。而在應用上線后,往往是集群方式安裝和運行馒闷。
同時要理解組件的基本架構(gòu)和原理酪捡,對組件有一個整體層面的了解。
另外站在使用者角度(如開發(fā)者角度)去學習組件的使用纳账,比如對于hdfs逛薇,知道如何通過命令行方式使用hdfs提供的命令進行文件的操作,如何通過組件提供的api(如java api)來編寫程序進行操作疏虫。
3永罚、對單個組件進行深入學習,包括但不限于如下方面:
1)深入了解組件的原理和架構(gòu)
2)了解組件分布式部署的配置和性能調(diào)優(yōu)
3)閱讀組件的源代碼卧秘,理解其實現(xiàn)機制
4)發(fā)現(xiàn)組件源代碼中的問題和不足呢袱,向開源社區(qū)提交issue,為開源社區(qū)做貢獻
4翅敌、針對業(yè)務場景給出大數(shù)據(jù)的解決方案
比如利用哪些組件配合來解決對應的業(yè)務問題羞福,集群如何配置等。