0. 大背景
全球No.1搜索引擎公司谷歌(Google)面臨每天海量搜索引擎數據的問題,經過長時間的實踐積累,
谷歌形成了自己的大數據框架,但是並沒有開源,而是發表了一篇論文,闡述了自己的思想,在論文中
提到了MapReduce的方法。這篇論文,被Doug Cutting也就是后來的Hadoop之父所關注,引起了他極大的興趣。
因為,這個時候,他正在致力於一個項目,該項目需要多任務並行處理大量的數據,他和伙伴努力了多次,結果都不理想。
於是,Doug和他的團隊決定基於Google的MapReduce的思想重新開發一個框架。
經過一段時間的努力,於 2005 年秋天作為Lucene的子項目Nutch的一部分正式引入Hadoop項目作為Apache基金會的項目。
Hadoop這個名字不是一個縮寫,而是一個虛構的名字。該項目的創建者,Doug Cutting解釋Hadoop的得名 :“這個名字是我孩子給一個棕黃色的大象玩具命名的。
學習Hadoop建議的參考書:Hadoop權威指南,目前中文版到第3版,英文版已經到Edition 4, 該書的作者Tom White是Hadoop創始團隊的核心成員,是Hadoop委員會的成員。
大牛級的人物!!
2. 生態體系概覽
經過長時間的發展,Hadoop已經形成了自己的生態體系。
有些框架是諸如一些大公司如Yahoo, Facebook團隊所開發的,下面我們來看一下它的生態圖:
從上圖可以看出,Apache Hadoop包含如下主要組件:
* HDFS and MapReduce: 這是Hadoop的核心框架(也就是Doug Cutting和他的團隊所開發的)
* HBase, Hive, Pig: 這3個框架主要負責數據存儲和查詢,分別由不同公司開發,我們后面會介紹到
* Flume, Sqoop: 負責數據的導入/導出
* Mahout: 機器學習和分析
* Zookeeper: 分布式協調
* Ambari: 集群管理
* Avro: 數據存儲和序列化
* HCatalog: 元數據管理
3. 各組件分別介紹
1)Apache HBase
由於HDFS是只能追加數據的文件系統,它不允許數據的修改。
所以,Apache HBase由此而誕生。
HBase是一個分布式的,隨機訪問的,面向列的數據庫系統。
HBase在HDFS的頂層運行,它允許應用程序開發人員直接讀寫HDFS數據。
但是,唯一的缺陷在於:HBase並不支持SQL語句。
所以,它也是NOSQL數據庫的一種。
然而,它提供了基於命令行的界面以及豐富的API函數來更新數據。
需要提到的是:HBase中的數據是以鍵值對的形式存儲在HDFS文件系統中的。
2)Apache Pig
Apache Pig由Yahoo開發,它提供了在MapReduce之上的抽象層。
它提供了一種叫做Pig Latin的被用來創建MapReduce程序的語言。
Pig Latin被程序員用來編寫程序,分析數據,通過它可以創建並行執行的任務,
從而可以更有效地利用Hadoop的分布式集群。
Pig有很多成功的大公司項目案例,如:eBay, LinkedIn, Twitter。
3)Apache Hive
Hive被用來作為大數據的數據倉庫,它也使用HDFS文件系統來存儲數據。
在Hive中我們不編寫MapReduce程序,因為Hive提供了一種類SQL語言,叫做HiveQL,
這讓開發者能夠迅速寫出類似關系型數據SQL查詢的點對點(ad-hoc)查詢。
4)Apache ZooKeeper
Hadoop通過節點(nodes)的方式提供相互間的通信。
ZooKeeper便是被用來管理這些節點的,它被用來協調各個節點。
除了管理節點以外,它還維護一些配置信息,並且對分布式系統的服務進行分組。
ZooKeeper可以獨立於Hadoop來運行,而不像生態系統中的其它組件一樣。
由於ZooKeeper是基於內存來管理信息的,因此它的性能相對來說還是挺高的。
5)Apache Mahout
Mahout是一個開源的機器學習庫,它能使Hadoop用戶高效地進行諸如數據分析,數據挖掘以及集群等一些列操作。
Mahout對於大數據集特別高效,它提供的算法經過性能優化能夠在HDFS文件系統上高效地運行MapReduce框架。
6)Apache HCatalog
HCatalog在Hadoop的頂層提供元數據的管理服務。
所有運行在Hadoop之上的軟件能夠使用HCatalog在HDFS文件系統中存儲它們的計划(schema)。
HCatalog以REST API的方式使第三方的軟件能夠創建,編輯和暴露表格的定義以及生成的元數據。
因此,我們通過HCatalog並不需要知道數據的物理位置在那里。
HCatalog提供了數據定義語句(DDL),通過它們MapReduce, Pig, Hive等的工作任務將以隊列的形式等待執行,如有需要
還可以監控它們各自的進度。
7)Apache Ambari
Ambari被用來監控Hadoop集群。
它提供了一些列特性,諸如:安裝向導,系統警告,集群管理,任務性能等。
Ambari也提供了RESTful的API以便與其他軟件進行整合。
8)Apache Avro
如何用過其它編程語言來有效地組織Hadoop的大數據,Avro便是為了這個目的而生。
Avro提供了各個節點上的數據的壓縮以及存儲。
基於Avro的數據存儲能夠輕松地被很多腳本語言諸如Python,或者非腳本語言如Java來讀取。
另外,Avro還可被用來MapReduce框架中數據的序列化。
9)Apache Sqoop
Sqoop被用來在Hadoop中高效地加載大數據集,例如它允許開發人員輕松地從一些數據源,如:
關系型數據庫,企業級數據倉庫,甚至應用程序導入/導出數據數據。
10)Apache Flume
Flume常被用來進行日志的聚合操作,它被用來作為ETL(Extract-Transform-Load) - 解轉加(解壓-轉換-加載)工具來使用。
好了,Hadoop生態體系以及它們的主要組件就大致介紹到這里了!