第2章 大数据处理架构Hadoop
概述
Hadoop是一個開源的、可運行于大規模集群上的分布式計算平臺,它實現了MapReduce計算模型和分布式文件系統HDFS等功能。
它被公認為行業大數據標準開源軟件。
名字的是由小孩子取的“一頭吃飽了的大象”。
由來
1997年年末,Doug Cutting道格·卡丁因工作不穩定,自己用Java編寫了Lucene;(Doug Cutting是Lucene、Nutch、Hadoop、Avro的作者)Lucene其實是一個提供全文文本搜索的函數庫,它不是一個應用軟件;
2000年3月,Lucene被放到了SourceForge上
2001年10月,Lucene被捐獻給Apache,作為Jakarta的一個子項目。
2002年8月, Doug Cutting創建了Nutch并托管于SourceForge上;
???????? Nutch項目遇到了棘手的難題,該搜索引擎框架無法擴展到擁有數十億網頁的網絡。
2003年10月,谷歌發布分布式文件系統GFS(The Google File System)Google論文《Google File System》
2004年,Nutch的開源版本基于GFS開發了NDFS(Nutch Distributed File System,NDFS)解決了存儲的問題
2004年10月,谷歌發布《Google MapReduce》大數據分布式計算框架
2005年1月,Nutch加入Apache的孵化器
2005年,Nutch實現了谷歌的MpaReduce
2005年6月,Nutch孵化結束成為Lucene的子項目
2006年2月,Nutch中的NDFS和MapReduce獨立出來 ,成為Apache Lucene項目的子項目,稱為Hadoop;創始人Dong Cutting道格·卡丁加盟雅虎公司。
特性
- 高可靠性
采用冗余數據存儲方式,即使一個副本發生故障,其他副本也可以保證正常對外提供服務。
- 高效性
作為并行分布式計算平臺,采用分布式存儲和分布式計算兩大核心技術,能夠高效地處理PB級數據。
- 高擴展性
Hadoop的設計目標是可以高效穩定地運行在廉價的計算機集群上,可以擴展到以千計的計算機節點上。
- 高容錯性
采用冗余數據存儲方式,自動保存數據的多個副本,并且能夠自動將失敗的任務進行重新分配。
- 成本低
Hadoop采用廉價的計算機集群,成本比較低,普通用戶也很容易用自己的PC搭建Hadoop運行環境。
- 運行在Linux操作系統上
Hadoop基于Java開發的,可以較好地運行在Linux操作系統上。
- 支持多種編程語言
Hadoop上的應用程序也可以使用其他語言編寫,如C++。
Hadoop的版本
Apache Hadoop版本分為三代,分別是Hadoop 1.0、Hadoop 2.0和Hadoop 3.0。
Hadoop 1.0
Hadoop 1.0包含0.20.x、0.21.x和0.22.x三個版本,其中,0.20.x最后演化成1.0.x,就了穩定版,而0.21.x和0.22.x增加了HDFS HA等重要的新特性。
Hadoop1.0的核心組件(僅指MapReduce和HDFS,不包括Hadoop生態系統內的Pig、Hive、HBase等其他組件)主要存在以下不足:
- 抽象層次低
功能實現需要手工編寫代碼來完成,有時只是為了實現一個簡單的功能,也需要編寫大量的代碼
- 表達能力有限
MapReduce把復雜的分布式編程工作高度抽象為兩個函數,即Map和Reduce,在降低開發人員程序開發復雜度的同時,也帶來了表達能力有限的問題,實際生產環境的一些應用是無法用簡單的Map和Reduce來完成的。
- 開發者自己管理作業之間的依賴關系
一個作業(Job)只包含Map和Reduce兩個階段,通常的實際應用問題需要大量的作業進行協作才能順利解決,這些作業之間往往存在復雜的依賴關系,但是MapReduce框架本身并沒有提供相關的機制對這些依賴關系進行有效管理,只能由開發者自己管理。
- 難以看到程序整體邏輯
用戶的處理邏輯都隱藏在代碼細節中,沒有更高層次的抽象機制對程序整體邏輯進行設計,這就給代碼理解和后期維護帶來了障礙。
- 執行迭代操作效率低
對于一些大型的機器學習、數據挖掘任務,往往需要多輪迭代才能得到結果。采用MapReduce實現這些算法時,每次迭代都是一次執行Map、Reduce任務的過程,這個過程的數據來自分布式文件系統HDFS,本次迭代的處理結果也被存放到HDFS中,繼續用于下一次迭代過程。反復讀寫HDFS中的數據,大大降低了迭代操作的效率。
- 資源浪費
在MapReduce框架設計中,Reduce任務需要等待所有Map任務都完成后才可以開始,造成了不必要的資源浪費。
- 實時性差
只適用于離線批數據處理,無法支持交互式數據處理、實時數據處理。
Hadoop 2.0
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 2.0包含0.23.x和2.x兩大版本,它們完全不同于Hadoop 1.0,是一套全新的架構,均包含HDFS Federationt [?fed?'re??n](聯邦、聯合) 和YARN(Yet Another Resource Negotiator)兩個系統。Hadoop 2.0是基于JDK 1.7開發的,2015年4月JDK 1.7停止更新,Hadoop社區基于JDK 1.8發布了新的Hadoop版本,即Hadoop 3.0。
Federation HDFS與HDFS的區別
HDFS的局限性(HDFS只有一個active的namenode):
1. 在name中存儲所有的元數據(metadata),因此單個namenode所能存儲的對象(塊+文件)數據受到namenode所在JVM的heap size的限制。
2. 整個HDFS文件系統的吞吐量受限于單個namenode的吞吐量
3. 無法隔離namespace
Federation HDFS 與 HDFS的區別:
HDFS只有一個name space, 它使用全部的塊。而Federation HDFS 中有多個獨立的namespace,每個命名空間使用一個block Pool。
Bolck Pool : 維護單個命名空間的所有block。Data node是一個物理概念,而block pool是一個重新將block劃分的邏輯概念。同一個DataNode可以存儲 著屬于多個blocknode的多個塊。block允許一個命名空間在不通知其它命名空間的情況下為一個新的block創建blockID。同時,一個namenode失效不會影響旗下的DataNode為其它namenode服務。
Federation HDFS 架構圖:
?Federation HDFS HA架構圖
?其中 NN1 NN3 屬于同一個namenode, NN2 NN4 屬于同一個namenode
Hadoop 3.0
Hadoop 3.0 JDK版本的最低依賴從1.7變成了1.8;Haddop3.0中引入 了一些重要的功能和優化,包括HDFS可探險編碼、多名稱節點支持、任務級別的MapReduce本地優化、基于cgroup的內存和磁盤IO隔離等。
支持HDFS中的糾刪碼Erasure Encoding;(檢錯碼、糾錯碼、刪錯碼)代替副本機制
基于HDFS路由器的聯合
支持多個NameNode
DataNode內部添加了負載均衡Disk Balancer
Hadoop生態系統
Hadoop除了核心的HDFS和MapReduce外,Hadoop生態系統還包括ZooKeeper、HBase、Hive、Pig、Mahout、Flume、Sqoop、Ambari等功能組件。
HDFS
HDFS 是Hadoop的分布式文件系統,是Hadoop的核心之一,是針對谷歌文件系統GFS的開源實現。HDFS具有處理超大數據、流式處理、可以運行在廉價的商用服務器上等優點。因為HDFS一開始就定位運行在廉價的商用服務器上,因此,在設計上把硬件故障作為一種常態來考慮,實現了在部分硬件發生故障的情況下仍然能保證文件系統的整體可用性和可靠性。HDFS放寬了一部分可移植操作系統接口(Portable Operating System Interface,POSIX)約束,從而實現以流的形式訪問文件系統中的數據。HDFS在訪問應用程序數據時,可以具有很高的吞吐率,因此選擇HDFS作為底層數據存儲系統是較好的選擇。
HBase
HBase是一個提供高可靠性、高性能、可伸縮、實時讀寫、分布式的列式數據庫,一般采用HDFS作為其底層數據存儲系統。HBase是針對谷歌的BigTable的開源實現,二者都采用了相同的數據模型,具有強大的非結構化數據存儲能力。HBase具有良好的橫向擴展能力,可以通過不斷增加廉價的商用服務器來提高存儲能力。
MapReduce
Hadoop MapReduce是谷歌MapReduce的開源實現。MapReduce是一種編程模型,用于大規模數據集(大于1TB)的并行運算,它將復雜的、運行于大規模集群上的并行計算過程高度地抽象為兩個函數----Map和Reduce。
MapReduce的核心思想就是“分而治之”,它把輸入的數據集切分為若干個獨立的數據塊,分發給一個主節點管理下的各個分節點來共同并行完成;最后,通過整合各個節點的中間結果得到最終結果。
Hive
Hive是一個基礎Hadoop的數據倉庫工具,可以用于對Hadoop文件中的數據集進行整理、特殊查詢和分析存儲。它提供了類似關系數據庫SQL的查詢語言 ---- HiveSQL,Hive自身可以將HiveSQL語句轉換為MapReduce任務運行,而不必開發專門的MapReduce應用,因而十分適合數據倉庫的統計分析。
Pig
Pig是Hadoop生態系統的一個組件,提供了類似SQL的Pig Latin(包含Filter、GroupBy、Join、OrderBy等操作,同時也支持用戶自定義函數),允許用戶通過編寫簡單的腳本來實現復雜的數據分析,而不需要編寫復雜的MapReduce應用程序。Pig會自動把用戶編寫的腳本轉換成MapReduce作業在Hadoop集群上運行,而且具備對生成的MapReduce程序進行自動優化的功能。
Pig可以加載數據、表達轉換數據以及存儲最終結果。Pig通常用于數據提取、轉換和加載(Extraction、Transformation、Loading,ETL)過程,即來自不同數據源的數據被收集過來后,使用Pig進行統一加工處理,然后加載到數據倉庫Hive中,由Hive實現對海量數據的分析。
Pig并不適合所有的數據處理任務,特別是當需要查詢大數據集中的一小部分數據時。
當數據查詢只面向相關技術人員,并且屬于即時性的數據處理需求時,比較適合采用Pig編寫一個腳本來完成快速運行處理,從而避免創建表等相關操作。
Mahout
Mahout是Apache軟件基金會旗下的一個開源項目,提供一些可擴展的機器學習領域經典算法實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。
Zookeeper
Zookeeper是針對谷歌Chubby的一個開源實現,是高效和可靠的協同工作系統,提供分布式鎖之類的基本服務(如統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等),用于構建分布式應用,減輕分布式應用程序所承擔的協調任務。
Flume
Flume是Cloudera提供的一個高可用的、高可靠的、分布式的海量日志采集、聚合和傳輸的系統。Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理并寫到各種數據接收方的能力。
Sqoop
Sqoop是SQL-to-Hadoop的縮寫,主要用來在Hadoop和關系數據庫之間交換數據,可以改善數據的互操作性。通過Sqoop可以方便地將數據從關系數據庫導入Hadoop,或者將數據從Hadoop導出到關系數據庫。Sqoop主要通過Java數據庫連接JDBC和關系數據庫進行交互。Sqoop是專門為大數據集設計的,支持增量更新。
Ambari
Ambari是一種基于Web的工具,支持Hadoop集群的安裝、部署、配置和管理。
Tez
Tez是Apache開源的支持DAG作業的計算框架,直接源于MapReduce框架。其核心思想是將Map和Reduce兩個操作進一步進行拆分,即將Map拆分成Input、Processor、Sort、Merge和Output等,將Reduce拆分成Input、Shuffle、Sort、Merge、Processor和Output等,經過分解后的這些元操作可以進行任意組合產生新的操作,經過一些控制程序組裝后就可形成一個大的DAG作業。
通過DAG作業的方式運行MapReduce作業,提供了程序運行的整體處理邏輯,可以去除工作流當中多余的Map階段,減少不必要的操作,提升數據處理的性能。
在Hadoop 2.0生態系統中,MapReduce、Hive、Pig等計算框架都需要最終以MapReduce任務的形式執行數據分析,因此Tez框架可以發揮重要的作用。可以讓Tez框架運行在YARN框架之上,然后讓MapReduce、Pig、Hive等計算框架運行在Tez框架之上,從而借助于Tez框架實現對Map、Pig和Hive等的性能優化,更好地解決現有MapReduce框架在迭代計算和交互計算方面存在的問題。
Tez在解決Hive、Pig延遲大、性能低等問題的思路上,和那些支持實時交互式查詢分析的產品(如Impala、Dremel和Drill等)是不同的。Impala、Dremel和Drill解決問題的思路是拋棄MapReduce計算框架,不再將類似SQL語句的HiveSQL或者Pig語句翻譯成MapReduce程序,而是采用與商用 并行關系數據庫類似的分布式查詢引擎,直接從HDFS或者HBase中用SQL語句查詢數據,從而大大降低了延遲。Tez則不同,仍然采用MapReduce計算框架,但是對DAG的作業依賴關系進行了裁剪,并將多個小作業合并成一個大作業,這樣不僅計算量減少了,而且讀寫HDFS次數也會大大減少。
Kafka
Kafka是由LinkedIn開發的一種高吞吐量的分布式發布/訂閱消息系統,用戶通過Kafka系統可以發布大量的消息,同時能實時訂閱消費消息。Kafka設計的初衷是構建一個可以處理海量日志、用戶行為和網站運行統計等的數據處理框架。Kafka可以同時提供在線實時處理的低延遲和批量離線處理的高吞吐量。
在公司的大數據生態系統中,可以把Kafka作為數據交換樞紐,不同類型的分布式系統(如關系數據庫、NoSQL數據庫、流處理系統、批處理系統等)可以統一接入Kafka,從而實現和Hadoop各個組件之間的不同類型數據的實時高效交換,較好地滿足各種企業的應用需求。
總結
以上是生活随笔為你收集整理的第2章 大数据处理架构Hadoop的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [vue] vue怎么缓存当前的组件?缓
- 下一篇: [html] iframe框架都有哪些