Hadoop生態(tài)圈
可以把hadoop想象成一個很大的生態(tài)圈(本來就是),或者說想象成一個動物園吧,之后的東西就比較好理解了个榕。(我也不知道為啥python的教程一般都是動物做封面忠烛,難道已經(jīng)暗喻加入了動物園生態(tài)圈了坯墨?)
HDFS
HDFS(Hadoop Distributed File System)是一個分布式文件系統(tǒng)寂汇,是谷歌的GFS山寨版本。它具有高容錯性并提供了高吞吐量的數(shù)據(jù)訪問捣染,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用健无,它提供了一個高度容錯性和高吞吐量的海量數(shù)據(jù)存儲解決方案。
- 高吞吐量訪問:HDFS的每個Block分布在不同的Rack上液斜,在用戶訪問時累贤,HDFS會計算使用最近和訪問量最小的服務(wù)器給用戶提供。由于Block在不同的Rack上都有備份少漆,所以不再是單數(shù)據(jù)訪問臼膏,所以速度和效率是非常快的示损。另外HDFS可以并行從服務(wù)器集群中讀寫渗磅,增加了文件讀寫的訪問帶寬。
- 高容錯性:系統(tǒng)故障是不可避免的检访,如何做到故障之后的數(shù)據(jù)恢復(fù)和容錯處理是至關(guān)重要的始鱼。HDFS通過多方面保證數(shù)據(jù)的可靠性,多份復(fù)制并且分布到物理位置的不同服務(wù)器上脆贵,數(shù)據(jù)校驗功能医清、后臺的連續(xù)自檢數(shù)據(jù)一致性功能都為高容錯提供了可能。
- 線性擴(kuò)展:因為HDFS的Block信息存放到NameNode上卖氨,文件的Block分布到DataNode上会烙,當(dāng)擴(kuò)充的時候僅僅添加DataNode數(shù)量,系統(tǒng)可以在不停止服務(wù)的情況下做擴(kuò)充筒捺,不需要人工干預(yù)柏腻。
HDFS架構(gòu)
- NameNode:在Hadoop1.X中只有一個Master節(jié)點,管理HDFS的名稱空間和數(shù)據(jù)塊映射信息系吭、配置副本策略和處理客戶端請求五嫂;
- Secondary NameNode:輔助NameNode,分擔(dān)NameNode工作肯尺,定期合并fsimage和fsedits并推送給NameNode沃缘,緊急情況下可輔助恢復(fù)NameNode;
- DataNode:Slave節(jié)點蟆盹,實際存儲數(shù)據(jù)孩灯、執(zhí)行數(shù)據(jù)塊的讀寫并匯報存儲信息給NameNode闺金;
MapReduce
MapReduce 是現(xiàn)今一個非常流行的分布式計算框架逾滥,它被設(shè)計用于并行計算海量數(shù)據(jù)。MapReduce 框架的核心步驟主要分兩部分:Map 和Reduce。當(dāng)你向MapReduce 框架提交一個計算作業(yè)時寨昙,它會首先把計算作業(yè)拆分成若干個Map 任務(wù)讥巡,然后分配到不同的節(jié)點上去執(zhí)行,每一個Map 任務(wù)處理輸入數(shù)據(jù)中的一部分舔哪,當(dāng)Map 任務(wù)完成后欢顷,它會生成一些中間文件,這些中間文件將會作為Reduce 任務(wù)的輸入數(shù)據(jù)捉蚤。Reduce 任務(wù)的主要目標(biāo)就是把前面若干個Map 的輸出匯總到一起并輸出抬驴。從高層抽象來看,MapReduce的數(shù)據(jù)流圖如下圖所示:
MapReduce流程圖
MapReduce工作流程
- 在集群中的任意一個節(jié)點提交MapReduce程序
- JobClient收到作業(yè)后缆巧,JobClient向JobTracker請求獲取一個Job ID
- 將運行作業(yè)所需要的資源文件復(fù)制到HDFS上(包括MapReduce程序打包的JAR文件布持、配置文件和客戶端計算所得的輸入劃分信息),這些文件都存放在JobTracker專門為該作業(yè)創(chuàng)建的文件夾中陕悬,文件夾名為該作業(yè)的Job ID
- 獲得作業(yè)ID后题暖,提交作業(yè)
- .JobTracker接收到作業(yè)后,將其放在一個作業(yè)隊列里捉超,等待作業(yè)調(diào)度器對其進(jìn)行調(diào)度胧卤,當(dāng)作業(yè)調(diào)度器根據(jù)自己的調(diào)度算法調(diào)度到該作業(yè)時,會根據(jù)輸入劃分信息為每個劃分創(chuàng)建一個map任務(wù)拼岳,并將map任務(wù)分配給TaskTracker執(zhí)行
- 對于map和reduce任務(wù)枝誊,TaskTracker根據(jù)主機(jī)核的數(shù)量和內(nèi)存的大小有固定數(shù)量的map槽和reduce槽。這里需要強(qiáng)調(diào)的是:map任務(wù)不是隨隨便便地分配給某個TaskTracker的惜纸,這里有個概念叫:數(shù)據(jù)本地化(Data-Local)侧啼。意思是:將map任務(wù)分配給含有該map處理的數(shù)據(jù)塊的TaskTracker上,同時將程序JAR包復(fù)制到該TaskTracker上來運行堪簿,這叫“運算移動痊乾,數(shù)據(jù)不移動”
- TaskTracker每隔一段時間會給JobTracker發(fā)送一個心跳,告訴JobTracker它依然在運行椭更,同時心跳中還攜帶著很多的信息哪审,比如當(dāng)前map任務(wù)完成的進(jìn)度等信息。當(dāng)JobTracker收到作業(yè)的最后一個任務(wù)完成信息時虑瀑,便把該作業(yè)設(shè)置成“成功”湿滓。當(dāng)JobClient查詢狀態(tài)時,它將得知任務(wù)已完成舌狗,便顯示一條消息給用戶
- 運行的TaskTracker從HDFS中獲取運行所需要的資源叽奥,這些資源包括MapReduce程序打包的JAR文件、配置文件和客戶端計算所得的輸入劃分等信息
- TaskTracker獲取資源后啟動新的JVM虛擬機(jī)
- 運行每一個任務(wù)
補(bǔ)充:
- JobTracker:是一個后臺服務(wù)進(jìn)程痛侍,啟動之后朝氓,會一直監(jiān)聽并接收來自各個TaskTracker發(fā)送的心跳信息,包括資源使用情況和任務(wù)運行情況等信息。在hadoop中每個應(yīng)用程序被表示成一個作業(yè)赵哲,每個作業(yè)又被分成多個任務(wù)待德,JobTracker的作業(yè)控制模塊則負(fù)責(zé)作業(yè)的分解和狀態(tài)監(jiān)控(主要包括TaskTracker狀態(tài)監(jiān)控、作業(yè)狀態(tài)監(jiān)控和任務(wù)狀態(tài)監(jiān)控)枫夺。
Map過程:
Step1:每個輸入分片會讓一個map任務(wù)來處理将宪,默認(rèn)情況下,以HDFS的一個塊的大邢鹋印(默認(rèn)為64M)為一個分片较坛,當(dāng)然我們也可以設(shè)置塊的大小。map輸出的結(jié)果會暫且放在一個環(huán)形內(nèi)存緩沖區(qū)中(該緩沖區(qū)的大小默認(rèn)為100M扒最,由io.sort.mb屬性控制)燎潮,當(dāng)該緩沖區(qū)快要溢出時(默認(rèn)為緩沖區(qū)大小的80%,由io.sort.spill.percent屬性控制)扼倘,會在本地文件系統(tǒng)中創(chuàng)建一個溢出文件确封,將該緩沖區(qū)中的數(shù)據(jù)寫入這個文件;
Step2:在寫入磁盤之前再菊,線程首先根據(jù)reduce任務(wù)的數(shù)目將數(shù)據(jù)劃分為相同數(shù)目的分區(qū)爪喘,也就是一個reduce任務(wù)對應(yīng)一個分區(qū)的數(shù)據(jù)。這樣做是為了避免有些reduce任務(wù)分配到大量數(shù)據(jù)纠拔,而有些reduce任務(wù)卻分到很少數(shù)據(jù)秉剑,甚至沒有分到數(shù)據(jù)的尷尬局面。其實分區(qū)就是對數(shù)據(jù)進(jìn)行hash的過程稠诲。然后對每個分區(qū)中的數(shù)據(jù)進(jìn)行排序侦鹏,如果此時設(shè)置了Combiner,將排序后的結(jié)果進(jìn)行Combia操作臀叙,這樣做的目的是讓盡可能少的數(shù)據(jù)寫入到磁盤略水;
Step3:當(dāng)map任務(wù)輸出最后一個記錄時,可能會有很多的溢出文件劝萤,這時需要將這些文件合并渊涝,目的是為了盡量減少每次寫入磁盤的數(shù)據(jù)量和盡量減少下一復(fù)制階段網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。
Reduce過程
Step1:Reduce會接收到不同map任務(wù)傳來的數(shù)據(jù)床嫌,并且每個map傳來的數(shù)據(jù)都是有序的跨释。如果reduce端接受的數(shù)據(jù)量相當(dāng)小,則直接存儲在內(nèi)存中(緩沖區(qū)大小由mapred.job.shuffle.input.buffer.percent屬性控制厌处,表示用作此用途的堆空間的百分比)鳖谈,如果數(shù)據(jù)量超過了該緩沖區(qū)大小的一定比例(由mapred.job.shuffle.merge.percent決定),則對數(shù)據(jù)合并后溢寫到磁盤中阔涉;
Step2:隨著溢寫文件的增多缆娃,后臺線程會將它們合并成一個更大的有序的文件捷绒,這樣做是為了給后面的合并節(jié)省時間。其實不管在map端還是reduce端龄恋,MapReduce都是反復(fù)地執(zhí)行排序疙驾,合并操作凶伙;
Step3:合并的過程中會產(chǎn)生許多的中間文件(寫入磁盤了)郭毕,但MapReduce會讓寫入磁盤的數(shù)據(jù)盡可能地少,并且最后一次合并的結(jié)果并沒有寫入磁盤函荣,而是直接輸入到reduce函數(shù)显押。
Hive
Hive是Facebook開發(fā)的構(gòu)建于Hadoop集群之上的數(shù)據(jù)倉庫應(yīng)用,它提供了類似于SQL語法的HQL語句作為數(shù)據(jù)訪問接口傻挂,這使得普通分析人員的應(yīng)用Hadoop的學(xué)習(xí)曲線變小乘碑。
- Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表金拒,并使用sql語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運行兽肤。其優(yōu)點是學(xué)習(xí)成本低,可以通過類SQL語句快速實現(xiàn)簡單的MapReduce統(tǒng)計绪抛,不必開發(fā)專門的MapReduce應(yīng)用资铡,十分適合數(shù)據(jù)倉庫的統(tǒng)計分析
- Hive是建立在 Hadoop 上的數(shù)據(jù)倉庫基礎(chǔ)構(gòu)架。它提供了一系列的工具幢码,可以用來進(jìn)行數(shù)據(jù)提取轉(zhuǎn)化加載(ETL)笤休,這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規(guī)模數(shù)據(jù)的機(jī)制症副。Hive 定義了簡單的類 SQL 查詢語言店雅,稱為 HQL,它允許熟悉 SQL 的用戶查詢數(shù)據(jù)贞铣。同時闹啦,這個語言也允許熟悉 MapReduce 開發(fā)者的開發(fā)自定義的 Mapper 和 Reducer 來處理內(nèi)建的Mapper 和Reducer 無法完成的復(fù)雜的分析工作。
HIve架構(gòu)
客戶端組件
- CLI:command line interface辕坝,啟動的時候會同時啟動一個Hive副本亥揖,Client是Hive的客戶端,用戶連接至Hive Server圣勒。在啟動 Client模式的時候费变,需要指出Hive Server所在節(jié)點,并且在該節(jié)點啟動Hive Server圣贸。--hive shell
- WUI:用戶接口挚歧,通過瀏覽器訪問Hive。
- JDBC/ODBC:開放的API客戶端吁峻。--(java 訪問hive)
服務(wù)端組件
- Thrift服務(wù):thrift是facebook開發(fā)的一個軟件框架滑负,它用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)在张,Hive集成了該服務(wù),能讓不同的編程語言調(diào)用hive的接口矮慕。
- Metastore組件:元數(shù)據(jù)服務(wù)組件帮匾,這個組件存儲Hive的元數(shù)據(jù),Hive的元數(shù)據(jù)存儲在關(guān)系數(shù)據(jù)庫里痴鳄,Hive支持的關(guān)系數(shù)據(jù)庫有derby和mysql瘟斜。元數(shù)據(jù)對于Hive十分重要,因此Hive支持把metastore服務(wù)獨立出來痪寻,安裝到遠(yuǎn)程的服務(wù)器集群里螺句,從而解耦Hive服務(wù)和metastore服務(wù),保證Hive運行的健壯性橡类。
- Driver組件:該組件包括Complier蛇尚、Optimizer和Executor,它的作用是將HiveQL(類SQL)語句進(jìn)行解析顾画、編譯優(yōu)化取劫,生成執(zhí)行計劃,然后調(diào)用底層的mapreduce計算框架研侣。
HBase
Hadoop Database谱邪,是一個高可靠性、高性能义辕、面向列虾标、可伸縮的分布式存儲系統(tǒng),利用HBase技術(shù)可在廉價PC Server上搭建起大規(guī)模結(jié)構(gòu)化存儲集群灌砖。Google運行MapReduce來處理Bigtable中的海量數(shù)據(jù)璧函,HBase同樣利用Hadoop MapReduce來處理HBase中的海量數(shù)據(jù);Google Bigtable利用 Chubby作為協(xié)同服務(wù)基显,HBase利用Zookeeper作為對應(yīng)蘸吓。
Pig
一種操作hadoop的輕量級腳本語言,是一種數(shù)據(jù)流語言撩幽,用來快速輕松的處理巨大的數(shù)據(jù)库继。Pig可以非常方便的處理HDFS和HBase的數(shù)據(jù),和Hive一樣,Pig可以非常高效的處理其需要做的窜醉,通過直接操作Pig查詢可以節(jié)省大量的勞動和時間宪萄。當(dāng)你想在你的數(shù)據(jù)上做一些轉(zhuǎn)換,并且不想編寫MapReduce jobs就可以用Pig.
Hive .vs Pig
- Hive更適合于數(shù)據(jù)倉庫的任務(wù)榨惰,Hive主要用于靜態(tài)的結(jié)構(gòu)以及需要經(jīng)常分析的工作拜英。Hive與SQL相似促使 其成為Hadoop與其他BI工具結(jié)合的理想交集。
- Pig賦予開發(fā)人員在大數(shù)據(jù)集領(lǐng)域更多的靈活性琅催,并允許開發(fā)簡潔的腳本用于轉(zhuǎn)換數(shù)據(jù)流以便嵌入到較大的 應(yīng)用程序居凶。
- Pig相比Hive相對輕量虫给,它主要的優(yōu)勢是相比于直接使用Hadoop Java APIs可大幅削減代碼量。正因為如此侠碧,Pig仍然是吸引大量的軟件開發(fā)人員抹估。
- Hive和Pig都可以與HBase組合使用,Hive和Pig還為HBase提供了高層語言支持弄兜,使得在HBase上進(jìn)行數(shù)據(jù)統(tǒng)計處理變的非常簡單.
Hive .vs Hbase
- Hive是建立在Hadoop之上為了減少MapReduce jobs編寫工作的批處理系統(tǒng)药蜻,HBase是為了支持彌補(bǔ)Hadoop對實時操作的缺陷的項目 。
- 想象你在操作RMDB數(shù)據(jù)庫挨队,如果是全表掃描谷暮,就用Hive+Hadoop,如果是索引訪問蒿往,就用HBase+Hadoop.
- Hive query就是MapReduce jobs可以從5分鐘到數(shù)小時不止盛垦,HBase是非常高效的,肯定比Hive高效的多瓤漏。
Mahout
Mahout 是 Apache Software Foundation(ASF) 旗下的一個開源項目腾夯,提供一些可擴(kuò)展的機(jī)器學(xué)習(xí)領(lǐng)域經(jīng)典算法的實現(xiàn),旨在幫助開發(fā)人員更加方便快捷地創(chuàng)建智能應(yīng)用程序蔬充。AMahout包含許多實現(xiàn)蝶俱,包括聚類、分類饥漫、推薦過濾榨呆、頻繁子項挖掘。此外庸队,通過使用 Apache Hadoop 庫积蜻,Mahout 可以有效地擴(kuò)展到云中。
Zookeeper
Zookeeper 作為 Hadoop 項目中的一個子項目彻消,一個分布式的服務(wù)框架竿拆,主要用來解決分布式集群中應(yīng)用系統(tǒng)的一致性問題,是 Hadoop 集群管理的一個必不可少的模塊宾尚,它主要用來控制集群中的數(shù)據(jù)丙笋,如它管理 Hadoop 集群中的NameNode,還有 Hbase 中 Master Election煌贴、Server 之間狀態(tài)同步等御板。
Oozie
Oozie是一個工作流引擎服務(wù)器,用于運行Hadoop Map/Reduce和Pig 任務(wù)工作流.同時Oozie還是一個Java Web程序,運行在Java Servlet容器中,如Tomcat.
最后
至此,hadoop的生態(tài)圈介紹的差不多了牛郑,對于想深入的話怠肋,這些是遠(yuǎn)遠(yuǎn)不夠的,我這個只是為了吃早飯的時候井濒,可以看一下灶似,記一下各個部分功能大體列林,也算是一種初步了解,希望對你也有些幫助
致謝
@yeruby--對MapReduce過程的理解
@石山園--Hadoop入門進(jìn)階課程5
@石山園--Hadoop入門進(jìn)階課程8
@lifuxiangcaohui--Hive總結(jié)(九)Hive體系結(jié)構(gòu)
@天戈朱--Hive(一):架構(gòu)及知識體系
@u011308691--Hive初識功能架構(gòu)
@轉(zhuǎn)--JobTracker和TaskTracker概述
@zhoubl668--Mahout推薦算法API詳解
@轉(zhuǎn)--分布式服務(wù)框架 Zookeeper
@清霧沁仙--Hadoop Oozie 學(xué)習(xí)筆記(六) Hadoop Oozie概述