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