提及Hadoop,知道它是一個開源的、可運行於大規模集羣上的分佈式計算平臺,實現了MapReduce計算模型和分佈式文件系統HDFS等功能;但對Hadoop整個的生態不夠了解,本着愛學習的態度,一塊來探探hadoop的生態圈。java
平常生活中咱們一看到大數據和大數據相關的信息就會想到了hadoop,但要說具體點,又不知從何提及。 hadoop是基於Java開發的,因此在跨平臺上有很大的優點,而且能夠部署在廉價的計算機集羣中,因此致使hadoop的火熱程度。hadoop的核心是HDFS和MapReduce,HDFS是針對谷歌文件系統(GFS)的開源實現,具備較高的讀寫速度、容錯性、可伸縮性,採用MapReduce的整合,能夠在不瞭解分佈式系統底層細節的狀況下開發。這樣就能夠輕鬆的完成海量數據的存儲和計算。git
高可靠:
採用冗餘數據存儲方式,這個即便一個副本發生故障,還有其它的副本保證正常對外服務。高效:
採用了分佈式存儲和分佈式處理兩大核心,可以很高效的處理大量的數據。高可擴展:
前面說了部署在廉價的計算機集羣上,擴展起來很方便。成本低:
參考高可擴展。高容錯:
參考高可靠,可以自動將失敗任務從新分配。平臺:
運行在Linux上,基於java開發的hadoop跨平臺優點能夠很好完成。hadoop除了HDFS和MapReduce外,還還包括了其它不少的功能組件。例如:常常聽到的zookeeper、hbase、hive、pig、mahout、sqoop、flume、ambari等功能組件。 github
下面對各個組件作一個簡單的概述,比較經常使用的着重描述。web
Ambari:
一種基於web的工具,就做用來講,就是建立、管理、監視Hadoop生態圈的集羣;就是爲了讓 Hadoop 以及相關的大數據軟件更容易使用的一個工具。 算法
Zookeeper:
爲分佈式系統提供一致性協同服務,像配置服務、命名服務、分佈式同步等,前面服務發現這篇文章中也講到了爲何Zookeeper不適合作發現服務,感興趣的能夠去了解下,還有消息中間件裏面也講到了Kafka使用Zookeeper來維護集羣信息。 下面講講Zookeeper特性sql
最終一致性:
最重要的性能,client不論鏈接到哪一個server,展現都是同一個視圖。可靠性:
具備簡單、健壯、良好性能,若是消息被一臺server接受,它將被全部server接受。實時性:
保證client在一個時間間隔範圍內得到server的更新信息/失效信息,但存在網絡延時等緣由,不能保證全部client同時獲得,應該在讀數據以前調用sync接口同步。等待無關:
互不相關,慢的或者失效的client不得干涉快的client的請求。原子性:
只有成功或者失敗,沒有中間狀態。順序性:
從同一客戶端發起的事務請求,都會最終被嚴格的按照其發送順序被應用到zk中,包括全局有序和偏序兩種,全局有序好理解,就是全部的server的發佈消息順序同樣;偏序存在沒法比較的現象,若是一個消息B在消息A後被同一個發佈者發佈,A必將排在B前面。 Zookeeper的核心是原子廣播,這個機制保證了各個server之間的同步,leader崩潰,由server發起選舉。領導者(leader):
負責進行發起投票和決議,更新系統狀態。學習者:
分爲跟隨着(follower)和觀察者(observer),前者用於接收客戶請求並向客戶端返回結果,參與投票;後者接收客戶端寫請求,轉發給領導者,不參與投票,只同步領導者的狀態。客戶端:
請求發起方。
Hbase:
一個實時讀寫、分佈式的列式數據庫,主要是爲了彌補Hadoop對實時操做的缺陷。和傳統關係型數據庫有一個很重要的區別是,一個是基於行,一個是基於列。能夠說它是鍵值存儲,也能夠說它是多時間版本映射的數據庫。 四個描述shell
行鍵(rowkey):
能夠理解它爲惟一ID,惟一標識,Hbase是不容許跨行的事務,全部rowkey和列族的設計就尤其重要和取巧。列族/列鍵(column family):
一個表中必須至少有一個列族,列族是由多個列組成的,列族是能影響數據存儲的物理特性。列限定符(column key):
能夠理解爲列。列族裏的數據是經過列限定符來定位。列限定符不須要事前定義,這也是和關係型數據庫的區別,支持任意擴展。時間戳(timestamp):
能夠理解爲行鍵、列族、列限定符組成了一個單元(cell),cell是有時間版本,用時間戳標識,默認是3個。Hive:
sql轉換MapReduce程序語言,能夠減小MapReduce jobs編寫工做,Hive提供了相似sql語言的查詢語言-Hive QL,能夠經過Hive QL語句快速實現簡單的MapReduce統計,十分適合作數據倉庫的統計分析。數據庫
Pig:
在MapReduce上建立了更簡單的過程語言抽象,提供了一種更接近結構化查詢語言(SQL)的接口,能夠理解爲Pig最大的做用就是對MapReduce算法(框架)實現了一套shell腳本 ,稱之爲:Pig Latin。編程
Mahout:
用於機器學習的一個框架,旨在幫助更方便快捷建立智能應用程序,包含許多實現,聚類、分類、推薦過濾、頻繁子項挖掘等。服務器
MapReduce:
一種離線計算框架,用於大規模數據集的平行運算,將並行計算過程高度抽象到了兩個函數,Map和Reduce;這樣就能夠在不瞭解分佈式系統底層細節的狀況下進行平行應用開發,核心思想是:「分而治之」,把輸入的數據集切分爲若干獨立的數據庫,分發給各個分節點共同平行完成,最後聚合結果獲得最終結果。
YARN:
調度系統,資源管理器,最初是爲了修復MapReduce實現的不足,由於MapReduce是採用了Master/Slave 模式,一個JobTracker負責做業調度和資源管理,多個TaskTracker負責執行被指派的具體任務,因此會存在單點故障、任務太重、內存溢出、資源劃分不合理等缺陷。
HDFS:
Hadoop分佈式文件系統,是針對谷歌文件系統GFS的開源實現,具備處理超大數據、流式處理、能夠運行在廉價商用服務器上等有點。
Flume:
分佈式的海量日誌採集,聚合和傳輸的系統,Flume具備高可用,分佈式,配置工具,其設計的原理也是基於將數據流,如日誌數據從各類網站服務器上聚集起來存儲到HDFS,HBase等集中存儲器中。
Sqoop:
SQL-to-Hadoop的縮寫,主要用來在Hadoop和關係數據庫之間交換數據,經過Sqoop能夠方便的將數據從關係數據庫中導入Hadoop,或者將數據從Hadoop導出到關係數據庫,Sqoop主要經過JDBC和關係數據庫進行交互。
附加幾個其它的功能組件
Storm:
Storm是Twitter開源的分佈式實時大數據處理框架,流計算平臺,優勢是無延遲,缺點是不夠靈活,想要統計的東西必須預知道;要達到更新實時,在數據流進來的時候就開始處理,好比廣告點擊計算,它的實時性要遠遠好於MapReduce計算框架。
Spark:
MapReduce計算框架不適合迭代計算和交互計算,MapReduce是一種磁盤計算框架,而Spark則是一種內存計算框架,它將數據儘量放到內存中提升迭代應用和交互式應用的計算效率。
Pregel:
Pregel是Google提出的大規模分佈式圖計算平臺,專門用來解決網頁連接分析、社交數據挖掘等實際應用中涉及的大規模分佈式圖計算問題,Pregel做爲分佈式圖計算的計算框架,主要用於圖遍歷、最短路徑、PageRank計算等。
針對Hadoop的改進和提高 Hadoop框架自身的改進,從1.0到2.0
組件 | Hadoop1.0的問題 | Hadoop2.0的改進 |
---|---|---|
HDFS | 單一名稱節點,存在單點失效問題 | 設計了HDFS HA,提供名稱節點熱備份機制 |
單一命名空間,沒法實現資源隔離 | 設計了HDFS聯邦,管理多個命名空間 | |
MapReduce | 資源管理效率底 | 設計了新的資源管理框架YARN |
不斷完善的Hadoop生態系統
組件 | 功能 | 解決Hadoop中存在的問題 |
---|---|---|
Pig | 處理大規模數據的腳本語言,用戶只要編寫幾條簡單的語句,系統會自動轉換爲MapReduce做業 | 抽象層次低,須要手工編寫大量代碼 |
Oozie | 工做流和協做服務引擎,協調Hadoop上運行的不一樣任務 | 沒有提供做業依賴關係管理機制,須要用戶本身處理做業之間的依賴關係 |
Tez | 支持DAG做業的計算框架,對做業的操做進行從新分解和組合,造成一個搭的DAG做業,減小沒必要要操做 | 不一樣的MapReduce任務之間存在重複操做,下降了效率 |
Kafka | 分佈式發佈訂閱消息系統,不一樣類型的分佈式系統能夠統一接入到Kafka,實現和Hadoop各個組件之間的不一樣類型數據的實時高效交換 | Hadoop生態系統中各個組件和其它產品之間缺少統一的、高效的數據交換中介 |
這裏主要是對Hadoop生態系統的一些功能組件作一個簡單的歸類描述,不涉及到具體的實現。 感興趣的能夠看看個別組件功能的詳細實戰。
淺談Hbase與中間的一些設計策略
我的博客~
簡書~