HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    簡(jiǎn)述hadoop工作原理(hadoop工作原理圖)

    發(fā)布時(shí)間:2023-04-21 21:44:59     稿源: 創(chuàng)意嶺    閱讀: 53        

    大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于簡(jiǎn)述hadoop工作原理的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。

    開(kāi)始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫(xiě)出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端

    官網(wǎng):https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    簡(jiǎn)述hadoop工作原理(hadoop工作原理圖)

    一、hadoop是分布式文件系統(tǒng)嗎

    是的

    Hadoop分布式文件系統(tǒng)(HDFS)是一種被設(shè)計(jì)成適合運(yùn)行在通用硬件上的分布式文件系統(tǒng)。HDFS是一個(gè)高度容錯(cuò)性的系統(tǒng),適合部署在廉價(jià)的機(jī)器上。它能提供高吞吐量的數(shù)據(jù)訪問(wèn),非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。要理解HDFS的內(nèi)部工作原理,首先要理解什么是分布式文件系統(tǒng)。

    1.分布式文件系統(tǒng)

    多臺(tái)計(jì)算機(jī)聯(lián)網(wǎng)協(xié)同工作(有時(shí)也稱為一個(gè)集群)就像單臺(tái)系統(tǒng)一樣解決某種問(wèn)題,這樣的系統(tǒng)我們稱之為分布式系統(tǒng)。

    分布式文件系統(tǒng)是分布式系統(tǒng)的一個(gè)子集,它們解決的問(wèn)題就是數(shù)據(jù)存儲(chǔ)。換句話說(shuō),它們是橫跨在多臺(tái)計(jì)算機(jī)上的存儲(chǔ)系統(tǒng)。存儲(chǔ)在分布式文件系統(tǒng)上的數(shù)據(jù)自動(dòng)分布在不同的節(jié)點(diǎn)上。

    分布式文件系統(tǒng)在大數(shù)據(jù)時(shí)代有著廣泛的應(yīng)用前景,它們?yōu)榇鎯?chǔ)和處理來(lái)自網(wǎng)絡(luò)和其它地方的超大規(guī)模數(shù)據(jù)提供所需的擴(kuò)展能力。

    2.分離元數(shù)據(jù)和數(shù)據(jù):NameNode和DataNode

    存儲(chǔ)到文件系統(tǒng)中的每個(gè)文件都有相關(guān)聯(lián)的元數(shù)據(jù)。元數(shù)據(jù)包括了文件名、i節(jié)點(diǎn)(inode)數(shù)、數(shù)據(jù)塊位置等,而數(shù)據(jù)則是文件的實(shí)際內(nèi)容。

    在傳統(tǒng)的文件系統(tǒng)里,因?yàn)槲募到y(tǒng)不會(huì)跨越多臺(tái)機(jī)器,元數(shù)據(jù)和數(shù)據(jù)存儲(chǔ)在同一臺(tái)機(jī)器上。

    為了構(gòu)建一個(gè)分布式文件系統(tǒng),讓客戶端在這種系統(tǒng)中使用簡(jiǎn)單,并且不需要知道其他客戶端的活動(dòng),那么元數(shù)據(jù)需要在客戶端以外維護(hù)。HDFS的設(shè)計(jì)理念是拿出一臺(tái)或多臺(tái)機(jī)器來(lái)保存元數(shù)據(jù),并讓剩下的機(jī)器來(lái)保存文件的內(nèi)容。

    NameNode和DataNode是HDFS的兩個(gè)主要組件。其中,元數(shù)據(jù)存儲(chǔ)在NameNode上,而數(shù)據(jù)存儲(chǔ)在DataNode的集群上。NameNode不僅要管理存儲(chǔ)在HDFS上內(nèi)容的元數(shù)據(jù),而且要記錄一些事情,比如哪些節(jié)點(diǎn)是集群的一部分,某個(gè)文件有幾份副本等。它還要決定當(dāng)集群的節(jié)點(diǎn)宕機(jī)或者數(shù)據(jù)副本丟失的時(shí)候系統(tǒng)需要做什么。

    存儲(chǔ)在HDFS上的每份數(shù)據(jù)片有多份副本(replica)保存在不同的服務(wù)器上。在本質(zhì)上,NameNode是HDFS的Master(主服務(wù)器),DataNode是Slave(從服務(wù)器)。

    二、Hadoop到底是什么玩意

    Hadoop到底是個(gè)啥?

    答:Hadoop是基于廉價(jià)設(shè)備利用集群的威力對(duì)海量數(shù)據(jù)進(jìn)行安全存儲(chǔ)和高效計(jì)算的分布式存儲(chǔ)和分析框架,Hadoop本身是一個(gè)龐大的項(xiàng)目家族,其核心 家族或者底層是HDFS和MapReduce,HDFS和MapReduce分別用來(lái)實(shí)現(xiàn)對(duì)海量數(shù)據(jù)的存儲(chǔ)和分析,其它的項(xiàng)目,例如Hive、HBase 等都是基于HDFS和MapReduce,是為了解決特定類型的大數(shù)據(jù)處理問(wèn)題而提出的子項(xiàng)目,使用Hive、HBase等子項(xiàng)目可以在更高的抽象的基礎(chǔ)上更簡(jiǎn)單的編寫(xiě)分布式大數(shù)據(jù)處理程序。Hadoop的其它子項(xiàng)目還包括Common, Avro, Pig, ZooKeeper, Sqoop, Oozie 等,隨著時(shí)間的推移一些新的子項(xiàng)目會(huì)被加入進(jìn)來(lái),一些關(guān)注度不高的項(xiàng)目會(huì)被移除Hadoop家族,所以Hadoop是一個(gè)充滿活力的系統(tǒng)。

    Apache Hadoop: 是Apache開(kāi)源組織的一個(gè)分布式計(jì)算開(kāi)源框架,提供了一個(gè)分布式文件系統(tǒng)子項(xiàng)目(HDFS)和支持MapReduce分布式計(jì)算的軟件架構(gòu)。

    Apache Hive: 是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,通過(guò)類SQL語(yǔ)句快速實(shí)現(xiàn)簡(jiǎn)單的MapReduce統(tǒng)計(jì),不必開(kāi)發(fā)專門的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析。

    ApachePig: 是一個(gè)基于Hadoop的大規(guī)模數(shù)據(jù)分析工具,它提供的SQL-LIKE語(yǔ)言叫Pig Latin,該語(yǔ)言的編譯器會(huì)把類SQL的數(shù)據(jù)分析請(qǐng)求轉(zhuǎn)換為一系列經(jīng)過(guò)優(yōu)化處理的MapReduce運(yùn)算。

    ApacheHBase: 是一個(gè)高可靠性、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng),利用HBase技術(shù)可在廉價(jià)PC Server上搭建起大規(guī)模結(jié)構(gòu)化存儲(chǔ)集群。

    Apache Sqoop: 是一個(gè)用來(lái)將Hadoop和關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù)相互轉(zhuǎn)移的工具,可以將一個(gè)關(guān)系型數(shù)據(jù)庫(kù)(MySQL ,Oracle ,Postgres等)中的數(shù)據(jù)導(dǎo)進(jìn)到Hadoop的HDFS中,也可以將HDFS的數(shù)據(jù)導(dǎo)進(jìn)到關(guān)系型數(shù)據(jù)庫(kù)中。

    Apache Zookeeper: 是一個(gè)為分布式應(yīng)用所設(shè)計(jì)的分布的、開(kāi)源的協(xié)調(diào)服務(wù),它主要是用來(lái)解決分布式應(yīng)用中經(jīng)常遇到的一些數(shù)據(jù)管理問(wèn)題,簡(jiǎn)化分布式應(yīng)用協(xié)調(diào)及其管理的難度,提供高性能的分布式服務(wù) ApacheMahout:是基于Hadoop的機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘的一個(gè)分布式框架。Mahout用MapReduce實(shí)現(xiàn)了部分?jǐn)?shù)據(jù)挖掘算法,解決了并行挖掘的問(wèn)題。

    ApacheCassandra:是一套開(kāi)源分布式NoSQL數(shù)據(jù)庫(kù)系統(tǒng)。它最初由Facebook開(kāi)發(fā),用于儲(chǔ)存簡(jiǎn)單格式數(shù)據(jù),集Google BigTable的數(shù)據(jù)模型與AmazonDynamo的完全分布式的架構(gòu)于一身 Apache Avro: 是一個(gè)數(shù)據(jù)序列化系統(tǒng),設(shè)計(jì)用于支持?jǐn)?shù)據(jù)密集型,大批量數(shù)據(jù)交換的應(yīng)用。Avro是新的數(shù)據(jù)序列化格式與傳輸工具,將逐步取代Hadoop原有的IPC機(jī)制 ApacheAmbari: 是一種基于Web的工具,支持Hadoop集群的供應(yīng)、管理和監(jiān)控。

    ApacheChukwa: 是一個(gè)開(kāi)源的用于監(jiān)控大型分布式系統(tǒng)的數(shù)據(jù)收集系統(tǒng),它可以將各種各樣類型的數(shù)據(jù)收集成適合 Hadoop 處理的文件保存在 HDFS 中供Hadoop 進(jìn)行各種 MapReduce 操作。

    ApacheHama: 是一個(gè)基于HDFS的BSP(Bulk Synchronous Parallel)并行計(jì)算框架, Hama可用于包括圖、矩陣和網(wǎng)絡(luò)算法在內(nèi)的大規(guī)模、大數(shù)據(jù)計(jì)算。

    ApacheFlume: 是一個(gè)分布的、可靠的、高可用的海量日志聚合的系統(tǒng),可用于日志數(shù)據(jù)收集,日志數(shù)據(jù)處理,日志數(shù)據(jù)傳輸。

    ApacheGiraph: 是一個(gè)可伸縮的分布式迭代圖處理系統(tǒng), 基于Hadoop平臺(tái),靈感來(lái)自 BSP (bulk synchronous parallel) 和Google 的 Pregel。

    ApacheOozie: 是一個(gè)工作流引擎服務(wù)器, 用于管理和協(xié)調(diào)運(yùn)行在Hadoop平臺(tái)上(HDFS、Pig和MapReduce)的任務(wù)。

    ApacheCrunch: 是基于Google的FlumeJava庫(kù)編寫(xiě)的Java庫(kù),用于創(chuàng)建MapReduce程序。與Hive,Pig類似,Crunch提供了用于實(shí)現(xiàn)如連接數(shù)據(jù)、執(zhí)行聚合和排序記錄等常見(jiàn)任務(wù)的模式庫(kù) ApacheWhirr: 是一套運(yùn)行于云服務(wù)的類庫(kù)(包括Hadoop),可提供高度的互補(bǔ)性。Whirr學(xué)支持Amazon EC2和Rackspace的服務(wù)。

    ApacheBigtop: 是一個(gè)對(duì)Hadoop及其周邊生態(tài)進(jìn)行打包,分發(fā)和測(cè)試的工具。

    ApacheHCatalog: 是基于Hadoop的數(shù)據(jù)表和存儲(chǔ)管理,實(shí)現(xiàn)中央的元數(shù)據(jù)和模式管理,跨越Hadoop和RDBMS,利用Pig和Hive提供關(guān)系視圖。

    ClouderaHue: 是一個(gè)基于WEB的監(jiān)控和管理系統(tǒng),實(shí)現(xiàn)對(duì)HDFS,MapReduce/YARN, HBase, Hive, Pig的web化操作和管理。

    三、白話解釋hadoop是做什么的

    白話解釋hadoop是做什么的

    hadoop通常跟大資料幾個(gè)字聯(lián)絡(luò)在一起,他是apache下面的一個(gè)頂級(jí)專案,咱們解釋一下什么是大資料,大資料是相對(duì)于小資料、傳統(tǒng)資料來(lái)說(shuō)的,大資料要解決的是大規(guī)模資料儲(chǔ)存、大規(guī)模資料計(jì)算、大規(guī)模資料處理工具的一個(gè)東東,而hadoop生態(tài)系統(tǒng)就有這樣的功能,也是目前比較火的一個(gè)東東

    求解釋,白金會(huì)是做什么的啊

    岱宗夫如何?齊魯青未了。

    代理是做什么的?專業(yè)一點(diǎn)的解釋是做什么的?

    代理這么籠統(tǒng)的詞,是問(wèn)法律名詞還是問(wèn)實(shí)際產(chǎn)品運(yùn)作?回答就多了,只能舉例說(shuō)下:比如常州鴻爾太陽(yáng)能招代理商,分一級(jí)代理和二級(jí)代理,區(qū)域代理;還有不同的產(chǎn)品代理,比如太陽(yáng)能熱水器地區(qū)代理與太陽(yáng)能熱水工程的合作代理。各公司的營(yíng)銷模式不一樣,總體上就是你作為某個(gè)產(chǎn)品的某個(gè)區(qū)域的代理商,負(fù)責(zé)按照公司的營(yíng)銷思路運(yùn)營(yíng),自負(fù)盈虧。但你的一些與產(chǎn)品品牌有關(guān)的行為代表著公司及形象。

    he prove to be a man with a strong will. will是做什么的 ?怎么解釋?

    堅(jiān)強(qiáng)的意志。意志的意思。

    誰(shuí)解釋下 LOOKIT 商標(biāo)含義,是做什么的?

    那些噴的華為的 *** ,注冊(cè)了商標(biāo)而已,就在這里噴,華為mate 注冊(cè)了幾百個(gè)商標(biāo)了。出不出手機(jī)還兩說(shuō)。

    Arch Linux是做什么的? 求大神解釋啊~~

    一個(gè)linux核心的作業(yè)系統(tǒng)

    跟windows差不多的一個(gè)東西,裝什么軟體就能做什么事情,但是系統(tǒng)本身只是一個(gè)平臺(tái),什么都不干

    IT專員是做什么的?解釋一下

    IT即電子營(yíng)銷。IT人員是從事相關(guān)工作的開(kāi)發(fā),設(shè)計(jì),銷售的專業(yè)人員專業(yè)的定義很廣,依企業(yè)給的許可權(quán)來(lái)設(shè)定一般從事銷售工作都會(huì)掛一個(gè)專員的頭銜,即可以單獨(dú)處理客戶訂單的指定營(yíng)銷人員。謝謝采納!

    用英文解釋secretary(秘書(shū))是做什么的

    is a person whose work consists of supporting management, including executives, using a variety of project management, munication & anizational skills.

    求解釋!律伴平臺(tái)是做什么的嗎?

    是一個(gè)公益性的法律平臺(tái),上面有各地區(qū)的律師,有什么不懂的法律問(wèn)題,可以去免費(fèi)咨詢。

    試客聯(lián)盟是做什么的呢?求解釋

    是全球企業(yè)在中國(guó)首選的體驗(yàn)營(yíng)銷網(wǎng)站。試客聯(lián)盟是基于新一代網(wǎng)際網(wǎng)路技術(shù)應(yīng)用平臺(tái)和專業(yè)的精準(zhǔn)營(yíng)銷網(wǎng)站,專注于體驗(yàn)時(shí)代新?tīng)I(yíng)銷模式的運(yùn)營(yíng)和開(kāi)拓,是一家專業(yè)以試用為媒介而進(jìn)行的網(wǎng)路精準(zhǔn)營(yíng)銷和口碑營(yíng)銷的專業(yè)入口網(wǎng)站。

    四、Hadoop讀寫(xiě)文件時(shí)內(nèi)部工作機(jī)制是怎樣的

    客戶端通過(guò)調(diào)用FileSystem對(duì)象(對(duì)應(yīng)于HDFS文件系統(tǒng),調(diào)用DistributedFileSystem對(duì)象)的open()方法來(lái)打開(kāi)文件(也即圖中的第一步),DistributedFileSystem通過(guò)RPC(Remote Procedure Call)調(diào)用詢問(wèn)NameNode來(lái)得到此文件最開(kāi)始幾個(gè)block的文件位置(第二步)。對(duì)每一個(gè)block來(lái)說(shuō),namenode返回?fù)碛写薭lock備份的所有namenode的地址信息(按集群的拓?fù)渚W(wǎng)絡(luò)中與客戶端距離的遠(yuǎn)近排序,關(guān)于在Hadoop集群中如何進(jìn)行網(wǎng)絡(luò)拓?fù)湔?qǐng)看下面介紹)。如果客戶端本身就是一個(gè)datanode(如客戶端是一個(gè)mapreduce任務(wù))并且此datanode本身就有所需文件block的話,客戶端便從本地讀取文件。

    以上步驟完成后,DistributedFileSystem會(huì)返回一個(gè)FSDataInputStream(支持文件seek),客戶端可以從FSDataInputStream中讀取數(shù)據(jù)。FSDataInputStream包裝了一個(gè)DFSInputSteam類,用來(lái)處理namenode和datanode的I/O操作。

    客戶端然后執(zhí)行read()方法(第三步),DFSInputStream(已經(jīng)存儲(chǔ)了欲讀取文件的開(kāi)始幾個(gè)block的位置信息)連接到第一個(gè)datanode(也即最近的datanode)來(lái)獲取數(shù)據(jù)。通過(guò)重復(fù)調(diào)用read()方法(第四、第五步),文件內(nèi)的數(shù)據(jù)就被流式的送到了客戶端。當(dāng)讀到該block的末尾時(shí),DFSInputStream就會(huì)關(guān)閉指向該block的流,轉(zhuǎn)而找到下一個(gè)block的位置信息然后重復(fù)調(diào)用read()方法繼續(xù)對(duì)該block的流式讀取。這些過(guò)程對(duì)于用戶來(lái)說(shuō)都是透明的,在用戶看來(lái)這就是不間斷的流式讀取整個(gè)文件。

    當(dāng)真?zhèn)€文件讀取完畢時(shí),客戶端調(diào)用FSDataInputSteam中的close()方法關(guān)閉文件輸入流(第六步)。

    如果在讀某個(gè)block是DFSInputStream檢測(cè)到錯(cuò)誤,DFSInputSteam就會(huì)連接下一個(gè)datanode以獲取此block的其他備份,同時(shí)他會(huì)記錄下以前檢測(cè)到的壞掉的datanode以免以后再無(wú)用的重復(fù)讀取該datanode。DFSInputSteam也會(huì)檢查從datanode讀取來(lái)的數(shù)據(jù)的校驗(yàn)和,如果發(fā)現(xiàn)有數(shù)據(jù)損壞,它會(huì)把壞掉的block報(bào)告給namenode同時(shí)重新讀取其他datanode上的其他block備份。

    這種設(shè)計(jì)模式的一個(gè)好處是,文件讀取是遍布這個(gè)集群的datanode的,namenode只是提供文件block的位置信息,這些信息所需的帶寬是很少的,這樣便有效的避免了單點(diǎn)瓶頸問(wèn)題從而可以更大的擴(kuò)充集群的規(guī)模。

    Hadoop中的網(wǎng)絡(luò)拓?fù)?/p>

    在Hadoop集群中如何衡量?jī)蓚€(gè)節(jié)點(diǎn)的遠(yuǎn)近呢?要知道,在高速處理數(shù)據(jù)時(shí),數(shù)據(jù)處理速率的唯一限制因素就是數(shù)據(jù)在不同節(jié)點(diǎn)間的傳輸速度:這是由帶寬的可怕匱乏引起的。所以我們把帶寬作為衡量?jī)蓚€(gè)節(jié)點(diǎn)距離大小的標(biāo)準(zhǔn)。

    但是計(jì)算兩個(gè)節(jié)點(diǎn)之間的帶寬是比較復(fù)雜的,而且它需要在一個(gè)靜態(tài)的集群下才能衡量,但Hadoop集群一般是隨著數(shù)據(jù)處理的規(guī)模動(dòng)態(tài)變化的(且兩兩節(jié)點(diǎn)直接相連的連接數(shù)是節(jié)點(diǎn)數(shù)的平方)。于是Hadoop使用了一個(gè)簡(jiǎn)單的方法來(lái)衡量距離,它把集群內(nèi)的網(wǎng)絡(luò)表示成一個(gè)樹(shù)結(jié)構(gòu),兩個(gè)節(jié)點(diǎn)之間的距離就是他們離共同祖先節(jié)點(diǎn)的距離之和。樹(shù)一般按數(shù)據(jù)中心(datacenter),機(jī)架(rack),計(jì)算節(jié)點(diǎn)(datanode)的結(jié)構(gòu)組織。計(jì)算節(jié)點(diǎn)上的本地運(yùn)算速度最快,跨數(shù)據(jù)中心的計(jì)算速度最慢(現(xiàn)在跨數(shù)據(jù)中心的Hadoop集群用的還很少,一般都是在一個(gè)數(shù)據(jù)中心內(nèi)做運(yùn)算的)。

    假如有個(gè)計(jì)算節(jié)點(diǎn)n1處在數(shù)據(jù)中心c1的機(jī)架r1上,它可以表示為/c1/r1/n1,下面是不同情況下兩個(gè)節(jié)點(diǎn)的距離:

    • distance(/d1/r1/n1, /d1/r1/n1) = 0 (processes on the same node)

    • distance(/d1/r1/n1, /d1/r1/n2) = 2 (different nodes on the same rack)

    • distance(/d1/r1/n1, /d1/r2/n3) = 4 (nodes on different racks in the same data center)

    • distance(/d1/r1/n1, /d2/r3/n4) = 6 (nodes in different data centers)

    如下圖所示:

    Hadoop

    寫(xiě)文件

    現(xiàn)在我們來(lái)看一下Hadoop中的寫(xiě)文件機(jī)制解析,通過(guò)寫(xiě)文件機(jī)制我們可以更好的了解一下Hadoop中的一致性模型。

    Hadoop

    上圖為我們展示了一個(gè)創(chuàng)建一個(gè)新文件并向其中寫(xiě)數(shù)據(jù)的例子。

    首先客戶端通過(guò)DistributedFileSystem上的create()方法指明一個(gè)欲創(chuàng)建的文件的文件名(第一步),DistributedFileSystem再通過(guò)RPC調(diào)用向NameNode申請(qǐng)創(chuàng)建一個(gè)新文件(第二步,這時(shí)該文件還沒(méi)有分配相應(yīng)的block)。namenode檢查是否有同名文件存在以及用戶是否有相應(yīng)的創(chuàng)建權(quán)限,如果檢查通過(guò),namenode會(huì)為該文件創(chuàng)建一個(gè)新的記錄,否則的話文件創(chuàng)建失敗,客戶端得到一個(gè)IOException異常。DistributedFileSystem返回一個(gè)FSDataOutputStream以供客戶端寫(xiě)入數(shù)據(jù),與FSDataInputStream類似,F(xiàn)SDataOutputStream封裝了一個(gè)DFSOutputStream用于處理namenode與datanode之間的通信。

    當(dāng)客戶端開(kāi)始寫(xiě)數(shù)據(jù)時(shí)(第三步),DFSOutputStream把寫(xiě)入的數(shù)據(jù)分成包(packet), 放入一個(gè)中間隊(duì)列——數(shù)據(jù)隊(duì)列(data queue)中去。DataStreamer從數(shù)據(jù)隊(duì)列中取數(shù)據(jù),同時(shí)向namenode申請(qǐng)一個(gè)新的block來(lái)存放它已經(jīng)取得的數(shù)據(jù)。namenode選擇一系列合適的datanode(個(gè)數(shù)由文件的replica數(shù)決定)構(gòu)成一個(gè)管道線(pipeline),這里我們假設(shè)replica為3,所以管道線中就有三個(gè)datanode。DataSteamer把數(shù)據(jù)流式的寫(xiě)入到管道線中的第一個(gè)datanode中(第四步),第一個(gè)datanode再把接收到的數(shù)據(jù)轉(zhuǎn)到第二個(gè)datanode中(第四步),以此類推。

    DFSOutputStream同時(shí)也維護(hù)著另一個(gè)中間隊(duì)列——確認(rèn)隊(duì)列(ack queue),確認(rèn)隊(duì)列中的包只有在得到管道線中所有的datanode的確認(rèn)以后才會(huì)被移出確認(rèn)隊(duì)列(第五步)。

    如果某個(gè)datanode在寫(xiě)數(shù)據(jù)的時(shí)候當(dāng)?shù)袅?,下面這些對(duì)用戶透明的步驟會(huì)被執(zhí)行:

    1)管道線關(guān)閉,所有確認(rèn)隊(duì)列上的數(shù)據(jù)會(huì)被挪到數(shù)據(jù)隊(duì)列的首部重新發(fā)送,這樣可以確保管道線中當(dāng)?shù)舻膁atanode下流的datanode不會(huì)因?yàn)楫?dāng)?shù)舻膁atanode而丟失數(shù)據(jù)包。

    2)在還在正常運(yùn)行的datanode上的當(dāng)前block上做一個(gè)標(biāo)志,這樣當(dāng)當(dāng)?shù)舻膁atanode重新啟動(dòng)以后namenode就會(huì)知道該datanode上哪個(gè)block是剛才當(dāng)機(jī)時(shí)殘留下的局部損壞block,從而可以把它刪掉。

    3)已經(jīng)當(dāng)?shù)舻膁atanode從管道線中被移除,未寫(xiě)完的block的其他數(shù)據(jù)繼續(xù)被寫(xiě)入到其他兩個(gè)還在正常運(yùn)行的datanode中去,namenode知道這個(gè)block還處在under-replicated狀態(tài)(也即備份數(shù)不足的狀態(tài))下,然后他會(huì)安排一個(gè)新的replica從而達(dá)到要求的備份數(shù),后續(xù)的block寫(xiě)入方法同前面正常時(shí)候一樣。

    有可能管道線中的多個(gè)datanode當(dāng)?shù)簦m然不太經(jīng)常發(fā)生),但只要dfs.replication.min(默認(rèn)為1)個(gè)replica被創(chuàng)建,我們就認(rèn)為該創(chuàng)建成功了。剩余的replica會(huì)在以后異步創(chuàng)建以達(dá)到指定的replica數(shù)。

    當(dāng)客戶端完成寫(xiě)數(shù)據(jù)后,它會(huì)調(diào)用close()方法(第六步)。這個(gè)操作會(huì)沖洗(flush)所有剩下的package到pipeline中,等待這些package確認(rèn)成功,然后通知namenode寫(xiě)入文件成功(第七步)。這時(shí)候namenode就知道該文件由哪些block組成(因?yàn)镈ataStreamer向namenode請(qǐng)求分配新block,namenode當(dāng)然會(huì)知道它分配過(guò)哪些blcok給給定文件),它會(huì)等待最少的replica數(shù)被創(chuàng)建,然后成功返回。

    replica是如何分布的

    Hadoop在創(chuàng)建新文件時(shí)是如何選擇block的位置的呢,綜合來(lái)說(shuō),要考慮以下因素:帶寬(包括寫(xiě)帶寬和讀帶寬)和數(shù)據(jù)安全性。如果我們把三個(gè)備份全部放在一個(gè)datanode上,雖然可以避免了寫(xiě)帶寬的消耗,但幾乎沒(méi)有提供數(shù)據(jù)冗余帶來(lái)的安全性,因?yàn)槿绻@個(gè)datanode當(dāng)機(jī),那么這個(gè)文件的所有數(shù)據(jù)就全部丟失了。另一個(gè)極端情況是,如果把三個(gè)冗余備份全部放在不同的機(jī)架,甚至數(shù)據(jù)中心里面,雖然這樣數(shù)據(jù)會(huì)安全,但寫(xiě)數(shù)據(jù)會(huì)消耗很多的帶寬。Hadoop 0.17.0給我們提供了一個(gè)默認(rèn)replica分配策略(Hadoop 1.X以后允許replica策略是可插拔的,也就是你可以自己制定自己需要的replica分配策略)。replica的默認(rèn)分配策略是把第一個(gè)備份放在與客戶端相同的datanode上(如果客戶端在集群外運(yùn)行,就隨機(jī)選取一個(gè)datanode來(lái)存放第一個(gè)replica),第二個(gè)replica放在與第一個(gè)replica不同機(jī)架的一個(gè)隨機(jī)datanode上,第三個(gè)replica放在與第二個(gè)replica相同機(jī)架的隨機(jī)datanode上。如果replica數(shù)大于三,則隨后的replica在集群中隨機(jī)存放,Hadoop會(huì)盡量避免過(guò)多的replica存放在同一個(gè)機(jī)架上。選取replica的放置位置后,管道線的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如下所示:

    Hadoop

    總體來(lái)說(shuō),上述默認(rèn)的replica分配策略給了我們很好的可用性(blocks放置在兩個(gè)rack上,較為安全),寫(xiě)帶寬優(yōu)化(寫(xiě)數(shù)據(jù)只需要跨越一個(gè)rack),讀帶寬優(yōu)化(你可以從兩個(gè)機(jī)架中選擇較近的一個(gè)讀?。?。

    一致性模型

    HDFS某些地方為了性能可能會(huì)不符合POSIX(是的,你沒(méi)有看錯(cuò),POSIX不僅僅只適用于linux/unix, Hadoop 使用了POSIX的設(shè)計(jì)來(lái)實(shí)現(xiàn)對(duì)文件系統(tǒng)文件流的讀取 ),所以它看起來(lái)可能與你所期望的不同,要注意。

    創(chuàng)建了一個(gè)文件以后,它是可以在命名空間(namespace)中可以看到的:

    Path p = new Path("p");

    fs.create(p);

    assertThat(fs.exists(p), is(true));

    但是任何向此文件中寫(xiě)入的數(shù)據(jù)并不能保證是可見(jiàn)的,即使你flush了已經(jīng)寫(xiě)入的數(shù)據(jù),此文件的長(zhǎng)度可能仍然為零:

    Path p = new Path("p");

    OutputStream out = fs.create(p);

    out.write("content".getBytes("UTF-8"));

    out.flush();

    assertThat(fs.getFileStatus(p).getLen(), is(0L));

    這是因?yàn)?,在Hadoop中,只有滿一個(gè)block數(shù)據(jù)量的數(shù)據(jù)被寫(xiě)入文件后,此文件中的內(nèi)容才是可見(jiàn)的(即這些數(shù)據(jù)會(huì)被寫(xiě)入到硬盤中去),所以當(dāng)前正在寫(xiě)的block中的內(nèi)容總是不可見(jiàn)的。

    Hadoop提供了一種強(qiáng)制使buffer中的內(nèi)容沖洗到datanode的方法,那就是FSDataOutputStream的sync()方法。調(diào)用了sync()方法后,Hadoop保證所有已經(jīng)被寫(xiě)入的數(shù)據(jù)都被沖洗到了管道線中的datanode中,并且對(duì)所有讀者都可見(jiàn)了:

    Path p = new Path("p");

    FSDataOutputStream out = fs.create(p);

    out.write("content".getBytes("UTF-8"));

    out.flush();

    out.sync();

    assertThat(fs.getFileStatus(p).getLen(), is(((long) "content".length())));

    這個(gè)方法就像POSIX中的fsync系統(tǒng)調(diào)用(它沖洗給定文件描述符中的所有緩沖數(shù)據(jù)到磁盤中)。例如,使用java API寫(xiě)一個(gè)本地文件,我們可以保證在調(diào)用flush()和同步化后可以看到已寫(xiě)入的內(nèi)容:

    FileOutputStream out = new FileOutputStream(localFile);

    out.write("content".getBytes("UTF-8"));

    out.flush(); // flush to operating system

    out.getFD().sync(); // sync to disk (getFD()返回與該流所對(duì)應(yīng)的文件描述符)

    assertThat(localFile.length(), is(((long) "content".length())));

    在HDFS中關(guān)閉一個(gè)流隱式的調(diào)用了sync()方法:

    Path p = new Path("p");

    OutputStream out = fs.create(p);

    out.write("content".getBytes("UTF-8"));

    out.close();

    assertThat(fs.getFileStatus(p).getLen(), is(((long) "content".length())));

    由于Hadoop中的一致性模型限制,如果我們不調(diào)用sync()方法的話,我們很可能會(huì)丟失多大一個(gè)block的數(shù)據(jù)。這是難以接受的,所以我們應(yīng)該使用sync()方法來(lái)確保數(shù)據(jù)已經(jīng)寫(xiě)入磁盤。但頻繁調(diào)用sync()方法也是不好的,因?yàn)闀?huì)造成很多額外開(kāi)銷。我們可以再寫(xiě)入一定量數(shù)據(jù)后調(diào)用sync()方法一次,至于這個(gè)具體的數(shù)據(jù)量大小就要根據(jù)你的應(yīng)用程序而定了,在不影響你的應(yīng)用程序的性能的情況下,這個(gè)數(shù)據(jù)量應(yīng)越大越好。

    簡(jiǎn)述hadoop工作原理(hadoop工作原理圖)

    以上就是關(guān)于簡(jiǎn)述hadoop工作原理相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。


    推薦閱讀:

    簡(jiǎn)述網(wǎng)絡(luò)營(yíng)銷策略有哪八種(簡(jiǎn)述網(wǎng)絡(luò)營(yíng)銷策略有哪八種形式)

    請(qǐng)簡(jiǎn)述信息流的功能是什么(請(qǐng)簡(jiǎn)述信息流的功能是什么)

    簡(jiǎn)述網(wǎng)絡(luò)營(yíng)銷五種渠道(簡(jiǎn)述網(wǎng)絡(luò)營(yíng)銷五種渠道策略)

    園林景觀設(shè)計(jì)施工托管(園林托管理財(cái)可靠嗎)

    商家是什么意思(聯(lián)盟商家是什么意思)