HDFS非同步訪問模式

2022-05-05 18:15:12 字數 2488 閱讀 5196

在現有hdfs的rpc呼叫方式上,採用的基本是blocking call的形式,也就是阻塞式的呼叫方式.阻塞方式的乙個明顯的缺點是它的請求過程是同步的,也就是說,客戶端必須等待當前請求結果的返回,才能接著傳送下一次請求.如果此客戶端打算在乙個執行緒中傳送大量請求的話,阻塞式的rpc呼叫將會非常耗時.但是如果為了每一次請求呼叫而專門單獨開乙個執行緒的話,系統資源將會被大幅度的使用,顯然這也不是乙個好的解決的辦法.那麼有沒有什麼好的辦法呢,在hdfs中是否存在有非同步模式的rpc請求介面呢?本文我們就來聊聊hdfs的非同步訪問模式.

老實說,在目前hadoop的發布版本中,確實還不存在hdfs非同步訪問的模式,但是這並不代表社群沒有在關注這方面的問題.在許多特殊的場景下,hdfs的非同步訪問模式還是有它獨到的用處的.社群在jira hdfs-9924([umbrella] nonblocking hdfs access)上對此功能特性進行了實現.在本文中,我們姑且取名」hdfs非同步訪問模式」為asyncdistributedfilesystem,與distributedfilesystem相對應.

在hdfs非同步訪問模式的設計文件中,給出了新的非同步的rpc呼叫模式,採用了future-get的非同步呼叫模式,以filesystem的rename方法為例:

同步的方式(現有的呼叫模式):

public

boolean

rename(path src, path dst) throws ioexception;

非同步的方式(asyncdistributedfilesystem):

public futurerename(path src, path dst) ​throws ioexception​;
rename操作在asyncdistributedfilesystem中的實現**如下:

public futurerename(path src, path dst,

final options.rename... options) throws ioexception finally

}

這種非同步的呼叫方式還能非常靈活地整合進行現有的同步的呼叫方式中,示例如下:

//distributedfilesystem

public boolean rename(path src, path dst) throws ioexception else

}

// asynchronous mode

asyncdistributedfilesystem asyncdfs = dfs.getasyncdistributedfilesystem();

// asynchronous calls

futuref3 = futuredfs.rename(src3, dst3); // non­blocking

futuref4 = futuredfs.rename(src4, dst4); // non­blocking

boolean r3 = f3.get(); // blocking

boolean r4 = f4.get(); // blocking

在前面hdfs非同步訪問模式的過程中,有一點必須格外引起注意:客戶端非同步請求的控制.客戶端應有非同步請求數的限制,以此防止客戶端利用大量的非同步請求沖垮服務端.如果超過了此限制閾值,客戶端的請求將會處於阻塞狀態.這點必須要引起足夠重視,否則客戶端隨隨便便發起的請求將會摧毀namenode.

下面以單元測試中的例子為例,我們來看看在hdfs-9924中是如何做到對此方面的控制的,同樣以rename請求為例:

for (int i = 0; i < count; i++)  catch (asynccalllimitexceededexception e) 

}}

上述waitforreturnvalues的實現**如下:

private

void

waitforreturnvalues(final list> futurelist)

throws interruptedexception, executionexception

}

上面的操作意味著客戶端要想繼續呼叫非同步請求,得需要等待當前請求結果的返回,否則還將會丟擲asynccalllimitexceededexception異常.

各位看了上面hdfs非同步訪問模式的原理以及部分**的實現之後,可能會覺得整個過程並不是太複雜.因為上面只是乙個初始的功能性的實現,在未來的工作中,至少有以下幾點需要去完善:

hdfs async呼叫模式的出現將會帶給使用者更靈活的rpc請求方式的選擇,但是可能考慮到此種方式對比之前的方式而言,改動較大,目前這些非同步呼叫相關的方法許多是打上了@unstable標記的.hdfs非同步呼叫的方式同樣可以很好的運用在單元測試上.鑑於此特性是還暫未發布,大家可以根據自己的需要,進行部分的合入.

[1].

[2].

HDFS非同步訪問模式

在現有hdfs的rpc呼叫方式上,採用的基本是blocking call的形式,也就是阻塞式的呼叫方式.阻塞方式的乙個明顯的缺點是它的請求過程是同步的,也就是說,客戶端必須等待當前請求結果的返回,才能接著傳送下一次請求.如果此客戶端打算在乙個執行緒中傳送大量請求的話,阻塞式的rpc呼叫將會非常耗時....

C HttpWebRequest人非同步訪問

un test using system using system.collections.generic using system.linq using system.text using system.net using system.threading using system.io name...

快取與非同步訪問

asp.net有兩種型別的快取機制,一種是輸出快取,一種是應用程式快取。輸出快取 ouput caching 輸出快取是一種簡單的快取機制,它將輸出到客戶端的http頁面進行快取,當其他使用者繼 續請求頁時,伺服器端直接從記憶體中取出快取頁面,而不是重新歷經一遍asp.net頁面的生存週期。頁輸出快...