溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

HDFS短路讀的示例分析

發(fā)布時間:2021-12-09 11:36:15 來源:億速云 閱讀:167 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹HDFS短路讀的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!


背景

Hadoop的一個重要思想就是移動計算,而不是移動數(shù)據(jù)。我們更愿意盡可能將計算移動到數(shù)據(jù)所在節(jié)點。因此,HDFS中經(jīng)常出現(xiàn)客戶端和數(shù)據(jù)在一個節(jié)點上,當(dāng)客戶端讀取一個數(shù)據(jù)塊時,就會出現(xiàn)本地讀取。例如HBase場景,ResionServer寫數(shù)據(jù)一般在HDFS中都會存儲三備份副本并且肯定會往本地節(jié)點寫一備份,當(dāng)ResionServer讀取該數(shù)據(jù)時也會優(yōu)先選擇同一節(jié)點的數(shù)據(jù)進(jìn)行讀取。

短路讀的演進(jìn)


1、網(wǎng)絡(luò)讀

最初,HDFS中本地讀取的處理方式和遠(yuǎn)程讀取相同,也是通過網(wǎng)絡(luò)讀來實現(xiàn)??蛻舳送ㄟ^TCP套接字連接到DataNode,并通過DataTransferProtocol協(xié)議傳輸數(shù)據(jù),如下圖:

HDFS短路讀的示例分析

這種方式簡單,但有明顯的問題:

DataNode必須為每個正在讀取數(shù)據(jù)塊的客戶端保留一個線程和一個TCP套接字。內(nèi)核中會有TCP協(xié)議的開銷,以及DataTransferProtocol協(xié)議的開銷,因此這里有很大的優(yōu)化空間。

2、HDFS-2246 不安全短路讀

短路讀關(guān)鍵思想是因為客戶端和數(shù)據(jù)塊在同一節(jié)點上,所以DataNode不需要出現(xiàn)在讀取數(shù)據(jù)路徑中。而客戶端本身可以直接從本地磁盤讀取數(shù)據(jù)。這樣會使讀取性能得到很大的提高。在HDFS-2246中實現(xiàn)的短路讀是DataNode將所有數(shù)據(jù)塊路徑的權(quán)限開放給客戶端,客戶端直接通過本地磁盤路徑來讀取數(shù)據(jù),見下圖:

HDFS短路讀的示例分析


但這種方式引入了很多問題:

(1)系統(tǒng)管理員必須更改DataNode數(shù)據(jù)目錄的權(quán)限,以允許客戶端打開相關(guān)文件。將能夠使用短路讀的用戶專門列入白名單,不允許其他用戶使用。通常,這些用戶也必須放在特殊的Unix組中。

(2)這些權(quán)限更改會引入了一個安全漏洞,具有讀取DataNode節(jié)點上數(shù)據(jù)塊文件權(quán)限的用戶可以任意讀取路徑上所有數(shù)據(jù)塊,而不僅僅是他們所需訪問的數(shù)據(jù)塊,這好像讓用戶變成了超級用戶,對于少數(shù)用戶來說可能是可以接受的,例如HBase用戶。但總的來說,它會帶來很大安全隱患。

3、HDFS-347  安全短路讀

HDFS-2246的主要問題是向客戶端打開了DataNode的數(shù)據(jù)目錄,而我們真正需要讀取的只是一部分?jǐn)?shù)據(jù)塊文件。Unix有一種機(jī)制是可以做到這一點,稱為文件描述符傳遞。HDFS-347使用這種機(jī)制來實現(xiàn)安全短路讀。DataNode不是將目錄傳遞給客戶端,而是打開塊文件和元數(shù)據(jù)文件,并將它們的文件描述符通過domain socket傳遞給客戶端,如下圖:

HDFS短路讀的示例分析

基于以下兩方面,安全短路讀解決了HDFS-2246存在的安全性問題。

(1)文件描述符是只讀的,因此客戶端無法修改傳遞描述符的文件。

(2)客戶端無法訪問數(shù)據(jù)塊目錄本身,所以也無法讀取它不應(yīng)該訪問的任何其他數(shù)據(jù)塊文件。

HDFS安全短路讀

1、短路讀共享內(nèi)存

了解了HDFS短路讀的演進(jìn),我們來看下HDFS是如何實現(xiàn)安全短路讀的。DataNode將短路讀副本的文件描述符傳給DFSClient,DFSClient緩存副本文件描述符。由于副本的狀態(tài)可能隨時發(fā)生改變,所以需要DFSClient和DataNode實時同步副本狀態(tài)。同時,DFSClient和DataNode在同一臺機(jī)器上,共享內(nèi)存可以通過POSIX提供的 mmap接口實現(xiàn)將文件映射到內(nèi)存,并且映射數(shù)據(jù)是實時同步的(如下圖),所以共享內(nèi)存可以維護(hù)所有短路讀副本的狀態(tài),使得DFSClient和DataNode通過共享內(nèi)存來實時同步副本信息。

HDFS短路讀的示例分析

共享內(nèi)存會有很多槽位,每個槽位對應(yīng)一個短路讀副本的信息。共享內(nèi)存保存了所有槽位的二進(jìn)制信息。但是映射數(shù)據(jù)中的二進(jìn)制槽位信息不便于管理,所以定義了Slot對象操作映射數(shù)據(jù)中的一個槽位,如下圖:

HDFS短路讀的示例分析

Slot槽位大小是64字節(jié),槽位數(shù)據(jù)格式,前4字節(jié)是Slot標(biāo)志位,5到8字節(jié)是錨計數(shù)位,剩余字節(jié)保留將來使用,例如統(tǒng)計信息等。

兩個標(biāo)志位:

(1)VALID_FLAG:表示槽位是否有效。

DFSClient在共享內(nèi)存中分配新的槽位時設(shè)置此標(biāo)志位。當(dāng)與此槽位關(guān)聯(lián)的副本不再有效時,DataNode將會消除此標(biāo)志位。DFSClient本身也會消除此槽位,認(rèn)為DataNode不再使用此槽位進(jìn)行通信。

(2)ANCHORABLE_FLAG:表示槽位對應(yīng)的副本是否已經(jīng)緩存。

DataNode將槽位對應(yīng)的副本通過POSIX提供的mlock接口緩存時會設(shè)置該標(biāo)志位。當(dāng)標(biāo)志位已設(shè)置,DFSClient短路讀取該副本時不再需要進(jìn)行校驗,因為副本緩存時已經(jīng)做了檢驗操作,并且這種副本還支持零拷貝讀取。DFSClient對這樣的副本進(jìn)行讀取時,需要在對應(yīng)的槽位錨計數(shù)加1,只有當(dāng)槽位的錨計數(shù)為0時,DataNode才可以從緩存中刪除此副本。

共享內(nèi)存段的最大是8192字節(jié),當(dāng)DFSClient進(jìn)行大量短路讀時, DFSClient和DataNode之間可能會有多段共享內(nèi)存。HDFS中DFSClient定義了DFSClientShm類抽象了DFSClient端一段共享內(nèi)存,DFSClientShmManager類管理所有的DFSClientShm,而DataNode端定義了RegisteredShm類抽象DataNode端的一段共享內(nèi)存,ShortCircuitRegistry類管理所有DataNode端的共享內(nèi)存,如下圖所示:

HDFS短路讀的示例分析

在安全短路讀中,DFSClient和DataNode是通過domain socket來同步共享內(nèi)存槽位信息的。

  • DFSClient申請一段共享內(nèi)存保存短路讀副本的狀態(tài)。DataNode會創(chuàng)建共享內(nèi)存,并將共享內(nèi)存文件映射到DataNode內(nèi)存中,并創(chuàng)建RegisteredShm管理這段共享內(nèi)存,之后會將共享內(nèi)存文件的文件描述符通過domain socket返回給DFSClient。

  • DFSClient根據(jù)文件描述符打開共享內(nèi)存文件,將該文件映射到DFSClient的內(nèi)存中,并創(chuàng)建DfsClientShm對象管理這段共享內(nèi)存。

  • DFSClient通過domain socket向DataNode申請數(shù)據(jù)塊文件以及元數(shù)據(jù)文件的文件描述符,并且同步共享內(nèi)存中slot槽位的狀態(tài)。DFSClient會在DfsClientShm管理的共享內(nèi)存中為數(shù)據(jù)塊申請一個slot槽位,之后通過domain socket向DataNode同步信息,DataNode會在RegisteredShm管理的共享內(nèi)存中創(chuàng)建相應(yīng)的slot槽位,然后獲取數(shù)據(jù)塊文件以及元數(shù)據(jù)文件的文件描述符,并通過domain socket發(fā)送給DFSClient,如下圖:


HDFS短路讀的示例分析

共享內(nèi)存機(jī)制

2、短路讀流程

當(dāng)客戶端執(zhí)行數(shù)據(jù)塊副本短路讀時,DFSClient與DataNode的交互過程如下:

HDFS短路讀的示例分析

短路讀簡化流程圖

(1)DFSClient通過requestShortCircuitShm()接口向DataNode請求創(chuàng)建共享內(nèi)存,DataNode創(chuàng)建共享內(nèi)存文件并將共享內(nèi)存文件描述符返回給DFSClient。

(2)DFSClient通過allocShmSlot()接口申請共享內(nèi)存中的槽位,并通過requestShortCircuitFds()接口向DataNode請求要讀取的副本文件描述符,DataNode打開副本文件并將數(shù)據(jù)塊文件和元數(shù)據(jù)文件的文件描述符返回給DFSClient。

(3)DFSClient讀取完副本后,異步通過releaseShortCircuitFds()接口向DataNode請求釋放文件描述符及相應(yīng)槽位。

小米對HDFS安全短路讀的優(yōu)化

1、Slot槽位釋放緩慢

幾次壓力場景中,我們發(fā)現(xiàn)Hbase ResionServer多個短路讀線程經(jīng)常會阻塞在domain socket的讀寫上。從DataNode 的dump中發(fā)現(xiàn)大量的用于短路讀的ShortCircuitShm。于是我們通過YCSB模擬線上的情況,發(fā)現(xiàn)短路讀請求量較大時,BlockReaderLocal分配的QPS很高,并且BlockReaderLocal的分配依賴于同步讀取塊的ShortCircuitShm和slot的分配。

HDFS短路讀的示例分析

YCSB GET QPS

HDFS短路讀的示例分析

YCSB GET LATENCY

通過統(tǒng)計slot分配和釋放的QPS,我們發(fā)現(xiàn)slot分配的QPS能達(dá)到3000+,而釋放的QPS只能達(dá)到1000+,并且在YCSB測試經(jīng)過約1小時,DataNode出現(xiàn)FULL GC。由此可看出,DataNode中積累的,來不及釋放的slot,是導(dǎo)致GC的主要有原因。

現(xiàn)在的短路讀實現(xiàn)中,每次釋放slot,都會新建一個domain socket連接。而DataNode對于每個新建立的domain socket 連接,都會重新初始化一個DataXceiver去處理這個請求。通過profile DataNode發(fā)現(xiàn),SlotReleaser線程花了大量的時間在建立和清理這些連接上。

HDFS短路讀的示例分析

于是,我們對SlotReleaser的domain socket連接進(jìn)行了復(fù)用。通過復(fù)用domain socket,在同樣的測試集上,slot 釋放的QPS能和分配的QPS達(dá)到一致。從而消除了過期slot在DataNode中的擠壓。同時,由于DataNode Young GC減少,YCSB的GET的QPS也提升了約20%左右。

HDFS短路讀的示例分析

2、共享內(nèi)存分配效率低

在profile HBase短路讀過程中,我們還發(fā)現(xiàn)另外一個問題,就是每隔一段時間,會有一批讀會有約200ms左右的延遲而且這些延遲幾乎同時出現(xiàn)。開始我們懷疑 Hbase ResionServer的Minor GC導(dǎo)致。但通過比對ResionServer的GC日志,發(fā)現(xiàn)時間并不完全匹配。有一部分卻和DataNode Minor GC時間吻合。數(shù)據(jù)塊副本的真正讀取操作,是完全不通過DataNode的,如果是DataNode的影響,那問題只能出在ResionServer和DataNode建立短路讀時的交互上。通過進(jìn)一步在短路讀過程中加trace log,我們發(fā)現(xiàn)這些延遲,是由于DataNode Minor GC導(dǎo)致ShortCircuitShm分配請求被阻塞。當(dāng)分配一個ShortCircuitShm時,會導(dǎo)致很多slot的分配阻塞。slot的分配延遲,又會引起B(yǎng)lockReaderLocal的延遲,從而導(dǎo)致短路讀的延遲。這就是之前發(fā)現(xiàn)有一批讀,總是同時報相近的延遲。 為了解決這個問題,我們對ShortCircuitShm進(jìn)行了預(yù)分配,以減輕DataNode Minor GC對短路度影響,使得延遲更為平滑。

HDFS短路讀的示例分析

3、短禁止正在構(gòu)建塊的短路讀

禁止了正在構(gòu)建塊進(jìn)行短路讀,也就是最后一個塊禁止短路讀。這個問題由于HBase的讀寫模式 ,對其影響不是很大,但對基于HDFS流式服務(wù)影響很大。我們正在做的優(yōu)化工作主要是通過保證短路讀只發(fā)生在flush操作之后,同時在讀取過程中檢查塊的有效性,處理讀異常,如果確實失敗,轉(zhuǎn)成遠(yuǎn)程讀的方式。

附錄

(1)文件描述符(File Descriptor)

文件描述符在形式上是一個非負(fù)整數(shù)。實際上,它是一個索引值,指向內(nèi)核為每一個進(jìn)程所維護(hù)的該進(jìn)程打開文件的記錄表。當(dāng)程序打開一個現(xiàn)有文件或者創(chuàng)建一個新文件時,內(nèi)核向進(jìn)程返回一個文件描述符。

Unix和Windows系統(tǒng)都允許在進(jìn)程間傳遞文件描述符。一個進(jìn)程打開一個文件,然后把該文件的文件描述符傳遞給另一個進(jìn)程,另一個進(jìn)程可以訪問該文件。文件描述符傳遞對于安全性是非常有用的,因為它消除了對第二個進(jìn)程需要擁有足夠訪問權(quán)限來打開文件限制,同時文件描述符是只讀的,所以該方式還可以防止有問題的程序或者惡意的客戶端損壞文件。在Unix系統(tǒng)上,文件描述符傳遞只能通過Unix domain socket完成。

(2)Unix domain socket

Unix domain socket是用于在同一臺主機(jī)操作系統(tǒng)上執(zhí)行的進(jìn)程間交換數(shù)據(jù)的通信端點。有效的Unix domain socket類型是SOCK_STREAM(用于面向流的套接字)和SOCK_DGRAM(用于保留消息邊界的面向數(shù)據(jù)報的套接字),與大多數(shù)Unix實現(xiàn)一樣,Unix domain datagram socket始終可靠且不重新排序的數(shù)據(jù)報。Unix domain socket是POSIX操作系統(tǒng)的標(biāo)準(zhǔn)組件。  

Unix domain socket的API類似于網(wǎng)絡(luò)socket,但是不使用底層網(wǎng)絡(luò)協(xié)議,所有通信都完全在操作系統(tǒng)內(nèi)核中進(jìn)行。Unix domain socket使用文件系統(tǒng)作為其地址名稱空間。進(jìn)程引用Unix domain socket作為文件系統(tǒng)inode,因此兩個進(jìn)程可以通過打開相同的socket進(jìn)行通信。 除了發(fā)送數(shù)據(jù)外,進(jìn)程還可以使用sendmsg()和recvmsg()系統(tǒng)調(diào)用在Unix domain socket連接上發(fā)送文件描述符。并且只有發(fā)送進(jìn)程授權(quán)給接收進(jìn)程,接收進(jìn)程才可以訪問文件描述符的權(quán)限。

(3)共享內(nèi)存(Shared Memory)

共享內(nèi)存是進(jìn)程間通信的方法,即在同時運行的程序之間交換數(shù)據(jù)的方法。一個進(jìn)程將在RAM中創(chuàng)建一個其他進(jìn)程可以訪問的區(qū)域。由于兩個進(jìn)程可以像訪問自身內(nèi)存一樣訪問共享內(nèi)存區(qū)域,因此是一種非??焖俚耐ㄐ欧绞?。但是它的擴(kuò)展性較差,例如通信必須在同一臺機(jī)器上運行。而且必須要避免如果共享內(nèi)存的進(jìn)程在不同的CPU上運行,并且底層架構(gòu)不是緩存一致的。

POSIX提供了使用共享內(nèi)存的POSIX標(biāo)準(zhǔn)化API。使用sys/mman.h中的函數(shù)shm_open。POSIX進(jìn)程間通信包含共享函數(shù)shmat,shmctl,shmdt和shmget。shm_open創(chuàng)建的共享內(nèi)存是持久化的。它一直保留在系統(tǒng)中,直到被進(jìn)程明確刪除。這有一個缺點,如果進(jìn)程崩潰并且無法清理共享內(nèi)存,它將一直保持到系統(tǒng)關(guān)閉。POSIX還提供了用于將文件映射到內(nèi)存的mmap API,可以共享映射,允許將文件的內(nèi)容用作共享內(nèi)存。


以上是“HDFS短路讀的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI