<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          這一篇和大家聊聊Hadoop

          共 11819字,需瀏覽 24分鐘

           ·

          2021-11-24 06:25

          hello大家好 我是大家的學(xué)習(xí)成長小伙伴Captain



          我們作為一個(gè)資深的CV工程師,在開發(fā)中肯定或多或少的接觸過些許大數(shù)據(jù)的知識,也或多或少的去了解過這些大數(shù)據(jù)知識,在現(xiàn)在這個(gè)數(shù)據(jù)為王的時(shí)代,在現(xiàn)在這個(gè)數(shù)據(jù)量和數(shù)據(jù)級在日益增長的今天,大數(shù)據(jù)變得熾手可熱


          那么什么是大數(shù)據(jù)呢,以及我們最常聽說過的Hadoop、spark、storm、flink各自的優(yōu)缺點(diǎn)、擅長的方向都是什么呢,以及hive、HBASE這些都是如何基于hdfs存儲(chǔ)數(shù)據(jù)的,如何來分區(qū)數(shù)據(jù)的呢


          Hadoop中的hdfs到底是如何支持這么大量的數(shù)據(jù)存儲(chǔ)的,到底是什么結(jié)構(gòu),如何保證可靠性,而MapReduce又是如何進(jìn)行協(xié)調(diào)計(jì)算的,yarn是如何進(jìn)行相應(yīng)的資源管理的


          ZooKeeper是如何為分布式應(yīng)用進(jìn)行協(xié)調(diào)服務(wù)的,sqoop是如何把hive和傳統(tǒng)的數(shù)據(jù)庫進(jìn)行數(shù)據(jù)傳遞的呢,oozie和azkban都是如何進(jìn)行任務(wù)工作流調(diào)度的呢,底層都是如何工作的


          flume是如何基于流式結(jié)構(gòu)提供海量的日志采集、聚合和進(jìn)行傳輸?shù)哪兀鴎afka又是如何在眾多消息隊(duì)列中脫穎而出的呢,哦對了,還有我們以前說的rocketmq,這倆到底是啥區(qū)別,這倆貨的擅長的點(diǎn)都在哪里


          等等...


          各行各業(yè),都要活到老學(xué)到老,就像聯(lián)盟中的劍圣說過的一句話:真正的大師永遠(yuǎn)都懷著一顆學(xué)徒的心。A true master is an external student


          我們這一篇只是對大數(shù)據(jù)領(lǐng)域的Hadoop進(jìn)行簡單的了解,后續(xù)我們會(huì)持續(xù)對來和大家一起探討大數(shù)據(jù)領(lǐng)域的其它技術(shù)


          什么是大數(shù)據(jù)

          大數(shù)據(jù),指的就是大數(shù)據(jù)的集合,不能使用傳統(tǒng)的計(jì)算技術(shù)來處理,或者說無法在一定時(shí)間范圍內(nèi)來進(jìn)行處理,需要用更新的處理模式才可以更好的這些量很大的數(shù)據(jù)

          那么什么叫大數(shù)據(jù),首先應(yīng)該是數(shù)據(jù)量大,種類多,增長的很快,價(jià)值密度也很低,我們需要用相應(yīng)的技術(shù)來分析處理得出更有價(jià)值的數(shù)據(jù),就像我們上面說的那些技術(shù),可以合作工作更好的進(jìn)行數(shù)據(jù)的處理和分析

          數(shù)據(jù)量大

          數(shù)據(jù)集合的規(guī)模的不斷擴(kuò)大,已經(jīng)將數(shù)據(jù)從GB增加到TB、PB級別,甚至數(shù)據(jù)都要以EB和ZB來進(jìn)行計(jì)數(shù)

          數(shù)據(jù)時(shí)效性

          數(shù)據(jù)量的產(chǎn)生的速度也在持續(xù)的加快,人們現(xiàn)在使用網(wǎng)絡(luò)的頻率越來越高,也就是隨之產(chǎn)生的數(shù)據(jù)的速度越來越快,我們更需要根據(jù)數(shù)據(jù)來更快的進(jìn)行提取和分析,才能保證分析結(jié)果的時(shí)效性

          比如我們需要根據(jù)用戶的最近的瀏覽來分析出用戶的最近的喜好,來更好的推薦商品,也就是所謂的推薦系統(tǒng),那么如果這個(gè)推薦系統(tǒng)每天會(huì)進(jìn)來大量的數(shù)據(jù),但是分析的卻很慢,需要運(yùn)行一周,那這就很糟糕了啊,這分析出來的結(jié)果的可信度就很低了,時(shí)效性很差了就

          數(shù)據(jù)處理速度變得越來越快,處理模式已經(jīng)逐漸的從批處理轉(zhuǎn)向了流處理,即時(shí)效性越來越強(qiáng),我們每時(shí)每刻都在瀏覽抖音、淘寶,這些數(shù)據(jù)都會(huì)立刻通過推薦系統(tǒng),來給大家推薦出大家更想要的結(jié)果

          當(dāng)然,很多場景并不需要很好的時(shí)效性,可能一周或者一個(gè)月都能在接受的范圍內(nèi),比如統(tǒng)計(jì)報(bào)表這種,這些就是批處理的強(qiáng)項(xiàng)了

          數(shù)據(jù)多樣性

          大數(shù)據(jù)的數(shù)據(jù)類型繁多,傳統(tǒng)的IT行業(yè)產(chǎn)生和處理的數(shù)據(jù)可能通過簡單的數(shù)據(jù)類型處理就可以,大部分都是結(jié)構(gòu)化數(shù)據(jù),而隨著物聯(lián)網(wǎng)的越來越深入,各行各業(yè)都在引入互聯(lián)網(wǎng),產(chǎn)生的數(shù)據(jù)也更加多樣化,需要更多的圖片、數(shù)據(jù)這些非結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行存儲(chǔ)

          于是就有了MongoDB這種存儲(chǔ)非結(jié)構(gòu)化的數(shù)據(jù)的數(shù)據(jù)庫,各種數(shù)據(jù)層出不窮,也就更需要對這些數(shù)據(jù)進(jìn)行分析

          數(shù)據(jù)價(jià)值低

          由于數(shù)據(jù)量的不斷加大,單位數(shù)據(jù)的價(jià)值密度也就變得更低,然而數(shù)據(jù)的總體價(jià)值還是在增加的,于是我們?nèi)绾卧诿芏雀偷拇罅繑?shù)據(jù)中提取出那些有用的數(shù)據(jù)變得尤為重要

          了解Hadoop

          大家可能或多或少的了解多Hadoop這個(gè)技術(shù)框架,這個(gè)屬于大數(shù)據(jù)領(lǐng)域最主流的一套技術(shù)體系了,用Java編寫的一個(gè)Apache技術(shù)開源框架,允許使用簡單的編程模型就可以通過計(jì)算機(jī)集群進(jìn)行分布式處理大型的數(shù)據(jù)集合

          Hadoop框架的目的在于從單個(gè)服務(wù)器擴(kuò)展到數(shù)千個(gè)服務(wù)器,每個(gè)都提供者本地計(jì)算和本地存儲(chǔ)的功能,突出一個(gè)集中力量辦大事

          Hadoop主要包含hdfs分布式文件存儲(chǔ)系統(tǒng)、yarn分布式資源調(diào)度系統(tǒng)、MapReduce分布式計(jì)算系統(tǒng),這幾個(gè)家伙都是各有各的本事,每個(gè)都身懷絕技,下面我們會(huì)對這幾個(gè)身懷絕技的家伙進(jìn)行分析一番,看看這些絕技到底是如何煉成的

          我們從一個(gè)系統(tǒng)開始分析,系統(tǒng)小的時(shí)候,使用數(shù)據(jù)庫mysql和MongoDB就沒問題,mysql存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù),MongoDB存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù),然后使用redis進(jìn)行數(shù)據(jù)的緩存增加系統(tǒng)的速度和性能

          我們假設(shè)使用的mysql服務(wù)器的磁盤可以存儲(chǔ)1TB的數(shù)據(jù),但是我們不能保證數(shù)據(jù)量一直在1TB之內(nèi)啊

          隨著系統(tǒng)的業(yè)務(wù)越來越大,1TB的數(shù)據(jù)庫已經(jīng)完全不夠數(shù)據(jù)的存儲(chǔ)了,咋辦,加機(jī)器,分庫分表,每個(gè)服務(wù)器放一部分?jǐn)?shù)據(jù)

          分庫分表也就隨之帶來了更多的問題,比如我們需要保證保證數(shù)據(jù)能夠準(zhǔn)確的找到相應(yīng)的機(jī)器,也能夠準(zhǔn)確的存儲(chǔ)到相應(yīng)的機(jī)器上,一般由垂直切分和水平切分兩種思路

          再比如涉及到跨表的join的問題,因?yàn)榛诩軜?gòu)規(guī)范和安全性這些考慮,一般是禁止跨庫join這種的,可以采用全局表和字段冗余的方式解決,全局表就是將一些系統(tǒng)中幾乎所有模塊都可能依賴的一些表,讓每個(gè)機(jī)器都存儲(chǔ)一份,這樣就可以很好的避免跨庫join。字段冗余就是把相同的字段多存儲(chǔ)幾份咯,總的來說思路就是用空間換時(shí)間的一種思想

          岔劈了,分庫分表可以用來解決一些必要數(shù)據(jù)的存儲(chǔ),但是比如一些無關(guān)緊要的數(shù)據(jù),但是又有一些提取的價(jià)值,比如用戶在某電商網(wǎng)站在APP或者網(wǎng)站的點(diǎn)擊、購買和瀏覽的行為日志,這些肯定是沒必要全部存儲(chǔ)到mysql的,我們需要保存的是經(jīng)過推薦系統(tǒng)分析之后的數(shù)據(jù),而這些日常的行為數(shù)據(jù)沒必要去全量保存到mysql中的

          沒必要保存到mysql并不意味著不需要保存,Hadoop中的hdfs就是干這個(gè)的,負(fù)責(zé)把這些大量的數(shù)據(jù)保存起來,只需要在機(jī)器上部署上Hadoop服務(wù)即可,機(jī)器是很廉價(jià)的,后續(xù)這種數(shù)據(jù)直接加機(jī)器就可以了

          某天leader來了,要看一個(gè)報(bào)表,如果這些"臟數(shù)據(jù)"全部存儲(chǔ)到mysql中,可能需要寫一個(gè)幾百行甚至上千行的SQL才能拿到結(jié)果,幾百行的SQL直接執(zhí)行在分庫分表的架構(gòu)上,這就有點(diǎn)扯了

          更何況,mysql還存儲(chǔ)了大量的無用數(shù)據(jù),我們需要讓專業(yè)的人辦專業(yè)的事

          于是各種處理這種數(shù)據(jù)量極其大的各種技術(shù)應(yīng)運(yùn)而生,大數(shù)據(jù)分析就涉及到實(shí)時(shí)性這個(gè)特點(diǎn),我們上面也說過了

          實(shí)時(shí)性要求不高的可以用批處理進(jìn)行稍微較慢的處理,而實(shí)時(shí)性要求較高的場景則需要用流式處理來進(jìn)行分析,達(dá)到一種幾乎實(shí)時(shí)的效果

          說說主角Hadoop

          Hadoop分為四個(gè)模塊,common、hdfs、yarn、MapReduce這四個(gè)

          ? ? ? ? ? ?

          common:Hadoop模塊需要的Java庫和實(shí)用程序,這些庫等同于是實(shí)現(xiàn)各種功能的地基

          hdfs:分布式文件存儲(chǔ)系統(tǒng),像文件夾一樣存儲(chǔ),數(shù)據(jù)在hdfs中就像存儲(chǔ)在本地磁盤上一樣,而實(shí)際上文件會(huì)被切分成很多的小塊,然后分布到各個(gè)機(jī)器中

          yarn:作業(yè)調(diào)度和集群資源管理的一個(gè)框架

          MapReduce:用于并行處理大數(shù)據(jù)的計(jì)算系統(tǒng),可分為map和reduce兩個(gè)重要任務(wù)來協(xié)作完成數(shù)據(jù)的處理

          Hadoop特點(diǎn)

          高擴(kuò)容能力,支持超大的文件,能夠支持存儲(chǔ)和處理超大數(shù)據(jù)量

          成本低,只需要購買普通的機(jī)器部署Hadoop服務(wù),組成Hadoop集群即可進(jìn)行存儲(chǔ)和處理數(shù)據(jù),服務(wù)群可達(dá)數(shù)千個(gè)節(jié)點(diǎn)

          高效率,通過多個(gè)機(jī)器進(jìn)行分布式處理,可以讓性能更好的服務(wù)器并行地處理數(shù)據(jù),然后把處理結(jié)果進(jìn)行合并即可,而且Hadoop可以在節(jié)點(diǎn)之間動(dòng)態(tài)的移動(dòng)弄個(gè)數(shù)據(jù),保證各個(gè)節(jié)點(diǎn)之間的動(dòng)態(tài)平衡

          可靠性,大文件的數(shù)據(jù)的存儲(chǔ)會(huì)被切分成多個(gè)數(shù)據(jù)塊分別存儲(chǔ)到不同的機(jī)器上,而每個(gè)數(shù)據(jù)塊存儲(chǔ)都不支一塊,且多塊不會(huì)存儲(chǔ)在同一個(gè)機(jī)器上,保證了數(shù)據(jù)的高可靠性

          Hadoop更適合于那種寫一次,讀多次的業(yè)務(wù)場景,Hadoop是不支持?jǐn)?shù)據(jù)級別的修改的,只支持到文件級別的操作

          我們在使用Hadoop的過程中的感覺其實(shí)也是像在操作一個(gè)云上的電腦磁盤,也提供了豐富的API供我們直接使用

          適合場景

          • 大規(guī)模數(shù)據(jù)

          • 流式數(shù)據(jù),然后寫一次讀多次的場景

          • 商用的普通硬件即可


          不適合場景

          • 低延時(shí)的業(yè)務(wù)場景

          • 大量的小文件數(shù)據(jù)

          • 頻繁的修改數(shù)據(jù)


          總之,Hadoop很強(qiáng),但是并不是適合所有的業(yè)務(wù)場景,再時(shí)髦的技術(shù)都是隨著業(yè)務(wù)誕生的,脫離了業(yè)務(wù)的技術(shù)就像是沒了靈魂的軀殼,是沒有意義滴

          接下來我們看Hadoop其中的部分組件是如何各顯神通

          HDFS

          hdfs是啥

          hdfs這個(gè)的神通就是能夠完成巨大數(shù)據(jù)量的存儲(chǔ)功能

          只需要加機(jī)器就可以完成更多的數(shù)據(jù)存儲(chǔ)

          對外提供文件目錄,我們只需要用對外開放的API直接像操作文件夾是的操作即可

          hdfs就像是一個(gè)適配器,底層多個(gè)硬盤空間,累加到一起,然后對外就是一個(gè)/usr/tmp/captain.mp4這樣的文件訪問目錄

          hdfs內(nèi)部原理

          hdfs就是一個(gè)文件系統(tǒng),用于存儲(chǔ)文件,通過目錄樹來定位文件,它是屬于一個(gè)分布式的,由很多服務(wù)器聯(lián)合起來來實(shí)現(xiàn)相應(yīng)的功能

          hdfs的設(shè)計(jì)適合的是一次寫入,多次讀出的場景,并且不支持文件的修改,只支持文件級別的修改,就是可以對文件整體進(jìn)行操作

          hdfs的角色

          • NameNode:負(fù)責(zé)處理client的請求、元數(shù)據(jù)管理等功能

          • DataNode:主要用來存儲(chǔ)文件塊,并且向NameNode匯報(bào)存儲(chǔ)信息

          • Client:客戶端,和NameNode、DateNode進(jìn)行交互的

          • SecondaryNamenode:分擔(dān)NameNode的壓力,但是并不能替代,主要是進(jìn)行元數(shù)據(jù)的合并


          切記,SecondaryNamenode是不能替代NameNode的,這一點(diǎn)不像是平時(shí)那種主從架構(gòu),主掛了,從可以升為從的那種,很多小伙伴可能會(huì)混淆


          Client


          上傳文件,向NameNode發(fā)送寫請求


          進(jìn)行數(shù)據(jù)的切塊,默認(rèn)128M一塊


          讀取文件,向NameNode發(fā)送讀取請求


          NameNode


          接收客戶端的讀寫請求,進(jìn)行數(shù)據(jù)庫元數(shù)據(jù)位置的存儲(chǔ)


          分配數(shù)據(jù)塊的存儲(chǔ)節(jié)點(diǎn)


          接收DataNode的數(shù)據(jù)匯報(bào),因?yàn)閿?shù)據(jù)是存儲(chǔ)到DataNode的,但是它也就是個(gè)存數(shù)據(jù)的,至于它存儲(chǔ)哪些都需要NameNode進(jìn)行管理,并未要匯報(bào)給NameNode


          DataNode


          真正的數(shù)據(jù)存儲(chǔ),每個(gè)數(shù)據(jù)塊存儲(chǔ)的還不止一份,默認(rèn)每個(gè)塊是存儲(chǔ)3份


          真正的處理用戶的讀寫請求的,就是真正干活的,拿出數(shù)據(jù)來的


          向NameNode發(fā)送心跳和匯報(bào)相應(yīng)的數(shù)據(jù)塊的存儲(chǔ)信息


          SecondaryNamenode


          備份NameNode的元數(shù)據(jù)信息


          幫助NameNode進(jìn)行元數(shù)據(jù)的合并,減輕NameNode的壓力


          hdfs的優(yōu)點(diǎn)

          高容錯(cuò)性:默認(rèn)會(huì)存儲(chǔ)三份備份數(shù)據(jù),增加容錯(cuò)性,副本丟失,可以自動(dòng)恢復(fù)

          適合大數(shù)據(jù)處理:可以通過增加機(jī)器的方式來進(jìn)行更高級別數(shù)據(jù)的存儲(chǔ)的處理

          hdfs缺點(diǎn)

          不適合低延時(shí)數(shù)據(jù)的訪問,毫秒級別的存儲(chǔ)數(shù)據(jù)是做不到的

          不擅長處理大量小文件,無法對大量小文件進(jìn)行存儲(chǔ)

          不支持多線程寫入文件

          shell操作示例

          //基本語法bin/hadoop fs 具體命令  
          //查看指定目錄下內(nèi)容hadoop fs –ls [文件目錄]
          //顯示文件內(nèi)容hadoop dfs –cat [file_path]
          //將本地文件存儲(chǔ)至hadoophadoop fs –put [本地地址] [hadoop目錄]
          //將hadoop上某個(gè)文件down至本地已有目錄下hadoop fs -get [文件目錄] [本地目錄]
          //刪除hadoop上指定文件或文件夾hadoop fs –rm [文件地址]
          //刪除hadoop上指定文件夾(包含子目錄等hadoop fs –rm [目錄地址]
          //在hadoop指定目錄內(nèi)創(chuàng)建新目錄hadoop fs –mkdir /user/t
          //在hadoop指定目錄下新建一個(gè)空文件hadoop?fs?-touchz??/user/new.txt
          //將hadoop上某個(gè)文件重命名hadoop?fs?–mv??/user/test.txt??/user/ok.txt???(將test.txt重命名為ok.txt)
          //將hadoop指定目錄下所有內(nèi)容保存為一個(gè)文件,同時(shí)down至本地hadoop fs –getmerge /user /home/t
          //將正在運(yùn)行的hadoop作業(yè)kill掉hadoop job –kill [job-id]
          //輸出這個(gè)命令參數(shù)hadoop fs -help rm
          //從本地剪切粘貼到HDFShadoop fs -moveFromLocal ./kongming.txt /sanguo/shuguo
          //追加一個(gè)文件到已經(jīng)存在的文件末尾hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
          //Linux文件系統(tǒng)中的用法一樣,修改文件所屬權(quán)限hadoop?fs??-chmod??666??/sanguo/shuguo/kongming.txt
          //從本地文件系統(tǒng)中拷貝文件到HDFS路徑去hadoop?fs?-copyFromLocal?README.txt?/
          //從HDFS拷貝到本地hadoop?fs?-copyToLocal?/sanguo/shuguo/kongming.txt?./
          //從HDFS的一個(gè)路徑拷貝到HDFS的另一個(gè)路徑hadoop?fs?-cp?/sanguo/shuguo/kongming.txt?/zhuge.txt
          //顯示一個(gè)文件的末尾hadoop fs -tail /sanguo/shuguo/kongming.txt
          //刪除空目錄hadoop fs -rmdir /test
          //設(shè)置HDFS中文件的副本數(shù)量hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt


          Java的API操作示例

          ????//HDFS文件上傳    public void testPut() throws Exception {          Configuration configuration = new Configuration();          FileSystem fileSystem = FileSystem.get(                  new URI("hdfs://hadoop102:9000"),                  configuration,                  "drift");  
          fileSystem.copyFromLocalFile( new Path("f:/hello.txt"), new Path("/0308_666/hello1.txt")); fileSystem.close(); ????}?????????//HDFS文件下載 public void testDownload() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 執(zhí)行下載操作 fileSystem.copyToLocalFile( false, new Path("/0308_666/hello.txt"), new Path("f:/hello1.txt"), true); // 3 關(guān)閉資源 fileSystem.close(); System.out.println("over"); }
          ????//HDFS文件夾刪除 public void delete() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 執(zhí)行刪除操作 fileSystem.delete(new Path("/0308_777"), true); // 3 關(guān)閉資源 fileSystem.close(); System.out.println("over"); }????????//HDFS文件夾名更改 public void testRename() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 執(zhí)行重命名操作 fileSystem.rename(new Path("/0308_666/hello.txt"), new Path("/0308_666/hello2.txt")); // 3 關(guān)閉資源 fileSystem.close(); System.out.println("over"); }????????//HDFS文件詳情查看 public void testLS1() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 查詢文件信息 RemoteIterator listFiles = fileSystem.listFiles(new Path("/"), true); while (listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); // 文件的長度 System.out.println(fileStatus.getLen()); // 文件的名字 System.out.println(fileStatus.getPath().getName()); // 文件的權(quán)限 System.out.println(fileStatus.getPermission()); BlockLocation[] locations = fileStatus.getBlockLocations(); for (BlockLocation location : locations) { String[] hosts = location.getHosts(); for (String host : hosts) { System.out.println(host); } } System.out.println("---------------分割線---------------"); } // 3 關(guān)閉資源 fileSystem.close(); }????????//HDFS文件和文件夾判斷 public void testLS2() throws Exception { // 1 獲取文件系統(tǒng) Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get( new URI("hdfs://hadoop102:9000"), configuration, "drift"); // 2 文件和文件夾的判斷 FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/")); for (FileStatus fileStatus : fileStatuses) { if (fileStatus.isFile()) { System.out.println("F:" + fileStatus.getPath().getName()); } else { System.out.println("D:" + fileStatus.getPath().getName()); } } // 3 關(guān)閉資源 fileSystem.close(); }

          Yarn

          yarn是什么

          yarn屬于Hadoop的資源管理系統(tǒng),基本設(shè)計(jì)思路是分為一個(gè)全局的資源管理器ResourceManager和每個(gè)應(yīng)用程序持有的ApplicationMaster,還有一個(gè)節(jié)點(diǎn)的資源管理器NodeManager


          yarn組成結(jié)構(gòu)

          YARN總體上仍然是Master/Slave結(jié)構(gòu)

          在整個(gè)資源管理框架中,ResourceManagerMaster,NodeManagerSlave,ResourceManager負(fù)責(zé)對各個(gè)NodeManager上的資源進(jìn)行統(tǒng)一管理和調(diào)度

          當(dāng)用戶提交一個(gè)應(yīng)用程序時(shí),需要提供一個(gè)用以跟蹤和管理這個(gè)程序的ApplicationMaster,它負(fù)責(zé)向ResourceManager申請資源,并要求NodeManger啟動(dòng)可以占用一定資源的任務(wù)。由于不同的ApplicationMaster被分布到不同的節(jié)點(diǎn)上,因此它們之間不會(huì)相互影響

          ResourceManager

          ?

          RM是一個(gè)全局的資源管理器,負(fù)責(zé)整個(gè)系統(tǒng)的資源管理和分配。它主要由兩個(gè)組件構(gòu)成:調(diào)度器和應(yīng)用程序管理器

          ?

          調(diào)度器

          ?

          調(diào)度器根據(jù)容量、隊(duì)列等限制條件(如每個(gè)隊(duì)列分配一定的資源,最多執(zhí)行一定數(shù)量的作業(yè)等),將系統(tǒng)中的資源分配給各個(gè)正在運(yùn)行的應(yīng)用程序


          該調(diào)度器是一個(gè)純調(diào)度器,它不再從事任何與具體應(yīng)用程序相關(guān)的工作,這些工作均交給應(yīng)用程序相關(guān)的ApplicationMaster


          調(diào)度器僅根據(jù)各個(gè)應(yīng)用程序的資源需求進(jìn)行資源分配,該調(diào)度器是一個(gè)可插拔的組件,用戶可根據(jù)自己的需要設(shè)計(jì)新的調(diào)度器,YARN提供了多種直接可用的調(diào)度器,比如Fair SchedulerCapacity Scheduler

          ?

          應(yīng)用程序管理器

          ?

          應(yīng)用程序管理器負(fù)責(zé)管理整個(gè)系統(tǒng)中所有應(yīng)用程序,包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動(dòng)ApplicationMaster、監(jiān)控ApplicationMaster運(yùn)行狀態(tài)并在失敗時(shí)重新啟動(dòng)它等

          ?

          ApplicationMaster

          ?

          用戶提交的每個(gè)應(yīng)用程序均包含一個(gè)AM,與RM調(diào)度器協(xié)商以獲取資源(Container表示),將得到的任務(wù)進(jìn)一步分配給內(nèi)部的任務(wù)

          ?

          與NM通信以啟動(dòng)/停止任務(wù)

          ?

          監(jiān)控所有任務(wù)運(yùn)行狀態(tài),并在任務(wù)運(yùn)行失敗時(shí)重新為任務(wù)申請資源以重啟任務(wù)

          ?

          NodeManager

          ?

          NM是每個(gè)節(jié)點(diǎn)上的資源和任務(wù)管理器


          一方面,它會(huì)定時(shí)地向RM匯報(bào)本節(jié)點(diǎn)上的資源使用情況和各個(gè)Container的運(yùn)行狀態(tài)


          另一方面,它接收并處理來自AMContainer啟動(dòng)/停止等各種請求

          ?

          Container

          ?

          Container是YARN中的資源抽象,它封裝了某個(gè)節(jié)點(diǎn)上的多維度資源,如內(nèi)存、CPU、磁盤等,當(dāng)AMRM申請資源時(shí),RMAM返回的資源便是用Container表示的


          YARN會(huì)為每個(gè)任務(wù)分配一個(gè)Container,且該任務(wù)只能使用該Container中描述的資源

          MapReduce

          什么是MapReduce

          MapReduce是一個(gè)分布式運(yùn)算程序的編程框架,是用戶開發(fā)基于hadoop的數(shù)據(jù)分析應(yīng)用的核心框架

          Mapreduce核心功能是將用戶編寫的業(yè)務(wù)邏輯代碼和自帶默認(rèn)組件整合成一個(gè)完整的分布式運(yùn)算程序,并發(fā)運(yùn)行在一個(gè)hadoop集群上

          海量數(shù)據(jù)在單機(jī)上處理因?yàn)橛布Y源限制,無法勝任,引入mapreduce框架后,可以很好的處理多個(gè)機(jī)器的資源來進(jìn)行計(jì)算,開發(fā)人員可以將絕大部分工作集中在業(yè)務(wù)邏輯的開發(fā)上,而將分布式計(jì)算中的復(fù)雜性交由框架來處理。

          mapreduce就是這樣一個(gè)分布式程序的通用框架


          優(yōu)點(diǎn)

          MapReduce 易于編程:簡單的實(shí)現(xiàn)一些接口,就可以完成一個(gè)分布式程序,這個(gè)分布式程序可以分布到大量廉價(jià)的PC機(jī)器上運(yùn)行


          良好的擴(kuò)展性:當(dāng)你的計(jì)算資源不能得到滿足的時(shí)候,你可以通過簡單的增加機(jī)器來擴(kuò)展它的計(jì)算能力


          高容錯(cuò)性:其中一臺(tái)機(jī)器掛了,它可以把上面的計(jì)算任務(wù)轉(zhuǎn)移到另外一個(gè)節(jié)點(diǎn)上運(yùn)行,不至于這個(gè)任務(wù)運(yùn)行失敗,而且這個(gè)過程不需要人工參與,而完全是由Hadoop內(nèi)部完成的


          適合PB級以上海量數(shù)據(jù)的離線處理:可以實(shí)現(xiàn)上千臺(tái)服務(wù)器集群并發(fā)工作,提供數(shù)據(jù)處理能力


          缺點(diǎn)

          不擅長實(shí)時(shí)計(jì)算:MapReduce無法像Mysql一樣,在毫秒或者秒級內(nèi)返回結(jié)果


          不擅長流式計(jì)算:流式計(jì)算的輸入數(shù)據(jù)是動(dòng)態(tài)的,而MapReduce的輸入數(shù)據(jù)集是靜態(tài)的,不能動(dòng)態(tài)變化。這是因?yàn)?/span>MapReduce自身的設(shè)計(jì)特點(diǎn)決定了數(shù)據(jù)源必須是靜態(tài)的

          Hadoop中的數(shù)據(jù)壓縮

          壓縮技術(shù)能夠有效減少底層存儲(chǔ)系統(tǒng)(HDFS)讀寫字節(jié)數(shù)。壓縮提高了網(wǎng)絡(luò)帶寬和磁盤空間的效率


          Hadoop下,尤其是數(shù)據(jù)規(guī)模很大和工作負(fù)載密集的情況下,使用數(shù)據(jù)壓縮顯得非常重要。在這種情況下,I/O操作和網(wǎng)絡(luò)數(shù)據(jù)傳輸要花大量的時(shí)間


          鑒于磁盤I/O和網(wǎng)絡(luò)帶寬是Hadoop的寶貴資源,數(shù)據(jù)壓縮對于節(jié)省資源、最小化磁盤I/O和網(wǎng)絡(luò)傳輸非常有幫助,如果磁盤I/O和網(wǎng)絡(luò)帶寬影響了MapReduce作業(yè)性能,在任意MapReduce階段啟用壓縮都可以改善端到端處理時(shí)間并減少I/O和網(wǎng)絡(luò)流量


          壓縮Mapreduce的一種優(yōu)化策略:通過壓縮編碼對Mapper或者Reducer的輸出進(jìn)行壓縮,以減少磁盤IO,提高MR程序運(yùn)行速度(但相應(yīng)增加了cpu運(yùn)算負(fù)擔(dān))


          注意:采用壓縮技術(shù)減少了磁盤IO,但同時(shí)增加了CPU運(yùn)算負(fù)擔(dān)。所以,壓縮特性運(yùn)用得當(dāng)能提高性能,但運(yùn)用不當(dāng)也可能降低性能



          運(yùn)算密集型的job,少用壓縮


          IO密集型的job,多用壓縮

          結(jié)束語


          感謝大家能夠做我最初的讀者和傳播者,請大家相信,只要你給我一份愛,我終究會(huì)還你們一頁情的。


          Captain會(huì)持續(xù)更新技術(shù)文章,和生活中的暴躁文章,歡迎大家關(guān)注【Java賊船】,成為船長的學(xué)習(xí)小伙伴,和船長一起乘千里風(fēng)、破萬里浪


          哦對了,后續(xù)所有的文章都會(huì)更新到這里


          https://github.com/DayuMM2021/Java





          瀏覽 68
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产制服丝袜操视频网站 | 91在线无码精品秘 豆花 | 婷婷色中文网 | 78成人视频 | 丁香五月天婷婷婷 |