日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdfs复制文件夹_一文理解HDFS

發(fā)布時(shí)間:2025/4/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdfs复制文件夹_一文理解HDFS 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、架構(gòu)原理

HDFS 是Hadoop Distributed File System的簡(jiǎn)稱,是HADOOP抽象文件系統(tǒng)的一種實(shí)現(xiàn)。Hadoop抽象文件系統(tǒng)可以與本地系統(tǒng)、Amazon S3等集成,甚至可以通過Web協(xié)議(webhsfs)來操作。

HDFS是由一個(gè)NAMENODE與多個(gè)DATANODE構(gòu)成,如下圖。

其中NAMENODE負(fù)責(zé)管理分布式文件系統(tǒng)的命名空間(Namespace)。

DATANODE 數(shù)據(jù)節(jié)點(diǎn),用來具體的存儲(chǔ)文件,維護(hù)了blockId 與 datanode本地文件的映射。

換個(gè)理解方法就是MASTER WORKER 模式,其中NAMENODE 對(duì)應(yīng)是master,進(jìn)所有datanode的datanode mate 信息的關(guān)聯(lián)以及監(jiān)控等相關(guān)事情。而DATANODE只負(fù)責(zé)存儲(chǔ)數(shù)據(jù)。

HDFS基礎(chǔ)知識(shí)思維導(dǎo)圖如下:

二、寫文件過程

  • Client 調(diào)用 DistributedFileSystem 對(duì)象的 create 方法,創(chuàng)建一個(gè)文件輸出流(FSDataOutputStream)對(duì)象;
  • 通過 DistributedFileSystem 對(duì)象與集群的 NameNode 進(jìn)行一次 RPC 遠(yuǎn)程調(diào)用,在 HDFS 的 Namespace 中創(chuàng)建一個(gè)文件條目(Entry),此時(shí)該條目沒有任何的 Block,NameNode 會(huì)返回該數(shù)據(jù)每個(gè)塊需要拷貝的 DataNode 地址信息;
  • 通過 FSDataOutputStream 對(duì)象,開始向 DataNode 寫入數(shù)據(jù),數(shù)據(jù)首先被寫入 FSDataOutputStream 對(duì)象內(nèi)部的數(shù)據(jù)隊(duì)列中,數(shù)據(jù)隊(duì)列由 DataStreamer 使用,它通過選擇合適的 DataNode 列表來存儲(chǔ)副本,從而要求 NameNode 分配新的 block;
  • DataStreamer 將數(shù)據(jù)包以流式傳輸?shù)姆绞絺鬏數(shù)椒峙涞牡谝粋€(gè) DataNode 中,該數(shù)據(jù)流將數(shù)據(jù)包存儲(chǔ)到第一個(gè) DataNode 中并將其轉(zhuǎn)發(fā)到第二個(gè) DataNode 中,接著第二個(gè) DataNode 節(jié)點(diǎn)會(huì)將數(shù)據(jù)包轉(zhuǎn)發(fā)到第三個(gè) DataNode 節(jié)點(diǎn);
  • DataNode 確認(rèn)數(shù)據(jù)傳輸完成,最后由第一個(gè) DataNode 通知 client 數(shù)據(jù)寫入成功;
  • 完成向文件寫入數(shù)據(jù),Client 在文件輸出流(FSDataOutputStream)對(duì)象上調(diào)用 close 方法,完成文件寫入;
  • 調(diào)用 DistributedFileSystem 對(duì)象的 complete 方法,通知 NameNode 文件寫入成功,NameNode 會(huì)將相關(guān)結(jié)果記錄到 editlog 中。
  • 三、讀文件過程

  • Client 通過 DistributedFileSystem 對(duì)象與集群的 NameNode 進(jìn)行一次 RPC 遠(yuǎn)程調(diào)用,獲取文件 block 位置信息;
  • NameNode 返回存儲(chǔ)的每個(gè)塊的 DataNode 列表;
  • Client 將連接到列表中最近的 DataNode;
  • Client 開始從 DataNode 并行讀取數(shù)據(jù);
  • 一旦 Client 獲得了所有必須的 block,它就會(huì)將這些 block 組合起來形成一個(gè)文件。
  • 四、問題

    1、數(shù)據(jù)錯(cuò)誤,hdfs是怎么解決的呢?

    原因 :由于網(wǎng)絡(luò)傳輸與磁盤錯(cuò)誤等因素。

    解決辦法:在客戶端讀取到數(shù)據(jù)后,會(huì)采用MD5和sha1對(duì)數(shù)據(jù)塊進(jìn)行校驗(yàn),以確定讀取到正確的數(shù)據(jù)。

    具體流程:

    • 在文件被創(chuàng)建的時(shí)候,客戶端對(duì)文件進(jìn)行摘錄,并把這些信息寫入數(shù)據(jù)的同一路徑隱藏文件中。
    • 當(dāng)客戶端讀取文件的時(shí)候,會(huì)先讀取該信息文件,然后利用該信息文件對(duì)每個(gè)讀取的數(shù)據(jù)塊進(jìn)行校驗(yàn),如果校驗(yàn)出錯(cuò),客戶端就會(huì)請(qǐng)求到另外一個(gè)數(shù)據(jù)接地那讀取該文件快,并且向NAMENODE報(bào)告這個(gè)文件塊有錯(cuò)誤,NAMENODE會(huì)定期檢查并且重新復(fù)制這個(gè)塊。

    2、數(shù)據(jù)節(jié)點(diǎn)出錯(cuò)

    DATANODE 難免會(huì)造成不可用

    解決思路主要是通過心跳的方式

    解決流程:

  • 每個(gè)數(shù)據(jù)節(jié)點(diǎn)會(huì)定期向NAMEnode 節(jié)點(diǎn)發(fā)送心跳,向namenode報(bào)告自己的狀態(tài)。
  • 當(dāng)數(shù)據(jù)節(jié)點(diǎn)發(fā)生故障或者網(wǎng)絡(luò)發(fā)生斷網(wǎng)時(shí),namenode節(jié)點(diǎn)就無法收到來自以下數(shù)據(jù)節(jié)點(diǎn)的心跳信息。這些數(shù)據(jù)節(jié)點(diǎn)就會(huì)被標(biāo)記為宕機(jī),節(jié)點(diǎn)上面的所有數(shù)據(jù)都會(huì)標(biāo)記為不可讀,namenode不會(huì)再給他們發(fā)送任何的IO請(qǐng)求。
  • 這時(shí),有可能出現(xiàn)一種情況,由于一些數(shù)據(jù)節(jié)點(diǎn)的不可用,會(huì)導(dǎo)致一些數(shù)據(jù)塊的副本量小于冗余因子。
  • namenode 會(huì)定期檢查這些數(shù)據(jù)情況,一旦發(fā)現(xiàn)某些數(shù)據(jù)塊的副本數(shù)量小于冗余因子,就會(huì)啟動(dòng)數(shù)據(jù)冗余復(fù)制,為它生產(chǎn)新的副本。
  • HDFS和其他分布式文件系統(tǒng)最大的區(qū)別就是可以調(diào)整冗余數(shù)據(jù)的位置。
  • 3、namenode 節(jié)點(diǎn)出錯(cuò)(單點(diǎn)故障問題)

    namenode節(jié)點(diǎn)保存了所有的元數(shù)據(jù)信息,其中最核心的兩大數(shù)據(jù)結(jié)構(gòu)是FsImage 合Editlog,如果這兩個(gè)文件發(fā)生了損壞,那么整個(gè)HDFS實(shí)例降 失效。

    因此,HDFS設(shè)置了備份機(jī)制,把這些核心文件同步復(fù)制到備份服務(wù)器SecondaryNameNode上。當(dāng)namenode出錯(cuò)時(shí),就可以根據(jù)備份服務(wù)器SecondaryNameNode中的FsImage和Editlog數(shù)據(jù)進(jìn)行恢復(fù)。

    4、小文件問題以及DATANODE水平擴(kuò)展極限問題

    Hadoop中每個(gè)目錄、文件和block都會(huì)以對(duì)象的形式保存在NameNode的內(nèi)存中。根據(jù)經(jīng)驗(yàn)每個(gè)對(duì)象在內(nèi)存中大概占用150個(gè)字節(jié)。HDFS中保存2000萬個(gè)文件,每個(gè)文件都在同一個(gè)文件夾中,而且每個(gè)文件都只有一個(gè)block,則NameNode需要6GB內(nèi)存。

    小文件問題:

    1、當(dāng)NameNode重啟時(shí),它都需要從本地磁盤讀取每個(gè)文件的元數(shù)據(jù),意味著你要讀取300GB數(shù)據(jù)到內(nèi)存中,不可避免導(dǎo)致NameNode啟動(dòng)時(shí)間較長(zhǎng)。

    2、一般來說,NameNode會(huì)不斷跟蹤并檢查每個(gè)數(shù)據(jù)塊的存儲(chǔ)位置。這是通過DataNode的定時(shí)心跳上報(bào)其數(shù)據(jù)塊來實(shí)現(xiàn)的。數(shù)據(jù)節(jié)點(diǎn)需要上報(bào)的block越多,則也會(huì)消耗越多的網(wǎng)絡(luò)帶寬/時(shí)延。即使節(jié)點(diǎn)之間是高速網(wǎng)絡(luò)(萬兆/光纖),但不可避免的會(huì)帶來一些不好的影響。

    3、NameNode本身使用300G內(nèi)存,相當(dāng)于JVM你需要配置300GB的heap,對(duì)于JVM來說本來就存在穩(wěn)定性的風(fēng)險(xiǎn),比如GC時(shí)間較長(zhǎng)。

    另外大量小文件意味著大量的隨機(jī)磁盤IO,磁盤IO通常是MapReduce性能的最大瓶頸之一,在HDFS中對(duì)于相同數(shù)量的數(shù)據(jù),一次大的順序讀取往往優(yōu)于幾次隨機(jī)讀取的性能。

    5、HDFS為什么是128M這么大的一個(gè)數(shù)據(jù)塊呢?

    在文件系統(tǒng)中,系統(tǒng)存儲(chǔ)文件時(shí),需要定位該數(shù)據(jù)在磁盤中的位置,再進(jìn)行傳輸處理。

    定位在磁盤的位置需要時(shí)間,同樣文件傳輸也是需要時(shí)間的。

    T(存儲(chǔ)時(shí)間)=T(定位時(shí)間)+T(傳輸時(shí)間)

    如果每個(gè)要傳輸?shù)膲K設(shè)置得足夠大,那么從磁盤傳輸數(shù)據(jù)的時(shí)間可以明顯大于定位這個(gè)塊開始位置的時(shí)間。

    假如文件太小,在namenode 的映射列表就會(huì)非常大,影響尋址時(shí)間,尋址時(shí)間如果大于傳輸時(shí)間,就沒有意義了。

    但如果block 設(shè)置過太大,在MapReduce 任務(wù)中,Map或者Reduce任務(wù)的個(gè)數(shù)小于集群機(jī)器數(shù)量,會(huì)使得作業(yè)運(yùn)行效率很低。

    6、namenode還存在哪些問題以及怎么解決?

    存在問題:

    • 單點(diǎn)故障問題
    • 不可以水平擴(kuò)展(是否可以通過縱向擴(kuò)展來解決?)
    • 系統(tǒng)整體性能受限于單個(gè)名稱節(jié)點(diǎn)的吞吐量
    • 單個(gè)名稱節(jié)點(diǎn)難以提供不同程序之間的隔離性

    解決方案

    熱備份 (HDFS HA)

    HDFS HA(High Availability)是為了解決單點(diǎn)故障問題

    HA集群設(shè)置兩個(gè)名稱節(jié)點(diǎn),“活躍(Active)”和“待命(Standby)”

    兩種名稱節(jié)點(diǎn)的狀態(tài)同步,可以借助于一個(gè)共享存儲(chǔ)系統(tǒng)來實(shí)現(xiàn)

    一旦活躍名稱節(jié)點(diǎn)出現(xiàn)故障,就可以立即切換到待命名稱節(jié)點(diǎn)

    Zookeeper確保一個(gè)名稱節(jié)點(diǎn)在對(duì)外服務(wù)

    名稱節(jié)點(diǎn)維護(hù)映射信息,數(shù)據(jù)節(jié)點(diǎn)同時(shí)向兩個(gè)名稱節(jié)點(diǎn)匯報(bào)信息

    存在的問題就有可能出現(xiàn)腦裂的問題。

    Federation

    多個(gè)命名空間。為了處理一個(gè)namenode的局限性,搞了幾個(gè)namanode大家一起來管理。就像編程中的命名空間一樣

    在HDFS Federation中,設(shè)計(jì)了多個(gè)相互獨(dú)立的名稱節(jié)點(diǎn),使得HDFS的命名服務(wù)能夠水平擴(kuò)展,這些名稱節(jié)點(diǎn)分別進(jìn)行各自命名空間和塊的管理,相互之間是聯(lián)盟(Federation)關(guān)系,不需要彼此協(xié)調(diào)。并且向后兼容

    HDFS Federation中,所有名稱節(jié)點(diǎn)會(huì)共享底層的數(shù)據(jù)節(jié)點(diǎn)存儲(chǔ)資源,數(shù)據(jù)節(jié)點(diǎn)向所有名稱節(jié)點(diǎn)匯報(bào)

    屬于同一個(gè)命名空間的塊構(gòu)成一個(gè)“塊池

    HDFS Federation設(shè)計(jì)可解決單名稱節(jié)點(diǎn)存在的以下幾個(gè)問題:

    1. HDFS集群擴(kuò)展性。多個(gè)名稱節(jié)點(diǎn)各自分管一部分目錄,使得一個(gè)集群可以擴(kuò)展到更多節(jié)點(diǎn),不再像HDFS1.0中那樣由于內(nèi)存的限制制約文件存儲(chǔ)數(shù)目

    2. 性能更高效。多個(gè)名稱節(jié)點(diǎn)管理不同的數(shù)據(jù),且同時(shí)對(duì)外提供服務(wù),將為用戶提供更高的讀寫吞吐率

    3. 良好的隔離性。用戶可根據(jù)需要將不同業(yè)務(wù)數(shù)據(jù)交由不同名稱節(jié)點(diǎn)管理,這樣不同業(yè)務(wù)之間影響很小

    參考文章

    https://developer.ibm.com/zh/articles/os-cn-hadoop-name-node/

    https://blog.csdn.net/xjz729827161/article/details/79463140

    總結(jié)

    以上是生活随笔為你收集整理的hdfs复制文件夹_一文理解HDFS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。