小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Hadoop學(xué)習(xí)之路(十一)HDFS的讀寫詳解

 HK123COM 2019-02-14

目錄

 

正文

HDFS的寫操作

《HDFS權(quán)威指南》圖解HDFS寫過(guò)程

        

詳細(xì)文字說(shuō)明(術(shù)語(yǔ))

1、使用 HDFS 提供的客戶端 Client,向遠(yuǎn)程的 namenode 發(fā)起 RPC 請(qǐng)求

2、namenode 會(huì)檢查要?jiǎng)?chuàng)建的文件是否已經(jīng)存在,創(chuàng)建者是否有權(quán)限進(jìn)行操作,成功則會(huì) 為文件創(chuàng)建一個(gè)記錄,否則會(huì)讓客戶端拋出異常;

3、當(dāng)客戶端開始寫入文件的時(shí)候,客戶端會(huì)將文件切分成多個(gè) packets,并在內(nèi)部以數(shù)據(jù)隊(duì)列“data queue(數(shù)據(jù)隊(duì)列)”的形式管理這些 packets,并向 namenode 申請(qǐng) blocks,獲 取用來(lái)存儲(chǔ) replicas 的合適的 datanode 列表,列表的大小根據(jù) namenode 中 replication 的設(shè)定而定;

4、開始以 pipeline(管道)的形式將 packet 寫入所有的 replicas 中??蛻舳税?packet 以流的 方式寫入第一個(gè) datanode,該 datanode 把該 packet 存儲(chǔ)之后,再將其傳遞給在此 pipeline 中的下一個(gè) datanode,直到最后一個(gè) datanode,這種寫數(shù)據(jù)的方式呈流水線的形式。

5、最后一個(gè) datanode 成功存儲(chǔ)之后會(huì)返回一個(gè) ack packet(確認(rèn)隊(duì)列),在 pipeline 里傳遞 至客戶端,在客戶端的開發(fā)庫(kù)內(nèi)部維護(hù)著"ack queue",成功收到 datanode 返回的 ack packet 后會(huì)從"data queue"移除相應(yīng)的 packet。

6、如果傳輸過(guò)程中,有某個(gè) datanode 出現(xiàn)了故障,那么當(dāng)前的 pipeline 會(huì)被關(guān)閉,出現(xiàn)故 障的 datanode 會(huì)從當(dāng)前的 pipeline 中移除,剩余的 block 會(huì)繼續(xù)剩下的 datanode 中繼續(xù) 以 pipeline 的形式傳輸,同時(shí) namenode 會(huì)分配一個(gè)新的 datanode,保持 replicas 設(shè)定的 數(shù)量。

7、客戶端完成數(shù)據(jù)的寫入后,會(huì)對(duì)數(shù)據(jù)流調(diào)用 close()方法,關(guān)閉數(shù)據(jù)流;

8、只要寫入了 dfs.replication.min(最小寫入成功的副本數(shù))的復(fù)本數(shù)(默認(rèn)為 1),寫操作 就會(huì)成功,并且這個(gè)塊可以在集群中異步復(fù)制,直到達(dá)到其目標(biāo)復(fù)本數(shù)(dfs.replication 的默認(rèn)值為 3),因?yàn)?namenode 已經(jīng)知道文件由哪些塊組成,所以它在返回成功前只需 要等待數(shù)據(jù)塊進(jìn)行最小量的復(fù)制。

詳細(xì)文字說(shuō)明(口語(yǔ))

1、客戶端發(fā)起請(qǐng)求:hadoop fs -put hadoop.tar.gz / 

客戶端怎么知道請(qǐng)求發(fā)給那個(gè)節(jié)點(diǎn)的哪個(gè)進(jìn)程?

因?yàn)榭蛻舳藭?huì)提供一些工具來(lái)解析出來(lái)你所指定的HDFS集群的主節(jié)點(diǎn)是誰(shuí),以及端口號(hào)等信息,主要是通過(guò)URI來(lái)確定,

url:hdfs://hadoop1:9000

當(dāng)前請(qǐng)求會(huì)包含一個(gè)非常重要的信息: 上傳的數(shù)據(jù)的總大小

2、namenode會(huì)響應(yīng)客戶端的這個(gè)請(qǐng)求

namenode的職責(zé):

1 管理元數(shù)據(jù)(抽象目錄樹結(jié)構(gòu))

用戶上傳的那個(gè)文件在對(duì)應(yīng)的目錄如果存在。那么HDFS集群應(yīng)該作何處理,不會(huì)處理

用戶上傳的那個(gè)文件要存儲(chǔ)的目錄不存在的話,如果不存在不會(huì)創(chuàng)建

2、響應(yīng)請(qǐng)求

真正的操作:做一系列的校驗(yàn),

1、校驗(yàn)客戶端的請(qǐng)求是否合理
2、校驗(yàn)客戶端是否有權(quán)限進(jìn)行上傳

3、如果namenode返回給客戶端的結(jié)果是 通過(guò), 那就是允許上傳

namenode會(huì)給客戶端返回對(duì)應(yīng)的所有的數(shù)據(jù)塊的多個(gè)副本的存放節(jié)點(diǎn)列表,如:

file1_blk1 hadoop02,hadoop03,hadoop04
file1_blk2 hadoop03,hadoop04,hadoop05

4、客戶端在獲取到了namenode返回回來(lái)的所有數(shù)據(jù)塊的多個(gè)副本的存放地的數(shù)據(jù)之后,就可以按照順序逐一進(jìn)行數(shù)據(jù)塊的上傳操作

5、對(duì)要上傳的數(shù)據(jù)塊進(jìn)行邏輯切片

切片分成兩個(gè)階段:

1、規(guī)劃怎么切
2、真正的切

物理切片: 1 和 2

邏輯切片: 1

file1_blk1 : file1:0:128
file1_blk2 : file1:128:256

  邏輯切片只是規(guī)劃了怎么切

  

6、開始上傳第一個(gè)數(shù)據(jù)塊

7、客戶端會(huì)做一系列準(zhǔn)備操作

1、依次發(fā)送請(qǐng)求去連接對(duì)應(yīng)的datnaode

pipline : client - node1 - node2 - node3

按照一個(gè)個(gè)的數(shù)據(jù)包的形式進(jìn)行發(fā)送的。

每次傳輸完一個(gè)數(shù)據(jù)包,每個(gè)副本節(jié)點(diǎn)都會(huì)進(jìn)行校驗(yàn),依次原路給客戶端

2、在客戶端會(huì)啟動(dòng)一個(gè)服務(wù):

用戶就是用來(lái)等到將來(lái)要在這個(gè)pipline數(shù)據(jù)管道上進(jìn)行傳輸?shù)臄?shù)據(jù)包的校驗(yàn)信息

客戶端就能知道當(dāng)前從clinet到寫node1,2,3三個(gè)節(jié)點(diǎn)上去的數(shù)據(jù)是否都寫入正確和成功

8、clinet會(huì)正式的把這個(gè)快中的所有packet都寫入到對(duì)應(yīng)的副本節(jié)點(diǎn)

1、block是最大的一個(gè)單位,它是最終存儲(chǔ)于DataNode上的數(shù)據(jù)粒度,由dfs.block.size參數(shù)決定,2.x版本默認(rèn)是128M;注:這個(gè)參數(shù)由客戶端配置決定;如:System.out.println(conf.get("dfs.blocksize"));//結(jié)果是134217728

2、packet是中等的一個(gè)單位,它是數(shù)據(jù)由DFSClient流向DataNode的粒度,以dfs.write.packet.size參數(shù)為參考值,默認(rèn)是64K;注:這個(gè)參數(shù)為參考值,是指真正在進(jìn)行數(shù)據(jù)傳輸時(shí),會(huì)以它為基準(zhǔn)進(jìn)行調(diào)整,調(diào)整的原因是一個(gè)packet有特定的結(jié)構(gòu),調(diào)整的目標(biāo)是這個(gè)packet的大小剛好包含結(jié)構(gòu)中的所有成員,同時(shí)也保證寫到DataNode后當(dāng)前block的大小不超過(guò)設(shè)定值;

如:System.out.println(conf.get("dfs.write.packet.size"));//結(jié)果是65536

3、chunk是最小的一個(gè)單位,它是DFSClient到DataNode數(shù)據(jù)傳輸中進(jìn)行數(shù)據(jù)校驗(yàn)的粒度,由io.bytes.per.checksum參數(shù)決定,默認(rèn)是512B;注:事實(shí)上一個(gè)chunk還包含4B的校驗(yàn)值,因而chunk寫入packet時(shí)是516B;數(shù)據(jù)與檢驗(yàn)值的比值為128:1,所以對(duì)于一個(gè)128M的block會(huì)有一個(gè)1M的校驗(yàn)文件與之對(duì)應(yīng);

如:System.out.println(conf.get("io.bytes.per.checksum"));//結(jié)果是512


9、clinet進(jìn)行校驗(yàn),如果校驗(yàn)通過(guò),表示該數(shù)據(jù)塊寫入成功

10、重復(fù)7 8 9 三個(gè)操作,來(lái)繼續(xù)上傳其他的數(shù)據(jù)塊

11、客戶端在意識(shí)到所有的數(shù)據(jù)塊都寫入成功之后,會(huì)給namenode發(fā)送一個(gè)反饋,就是告訴namenode當(dāng)前客戶端上傳的數(shù)據(jù)已經(jīng)成功。

 HDFS讀操作

《HDFS權(quán)威指南》圖解HDFS讀過(guò)程

數(shù)據(jù)讀取

1、客戶端調(diào)用FileSystem 實(shí)例的open 方法,獲得這個(gè)文件對(duì)應(yīng)的輸入流InputStream。

2、通過(guò)RPC 遠(yuǎn)程調(diào)用NameNode ,獲得NameNode 中此文件對(duì)應(yīng)的數(shù)據(jù)塊保存位置,包括這個(gè)文件的副本的保存位置( 主要是各DataNode的地址) 。

3、獲得輸入流之后,客戶端調(diào)用read 方法讀取數(shù)據(jù)。選擇最近的DataNode 建立連接并讀取數(shù)據(jù)。

4、如果客戶端和其中一個(gè)DataNode 位于同一機(jī)器(比如MapReduce 過(guò)程中的mapper 和reducer),那么就會(huì)直接從本地讀取數(shù)據(jù)。

5、到達(dá)數(shù)據(jù)塊末端,關(guān)閉與這個(gè)DataNode 的連接,然后重新查找下一個(gè)數(shù)據(jù)塊。

6、不斷執(zhí)行第2 - 5 步直到數(shù)據(jù)全部讀完。

7、客戶端調(diào)用close ,關(guān)閉輸入流DF S InputStream。

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多