轉自:https://www.jianshu.com/p/9918fb395d1e
- hadoop誕生記
- hadoop生態圈
- 常見組件簡介
- 組件下載
- 學習路線
一、hadoop誕生記
最早Doug Cutting(后面被稱為hadoop之父)領導創立了Apache的項目Lucene,然后Lucene又衍生出子項目Nutch,Nutch又衍生了子項目Hadoop。Lucene是一個功能全面的文本搜索和查詢庫,Nutch目標就是要試圖以Lucene為核心建立一個完整的搜索引擎,並且能達到提到Google商業搜索引擎的目標。網絡搜索引擎和基本文檔搜索區別就在規模上,Lucene目標是索引數百萬文檔,而Nutch應該能處理數十億的網頁。因此Nutch就面臨了一個極大的挑戰,即在Nutch中建立一個層,來負責分布式處理、冗余、故障恢復及負載均衡等等一系列問題。
曙光的到來,2004年,Google發表了兩篇論文來論述Google文件系統(GFS)和MapReduce框架,並且使用了這兩項技術來拓展自己的搜索系統,於是Doug Cutting看到了這兩篇論文的價值並帶領他的團隊便實現了這個框架,並將Nutch移植上去,於是Nutch的可擴展性得到極大的提高。這個新的框架就是最初的hadoop。2005年,Hadoop作為Lucene的子項目Nutch的一部分正式引入Apache基金會。
在2006年1月,雅虎雇佣Doug Cutting,並讓他和一個專門的團隊來一起改進Hadoop,並將其作為一個開源項目繼續發展。
二、hadoop生態圈
我們通常說到的hadoop包括兩部分,一是Hadoop核心技術(或者說狹義上的hadoop),對應為apache開源社區的一個項目,主要包括三部分內容:hdfs,mapreduce,yarn。其中hdfs用來存儲海量數據,mapreduce用來對海量數據進行計算,yarn是一個通用的資源調度框架(是在hadoop2.0中產生的)。
另一部分指廣義的,廣義上指一個生態圈,泛指大數據技術相關的開源組件或產品,如hbase、hive、spark、pig、zookeeper、kafka、flume、phoenix、sqoop等。
生態圈中的這些組件或產品相互之間會有依賴,但又各自獨立。比如habse和kafka會依賴zookeeper,hive會依賴mapreduce。
下面圖給出了Hadoop技術生態圈的一個大致組件分布圖:
需要說明的是,上圖並沒有包括當前生態圈中的所有組件。而且hadoop生態圈技術在不斷的發展,會不斷有新的組件出現,一些老的組件也可能被新的組件替代。需要持續關注Hadoop開源社區的技術發展才能跟得上變化。
三、常見組件簡介
(一)Hdfs
Hdfs是一種分布式文件系統,是Hadoop體系中數據存儲管理的基礎。它是一個高度容錯的系統,能檢測和應對硬件故障,用於在低成本的通用硬件上運行。Hdfs簡化了文件的一致性模型,通過流式數據訪問,提供高吞吐量應用程序數據訪問功能,適合帶有大型數據集的應用程序。
(二)Mapreduce
MapReduce分為第一代(稱為 MapReduce 1.0或者MRv1,對應hadoop第1代)和第二代(稱為MapReduce 2.0或者MRv2,對應hadoop第2代)。第一代MapReduce計算框架,它由兩部分組成:編程模型(programming model)和運行時環境(runtime environment)。它的基本編程模型是將問題抽象成Map和Reduce兩個階段,其中Map階段將輸入數據解析成key/value,迭代調用map()函數處理后,再以key/value的形式輸出到本地目錄,而Reduce階段則將key相同的value進行規約處理,並將最終結果寫到HDFS上。它的運行時環境由兩類服務組成:JobTracker和TaskTracker,其中,JobTracker負責資源管理和所有作業的控制,而TaskTracker負責接收來自JobTracker的命令並執行它。
MapReduce 2.0或者MRv2具有與MRv1相同的編程模型,唯一不同的是運行時環境。MRv2是在MRv1基礎上經加工之后,運行於資源管理框架YARN之上的MRv1,它不再由JobTracker和TaskTracker組成,而是變為一個作業控制進程ApplicationMaster,且ApplicationMaster僅負責一個作業的管理,至於資源的管理,則由YARN完成。
總結下,MRv1是一個獨立的離線計算框架,而MRv2則是運行於YARN之上的MRv1。
(三)Hive
Hive是一種基於Hadoop的數據倉庫,由facebook開源,最初用於解決海量結構化的日志數據統計問題。Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉化為MapReduce任務在Hadoop上執行。通常用於離線分析。
(四)Hbase
HBase是Google Bigtable的克隆版。它是一個針對結構化數據的可伸縮、高可靠、高性能、分布式和面向列的動態模式數據庫。和傳統關系數據庫不同,HBase采用了BigTable的數據模型:增強的稀疏排序映射表(Key/Value),其中,鍵由行關鍵字、列關鍵字和時間戳構成。HBase提供了對大規模數據的隨機、實時讀寫訪問,同時,HBase中保存的數據可以使用MapReduce來處理,它將數據存儲和並行計算完美地結合在一起。
(五)Zookeeper
ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。ZooKeeper包含一個簡單的原語集,提供Java和C的接口。
(六)Sqoop
Sqoop是一款開源的工具,主要用於在Hadoop和傳統的數據庫(mysql、postgresql等)進行數據的傳遞,可以將一個關系型數據庫(例如:MySQL、Oracle、Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關系型數據庫中。
Sqoop分為一代(稱為Sqoop1)和二代(稱為Sqoop2),其中Sqoop1的架構,僅僅使用一個Sqoop客戶端,Sqoop2的架構,引入了Sqoop server集中化管理connector,以及rest api,web,UI,並引入權限安全機制。
(七)Pig
Apache Pig是MapReduce的一個抽象。它是一個工具/平台,用於分析較大的數據集,並將它們表示為數據流。Pig通常與 Hadoop 一起使用;我們可以使用Apache Pig在Hadoop中執行所有的數據處理操作。要編寫數據分析程序,Pig提供了一種稱為 Pig Latin 的高級語言。該語言提供了各種操作符,程序員可以利用它們開發自己的用於讀取,寫入和處理數據的功能。
要使用 Apache Pig 分析數據,程序員需要使用Pig Latin語言編寫腳本。所有這些腳本都在內部轉換為Map和Reduce任務。Apache Pig有一個名為 Pig Engine 的組件,它接受Pig Latin腳本作為輸入,並將這些腳本轉換為MapReduce作業。
所以使用PIG,可以讓不太擅長編寫Java程序的程序員來進行大數據分析處理。
(八)Mahout
Mahout起源於2008年,最初是Apache Lucent的子項目,它在極短的時間內取得了長足的發展,現在是Apache的頂級項目。
Mahout的主要目標是創建一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。Mahout現在已經包含了聚類、分類、推薦引擎(協同過濾)和頻繁集挖掘等廣泛使用的數據挖掘方法。除了算法,Mahout還包含數據的輸入/輸出工具、與其他存儲系統(如數據庫、MongoDB 或Cassandra)集成等數據挖掘支持架構。
(九)Flume
Flume是Cloudera(一個知名的基於開源hadoop的大數據發行商)設計開發的一個開源的日志收集工具, 具有分布式、高可靠、高容錯、易於定制和擴展的特點。它將數據從產生、傳輸、處理並最終寫入目標的路徑的過程抽象為數據流,在具體的數據流中,數據源支持在Flume中定制數據發送方,從而支持收集各種不同協議數據。同時,Flume數據流提供對日志數據進行簡單處理的能力,如過濾、格式轉換等。此外,Flume還具有能夠將日志寫往各種數據目標(可定制)的能力。總的來說,Flume是一個可擴展、適合復雜環境的海量日志收集系統。
(十)Spark
Spark是一個通用計算引擎,能對大規模數據進行快速分析,可用它來完成各種各樣的運算,包括 SQL 查詢、文本處理、機器學習等,而在 Spark 出現之前,我們一般需要學習各種各樣的引擎來分別處理這些需求。Spark不依賴於MapReduce,它使用了自己的數據處理框架。Spark使用內存進行計算,速度更快。Spark本身就是一個生態系統,除了核心API之外,Spark生態系統中還包括其他附加庫,可以在大數據分析和機器學習領域提供更多的能力,如Spark SQL,Spark Streaming,Spark MLlib,Spark GraphX,BlinkDB,Tachyon等。
(十一)Storm
Storm是Twitter開源的分布式實時大數據處理框架,最早開源於github,從0.9.1版本之后,歸於Apache社區,被業界稱為實時版Hadoop。它與Spark Streaming的最大區別在於它是逐個處理流式數據事件,而Spark Streaming是微批次處理,因此,它比Spark Streaming更實時。
(十二)Impala
Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數據。已有的Hive系統雖然也提供了SQL語義,但由於Hive底層執行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最大特點也是最大賣點就是它的快速。
另外Impala可以Hive結合使用,它可以直接使用Hive的元數據庫Metadata。
(十三)Kafka
Kafka是一種分布式的,基於發布/訂閱的消息系統,類似於消息對列的功能,可以接收生產者(如webservice、文件、hdfs、hbase等)的數據,本身可以緩存起來,然后可以發送給消費者(同上),起到緩沖和適配的作。
(十四)Yarn
Yarn是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,可為上層應用提供統一的資源管理和調度。它將資源管理和處理組件分開,它的引入為集群在利用率、資源統一管理和數據共享等方面帶來了巨大好處。可以把它理解為大數據集群的操作系統。可以在上面運行各種計算框架(包括MapReduce、Spark、Storm、MPI等)。
(十五)Hue
Hue是一個開源的Apache Hadoop UI系統,通過使用Hue我們可以在瀏覽器端的Web控制台上與Hadoop集群進行交互來分析處理數據,例如操作HDFS上的數據,運行MapReduce Job等等。
(十六)Oozie
在Hadoop中執行的任務有時候需要把多個Map/Reduce作業連接到一起,這樣才能夠達到目的。Oozie讓我們可以把多個Map/Reduce作業組合到一個邏輯工作單元中,從而完成更大型的任務。wuOozie是一種Java Web應用程序,它運行在Java servlet容器中,並使用數據庫來存儲相關信息。
(十七)Ambari
Ambari是一個開源的大數據集群管理系統,可以用來就是創建、管理、監視 Hadoop 的集群,並提供WEB可視化的界面來讓用戶進行管理。
四、組件下載
我們可以有兩種途徑獲取相關的大數據開源組件,一種是直接獲取apache提供的原始組件。另外一種是從一些知名的大數據發行商(如cloudera,簡稱CDH)獲取。
這兩種方式各有優劣,從apache獲取原始組件,好處是可以及時追蹤最新的版本和補丁。從發行商獲取的組件,是經過發行商測試、甚至改進的,可能會更加穩定。如果只是自己學習使用,從哪獲取沒啥區別了。有一點需要注意的是,各個組件都有各自獨立的版本規划和演進,之間存在相互依賴的問題,需要考慮彼此間的版本匹配問題。
我們下面舉例如何從apache上獲取原生組件:
Hadoop生態圈的各種組件和產品都在apache上。我們可以到apache官網上(https://www.apache.org)上去下載,一般會鏈接到相關的鏡像站點上。比如我們進入如下的頁面,會看到大量的組件目錄列表,下圖是截圖的一部分:
上圖中每行都代表了apache下的一個開源軟件,按字母順序排列的,我們可以看到有hadoop,hbase,hive,impala這幾個大數據的組件。我們以hadoop為例來繼續,點擊上面列表中的hadoop目錄,會出現如下的界面:
出現了三個目錄節點,其中最后ozone是新一代的一個分布式存儲組件,我們暫時不管。上面的common和core目錄的內容是一樣的。我們再點擊common目錄,會出現如下界面:
上面每個目錄對應的是hadoop的一個版本,我們選擇自己需要的版本,比如我們點擊hadoop-2.7.6目錄,會出現如下界面:
上面有兩個目錄,名稱中含src的表示是源代碼,如果下載源代碼,需要自己編譯打包。我們直接下載編譯打包好的,這樣下載后直接部署即可,對應上面的就是hadoop-2.7.6.tar.gz目錄。
下載到本地解壓后,我們會看到如下的目錄結構:
上面是hadoop下載包中的內容,其中包含了Hdfs,mapreduce,yarn這三個核心部件。我們可以進行相關的配置,然后運行相關的腳本,就可以啟動hdfs,yarn服務。
五、學習路線
(一)、預備知識
1、 linux基礎
因為hadoop一般都是在linux下運行,我們要在linux進行大數據環境的安裝和配置,肯定需要對linux有所熟悉。另外很多組件在設計上也參考了linux的一些特點,比如hdfs的文件目錄樹也是類似Linux的目錄結構,相關的文件操作命令也是類似linux的文件命令。熟悉linux的相關操作對更好的理解相關組件也是很有幫助的。
2、 java等編程語言
這個可以從兩個角度來看,一是各個大數據組件都是由某種編程語言開發出來的,比如hdfs,hbase,hive等是用java語言開發出來的;比如spark,kafka等是用scala語言開發出來的;比如impla是用c++語言開發出來的。這些大數據組件作為開源產品,如果我們要深入學習和了解的話,就需要去閱讀源碼,甚至可以發現源碼中的問題和可以補充的功能,往開源社區提交代碼,作開源貢獻。
目前來說JAVA語言是各大數據組件使用最多的編程語言,但如上面所列的也有組件使用非JAVA的編程語言,而且相信隨着大數據技術的發展,越來越多的編程語言會被用到。作為大數據技術的學習者,我們可能要學習多門編程語言,以便與熟悉更多的大數據組件技術。
另外一個層面是,每個開源組件都提供了對外的API,以讓程序員可以編寫代碼來使用這些開源組件,有些開源組件除了提供與本身開發語言相同的API外,甚至提供了其它編程語言的API。我們要使用這些組件,肯定要使用到某種或某幾種API,這樣必須要熟悉所使用的API對應的編程語言。
3、 關系數據庫與sql語句
很多大數據分析和處理組件,如hive ,spark,impala等都提供了類似關系數據庫sql的操作數據的機制。如果對關系數據庫及sql已經很熟悉,則對掌握這些組件提供的類sql功能有非常大的幫助。
(二)、環境准備
hadoop各種組件一般都是運行在linux系統上,部分組件也可以在windows下運行。我們最好是准備一個linux的環境來學習。獲取Linux環境方式很多,如:
1、 在一台機器上安裝Linux操作系統 或 windows和Linux雙操作系統
2、 可以在windows或linux操作系統的機器上安裝虛擬機軟件(如virualbox,vmware等),然后創建linux操作系統的虛擬機
3、 可以直接在網上(如阿里、騰訊等)租賃一台Linux主機
因為hadoop核心組件和很多組件都是基於Jvm運行的,所以機器上一定要安裝java運行環境。建議安裝java1.8版本。
(三)、分階段學習
1、先從單個組件學習
一般是先從hadoop核心組件HDFS,maperduce開始學習,然后再逐步學習其它組件。
2、單個組件的基礎學習
先掌握單個組件(以及依賴組件)的安裝和運行,開始可以先是單機安裝,hadoop生態圈的各個組件基本都支持在一台機器上進行安裝和運行,以便於簡化開發階段的環境准備。而在應用上線后,往往是集群方式安裝和運行。
同時要理解組件的基本架構和原理,對組件有一個整體層面的了解。
另外站在使用者角度(如開發者角度)去學習組件的使用,比如對於hdfs,知道如何通過命令行方式使用hdfs提供的命令進行文件的操作,如何通過組件提供的api(如java api)來編寫程序進行操作。
3、對單個組件進行深入學習,包括但不限於如下方面:
1)深入了解組件的原理和架構
2)了解組件分布式部署的配置和性能調優
3)閱讀組件的源代碼,理解其實現機制
4)發現組件源代碼中的問題和不足,向開源社區提交issue,為開源社區做貢獻
4、針對業務場景給出大數據的解決方案
比如利用哪些組件配合來解決對應的業務問題,集群如何配置等。
作者:我是老薛
鏈接:https://www.jianshu.com/p/9918fb395d1e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
