大数据学习之路(七)——学习小结
個(gè)人目前學(xué)習(xí)的總結(jié),如有問(wèn)題,發(fā)現(xiàn)的時(shí)候會(huì)修正,用于個(gè)人回顧,有錯(cuò)誤的地方歡迎留言指出
通過(guò)前幾篇的學(xué)習(xí)
hadoop單節(jié)點(diǎn)偽分布式
hadoop完全分布式
hadoop完全分布式高可用(HA) zookeeper
yarn高可用
hdfs
MapReduce
了解了hadoop基本的搭建,和前期可能遇到的問(wèn)題。?
以下是對(duì)各個(gè)功能組件的理解。
很多初學(xué)者,對(duì)大數(shù)據(jù)的概念都是模糊不清的,大數(shù)據(jù)是什么,能做什么,學(xué)的時(shí)候,該按照什么線路去學(xué)習(xí),學(xué)完往哪方面發(fā)展,想深入了解,想學(xué)習(xí)的同學(xué)歡迎加入大數(shù)據(jù)學(xué)習(xí)qq群:199427210,有大量干貨(零基礎(chǔ)以及進(jìn)階的經(jīng)典實(shí)戰(zhàn))分享給大家,并且有清華大學(xué)畢業(yè)的資深大數(shù)據(jù)講師給大家免費(fèi)授課,給大家分享目前國(guó)內(nèi)最完整的大數(shù)據(jù)高端實(shí)戰(zhàn)實(shí)用學(xué)習(xí)流程體系
1.HADOOP
Hadoop分布式文件系統(tǒng)(HDFS)是一種分布式文件系統(tǒng),設(shè)計(jì)用于在商品硬件上運(yùn)行。它與現(xiàn)有的分布式文件系統(tǒng)有許多相似之處。但是,與其他分布式文件系統(tǒng)的差異很大。HDFS具有高度容錯(cuò)能力,旨在部署在低成本硬件上。HDFS提供對(duì)應(yīng)用程序數(shù)據(jù)的高吞吐量訪問(wèn),適用于具有大型數(shù)據(jù)集的應(yīng)用程序。HDFS放寬了一些POSIX要求,以啟用對(duì)文件系統(tǒng)數(shù)據(jù)的流式訪問(wèn)。HDFS最初是作為Apache Nutch網(wǎng)絡(luò)搜索引擎項(xiàng)目的基礎(chǔ)架構(gòu)而構(gòu)建的。HDFS是Apache Hadoop Core項(xiàng)目的一部分。
2.NameNode和DataNodes
HDFS具有主/從架構(gòu)。一個(gè)HDFS集群包含一個(gè)NameNode,一個(gè)主服務(wù)器,用于管理文件系統(tǒng)名稱空間并管理客戶端對(duì)文件的訪問(wèn)。此外,還有許多DataNode,通常是群集中的每個(gè)節(jié)點(diǎn)一個(gè)DataNode,用于管理連接到它們所運(yùn)行的節(jié)點(diǎn)的存儲(chǔ)。HDFS公開(kāi)文件系統(tǒng)名稱空間并允許用戶數(shù)據(jù)存儲(chǔ)在文件中。在內(nèi)部,文件被分成一個(gè)或多個(gè)塊,這些塊存儲(chǔ)在一組DataNode中。NameNode執(zhí)行文件系統(tǒng)命名空間操作,如打開(kāi),關(guān)閉和重命名文件和目錄。它還確定塊到DataNode的映射。DataNode負(fù)責(zé)提供來(lái)自文件系統(tǒng)客戶端的讀取和寫(xiě)入請(qǐng)求。DataNode還執(zhí)行塊創(chuàng)建,刪除。?
?
NameNode和DataNode是設(shè)計(jì)用于在商品機(jī)器上運(yùn)行的軟件。這些機(jī)器通常運(yùn)行GNU / Linux操作系統(tǒng)(OS)。HDFS使用Java語(yǔ)言構(gòu)建; 任何支持Java的機(jī)器都可以運(yùn)行NameNode或DataNode軟件。使用高度可移植的Java語(yǔ)言意味著HDFS可以部署在各種機(jī)器上。典型的部署有一臺(tái)只運(yùn)行NameNode軟件的專用機(jī)器。群集中的每臺(tái)其他機(jī)器運(yùn)行DataNode軟件的一個(gè)實(shí)例。該體系結(jié)構(gòu)不排除在同一臺(tái)機(jī)器上運(yùn)行多個(gè)DataNode,但在實(shí)際部署中很少出現(xiàn)這種情況。
集群中單個(gè)NameNode的存在極大地簡(jiǎn)化了系統(tǒng)的體系結(jié)構(gòu)。NameNode是所有HDFS元數(shù)據(jù)的仲裁者和存儲(chǔ)庫(kù)。該系統(tǒng)的設(shè)計(jì)方式是用戶數(shù)據(jù)永遠(yuǎn)不會(huì)流經(jīng)NameNode。
總而言之,namenode負(fù)責(zé)記錄文件存儲(chǔ)在datanode上的位置,datanode則負(fù)責(zé)存儲(chǔ)數(shù)據(jù)
3. Zookeeper
ZooKeeper是一個(gè)分布式的開(kāi)源協(xié)調(diào)服務(wù),用于分布式應(yīng)用程序。它公開(kāi)了一組簡(jiǎn)單的原語(yǔ),分布式應(yīng)用程序可以構(gòu)建這些原語(yǔ),以實(shí)現(xiàn)更高級(jí)別的服務(wù),以實(shí)現(xiàn)同步,配置維護(hù)以及組和命名。它的設(shè)計(jì)易于編程,并使用在熟悉的文件系統(tǒng)目錄樹(shù)結(jié)構(gòu)之后設(shè)計(jì)的數(shù)據(jù)模型。它運(yùn)行在Java中,并且對(duì)Java和C都有綁定。
眾所周知,協(xié)調(diào)服務(wù)很難做到正確。它們特別容易出現(xiàn)諸如競(jìng)態(tài)條件和死鎖等錯(cuò)誤。ZooKeeper背后的動(dòng)機(jī)是減輕分布式應(yīng)用程序從頭開(kāi)始實(shí)施協(xié)調(diào)服務(wù)的責(zé)任。
總而言之,zookeeper負(fù)責(zé)保證各個(gè)服務(wù)的高可用,我們?cè)诖罱▊畏植际降臅r(shí)候存在SN,用于進(jìn)行的edits和fsimage的合并,但是當(dāng)namenode掛掉后,SN并不能起到替代NN的作用,為了保證項(xiàng)目中namenode的高可用,我們接入zookeeper,并啟用多臺(tái)NN,其中有一臺(tái)NN處于active狀態(tài),其他的standby,而standby的節(jié)點(diǎn)不僅起到了備份的作用,還承擔(dān)了SN的功能。很多架構(gòu)都用到了zookeeper,來(lái)保證他們的高可用。
4.Yarn
YARN的基本思想是將資源管理和作業(yè)調(diào)度/監(jiān)控的功能分解為單獨(dú)的守護(hù)進(jìn)程。這個(gè)想法是有一個(gè)全局的ResourceManager(RM)和每個(gè)應(yīng)用程序的ApplicationMaster(AM)。應(yīng)用程序可以是單個(gè)作業(yè),也可以是DAG作業(yè)。
ResourceManager和NodeManager構(gòu)成了數(shù)據(jù)計(jì)算框架。ResourceManager是仲裁系統(tǒng)中所有應(yīng)用程序之間資源的最終權(quán)威機(jī)構(gòu)。NodeManager是負(fù)責(zé)容器的每機(jī)器框架代理,監(jiān)視它們的資源使用情況(cpu,內(nèi)存,磁盤(pán),網(wǎng)絡(luò)),并將其報(bào)告給ResourceManager / Scheduler。?
?
每個(gè)應(yīng)用程序的ApplicationMaster實(shí)際上是一個(gè)特定于框架的庫(kù),并負(fù)責(zé)從ResourceManager協(xié)商資源,并與NodeManager一起工作來(lái)執(zhí)行和監(jiān)視這些任務(wù)。
ResourceManager有兩個(gè)主要組件:Scheduler和ApplicationsManager。
調(diào)度程序負(fù)責(zé)將資源分配給各種正在運(yùn)行的應(yīng)用程序,這些應(yīng)用程序受到容量,隊(duì)列等熟悉的限制。調(diào)度程序是純調(diào)度程序,因?yàn)樗粫?huì)監(jiān)視或跟蹤應(yīng)用程序的狀態(tài)。此外,由于應(yīng)用程序故障或硬件故障,它無(wú)法保證重啟失敗的任務(wù)。調(diào)度器根據(jù)應(yīng)用程序的資源需求執(zhí)行其調(diào)度功能; 它是基于資源容器的抽象概念來(lái)實(shí)現(xiàn)的,容器包含內(nèi)存,CPU,磁盤(pán),網(wǎng)絡(luò)等元素。
調(diào)度程序有一個(gè)可插拔策略,負(fù)責(zé)在各種隊(duì)列,應(yīng)用程序等之間對(duì)集群資源進(jìn)行分區(qū)。當(dāng)前調(diào)度程序(如CapacityScheduler和FairScheduler)將是插件的一些示例。
ApplicationsManager負(fù)責(zé)接受作業(yè)提交,協(xié)商執(zhí)行特定于應(yīng)用程序的ApplicationMaster的第一個(gè)容器,并提供失敗時(shí)重新啟動(dòng)ApplicationMaster容器的服務(wù)。每個(gè)應(yīng)用程序的ApplicationMaster負(fù)責(zé)從調(diào)度程序中協(xié)商適當(dāng)?shù)馁Y源容器,跟蹤其狀態(tài)并監(jiān)視進(jìn)度。
hadoop-2.x中的MapReduce 與以前的穩(wěn)定版本(hadoop-1.x)保持API兼容性。這意味著只需重新編譯,所有MapReduce作業(yè)仍應(yīng)在YARN之上保持不變。
YARN支持的概念,資源預(yù)留通過(guò)ReservationSystem,即允許用戶在指定時(shí)間資源和時(shí)間的限制(例如,截止日期),以及后備資源的配置文件,以確保重要jobs.The可預(yù)見(jiàn)的執(zhí)行組件ReservationSystem跟蹤資源過(guò)時(shí),對(duì)預(yù)留執(zhí)行準(zhǔn)入控制,并動(dòng)態(tài)指示底層調(diào)度程序確保預(yù)留滿員。
為了將YARN擴(kuò)展到幾千個(gè)節(jié)點(diǎn)之外,YARN 通過(guò)YARN Federation功能支持Federation的概念。Federation允許透明地將多個(gè)YARN(子)群集在一起,并使它們看起來(lái)像一個(gè)單一的大型群集。這可以用于實(shí)現(xiàn)更大規(guī)模,和/或允許將多個(gè)獨(dú)立的群集一起用于非常大的工作,或者對(duì)于所有人都具有容量的租戶。
總而言之,yarn是我們編寫(xiě)MapReduce必備的組件,起到了資源調(diào)度的作用,他還保證了datanode的高可用,而zookeeper又保證了yarn的高可用。
5. MapReduce
Hadoop MapReduce是一個(gè)軟件框架,用于輕松編寫(xiě)應(yīng)用程序,以可靠的容錯(cuò)方式在大型群集(數(shù)千個(gè)節(jié)點(diǎn))的大型商業(yè)硬件上并行處理大量數(shù)據(jù)(多TB數(shù)據(jù)集)。
MapReduce 作業(yè)通常將輸入數(shù)據(jù)集分成獨(dú)立的塊,由地圖任務(wù)以完全平行的方式進(jìn)行處理。框架對(duì)映射的輸出進(jìn)行排序,然后輸入到reduce任務(wù)。通常,作業(yè)的輸入和輸出都存儲(chǔ)在文件系統(tǒng)中。該框架負(fù)責(zé)調(diào)度任務(wù),監(jiān)控它們并重新執(zhí)行失敗的任務(wù)。
通常,計(jì)算節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)是相同的,即MapReduce框架和Hadoop分布式文件系統(tǒng)(請(qǐng)參閱HDFS體系結(jié)構(gòu)指南)在同一組節(jié)點(diǎn)上運(yùn)行。該配置允許框架在數(shù)據(jù)已經(jīng)存在的節(jié)點(diǎn)上有效地調(diào)度任務(wù),從而在整個(gè)集群中產(chǎn)生非常高的聚合帶寬。
MapReduce框架由單個(gè)主資源管理器,每個(gè)集群節(jié)點(diǎn)的一個(gè)從屬NodeManager和每個(gè)應(yīng)用程序的MRAppMaster組成(參見(jiàn)YARN體系結(jié)構(gòu)指南)。
最小程度上,應(yīng)用程序通過(guò)實(shí)現(xiàn)適當(dāng)?shù)慕涌诤?或抽象類來(lái)指定輸入/輸出位置并提供映射和減少函數(shù)。這些和其他作業(yè)參數(shù)構(gòu)成作業(yè)配置。
然后,Hadoop 作業(yè)客戶端將作業(yè)(jar /可執(zhí)行文件等)和配置提交給ResourceManager,然后負(fù)責(zé)將軟件/配置分發(fā)給從服務(wù)器,安排任務(wù)并監(jiān)控它們,向作業(yè)提供狀態(tài)和診斷信息,客戶。
盡管Hadoop框架是用Java?實(shí)現(xiàn)的,但MapReduce應(yīng)用程序不需要用Java編寫(xiě)。
總而言之,MapReduce始終計(jì)算架構(gòu),他負(fù)責(zé)分布式的運(yùn)算數(shù)據(jù),他的數(shù)據(jù)來(lái)源可以不僅僅來(lái)自于hdfs,傳統(tǒng)的計(jì)算是以計(jì)算服務(wù)為主,將數(shù)據(jù)放置在計(jì)算服務(wù)上進(jìn)行計(jì)算,而如今數(shù)據(jù)量飛速增長(zhǎng)的時(shí)代,這幾乎是一件不可能的事情,MapReduce就是為了解決這個(gè)現(xiàn)象而產(chǎn)生的計(jì)算框架,他執(zhí)行在各個(gè)數(shù)據(jù)節(jié)點(diǎn),并發(fā)計(jì)算,保證了數(shù)據(jù)處理的速度。
(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> partition-> sort -> group -> reduce -> <k3, v3> (output)
中間所有的環(huán)節(jié),我們都可以根據(jù)我們自己的業(yè)務(wù)邏輯重寫(xiě)
1. map
逐行得到元數(shù)據(jù)并進(jìn)行拆分
2. combine
可以提前對(duì)map節(jié)點(diǎn)中的部分?jǐn)?shù)據(jù)進(jìn)行排序和合并,但是必須保證他的inputkey和outputkey一致,inputvalue和outputvalue一致,combine可以用于減少reduce的壓力。
3. partition
可以根據(jù)自己的規(guī)則將數(shù)據(jù)均勻劃分,分配給節(jié)點(diǎn)進(jìn)行運(yùn)算,默認(rèn)是hash值%節(jié)點(diǎn)數(shù)。
4. sort
可以根據(jù)自己的項(xiàng)目需求重寫(xiě)排序規(guī)則,當(dāng)你的mapreduce不為簡(jiǎn)單數(shù)據(jù)時(shí),你可以對(duì)他進(jìn)行重寫(xiě),已得到你想要的排序效果
5. group
將排序好的數(shù)據(jù)進(jìn)行分組,提供給reduce進(jìn)行計(jì)算,例如,你的key是a-b-c形式的數(shù)據(jù),你想將ab相同的分為同一組遞交給reduce,那么你可以在這里修改group的規(guī)則。
6. 自定義結(jié)構(gòu)類型
必須 implements WritableComparable,實(shí)現(xiàn)write(寫(xiě)序列化)、readFields(度序列化)、compareTo(比較)
7. sort、group、combine必須繼承WritableComparator,通過(guò)重寫(xiě)compare方法實(shí)現(xiàn)自己的邏輯
8. combine和reduce一樣,需要繼承Reducer
轉(zhuǎn)載于:https://blog.51cto.com/13854477/2360163
總結(jié)
以上是生活随笔為你收集整理的大数据学习之路(七)——学习小结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SDMemoryCache中的NSMap
- 下一篇: ROS 2 index翻译(七)——用C