前言
說起Hadoop,知道它是一個開源的、可執行於大規模叢集上的分散式計算平臺,實現了MapReduce計算模型和分散式檔案系統HDFS等功能;但對Hadoop整個的生態不夠了解,本著愛學習的態度,一塊來探探hadoop的生態圈。
關於Hadoop
日常生活中我們一看到大資料和大資料相關的資訊就會想到了hadoop,但要說具體點,又不知從何說起。 hadoop是基於Java開發的,所以在跨平臺上有很大的優勢,並且可以部署在廉價的計算機叢集中,所以導致hadoop的火熱程度。hadoop的核心是HDFS和MapReduce,HDFS是針對谷歌檔案系統(GFS)的開源實現,具有較高的讀寫速度、容錯性、可伸縮性,採用MapReduce的整合,可以在不瞭解分散式系統底層細節的情況下開發。這樣就可以輕鬆的完成海量資料的儲存和計算。
Hadoop的特性
高可靠:
採用冗餘資料儲存方式,這個即使一個副本發生故障,還有其它的副本保證正常對外服務。高效:
採用了分散式儲存和分散式處理兩大核心,能夠很高效的處理大量的資料。高可擴充套件:
前面說了部署在廉價的計算機叢集上,擴充套件起來很方便。成本低:
參考高可擴充套件。高容錯:
參考高可靠,能夠自動將失敗任務重新分配。平臺:
執行在Linux上,基於java開發的hadoop跨平臺優勢可以很好完成。- 支援多種語言程式設計
Hadoop生態系統
hadoop除了HDFS和MapReduce外,還還包括了其它很多的功能元件。例如:經常聽到的zookeeper、hbase、hive、pig、mahout、sqoop、flume、ambari等功能元件。
下面對各個元件做一個簡單的概述,比較常用的著重描述。
-
Ambari:
一種基於web的工具,就作用來說,就是建立、管理、監視Hadoop生態圈的叢集;就是為了讓 Hadoop 以及相關的大資料軟體更容易使用的一個工具。 -
Zookeeper:
為分散式系統提供一致性協同服務,像配置服務、命名服務、分散式同步等,前面服務發現這篇文章中也講到了為什麼Zookeeper不適合做發現服務,感興趣的可以去了解下,還有訊息中介軟體裡面也講到了Kafka使用Zookeeper來維護叢集資訊。 下面講講Zookeeper特性最終一致性:
最重要的效能,client不論連線到哪個server,展示都是同一個檢視。可靠性:
具有簡單、健壯、良好效能,如果訊息被一臺server接受,它將被所有server接受。實時性:
保證client在一個時間間隔範圍內獲得server的更新資訊/失效資訊,但存在網路延時等原因,不能保證所有client同時得到,應該在讀資料之前呼叫sync介面同步。等待無關:
互不相關,慢的或者失效的client不得干涉快的client的請求。原子性:
只有成功或者失敗,沒有中間狀態。順序性:
從同一客戶端發起的事務請求,都會最終被嚴格的按照其傳送順序被應用到zk中,包括全域性有序和偏序兩種,全域性有序好理解,就是所有的server的釋出訊息順序一樣;偏序存在無法比較的現象,如果一個訊息B在訊息A後被同一個釋出者釋出,A必將排在B前面。 Zookeeper的核心是原子廣播,這個機制保證了各個server之間的同步,leader崩潰,由server發起選舉。
典型的應用場景(配置檔案管理、叢集管理、同步鎖、leader選舉、佇列管理等)
最典型叢集模式: Master/Slave 模式(主備模式),Master負責寫,Slave負責讀,但Zookeeper沒有使這種模式,採用了三種角色。
Zookeeper中三種角色
領導者(leader):
負責進行發起投票和決議,更新系統狀態。學習者:
分為跟隨著(follower)和觀察者(observer),前者用於接收客戶請求並向客戶端返回結果,參與投票;後者接收客戶端寫請求,轉發給領導者,不參與投票,只同步領導者的狀態。客戶端:
請求發起方。
-
Hbase:
一個實時讀寫、分散式的列式資料庫,主要是為了彌補Hadoop對實時操作的缺陷。和傳統關係型資料庫有一個很重要的區別是,一個是基於行,一個是基於列。可以說它是鍵值儲存,也可以說它是多時間版本對映的資料庫。 四個描述行鍵(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與中間的一些設計策略
個人部落格~
簡書~