HFR:在RBF上實現跨NameSpace Rename
摘要
不支援跨NameSpace的rename。 NameSpace隨著使用會逐漸不均衡,社群目前還沒有用於均衡NameSpace的工具。
Prepare: 完成許可權和quota檢查,並鎖定src-path,禁止寫操作。
SaveTree: 向src-NameNode傳送saveTree() RPC,令其將目錄樹序列化到外部儲存中。
GraftTree: 向dst-NameNode傳送graftTree() RPC,dst-NameNode會讀取並反序列化上一步的目錄樹,並接到自己的目錄樹上。
HardLink: RBF叢集的DataNode是共享的,我們可以使用硬連線來完成資料塊傳輸。本階段會先收集所有塊的位置資訊,生成HardLink計劃,最後向DataNode傳送RPC實現塊的hard link。
Finish: 完成校驗和清理工作,並更新Router的掛載表。
在SaveTree階段,我們引入了saveTree() RPC,它會儲存src-path目錄樹到外部儲存中,包括樹的結構、INodes、以及Blocks。saveTree() RPC還有一個特點是,它假定src-path已經被鎖住且處於不可變的狀態,因此不會做額外措施來保護目錄樹不被改變,即不會做禁寫。下面分別討論儲存src-path到外部儲存的過程和saveTree()不做禁寫的原因。
saveTree()呼叫會產生兩個檔案:TREE-FILE和TREE-META,這兩個檔案被儲存在外部儲存中。TREE-FILE中儲存了整個目錄樹,TREE-META則儲存目錄樹的各種統計資訊。saveTree() RPC首先深度優先遍歷src-path,並將所有INodeDirectory和INodeFile序列化到TREE-FILE中。序列化的方式和NameNode生成Image的方式相同,這樣目錄的全部屬性(ACL、Xattr等)都會被保留。INode的寫入順序與遍歷順序相同,因此目錄樹的結構也可以被保留。遍歷的同時,saveTree() RPC會計算src-path的name消耗、space消耗和塊總數,並將它們寫入到TREE-META中(後面的GraftTree階段會解釋為什麼需要生成TREE-META)。
SaveTree階段不做禁寫操作有兩個原因,一是要保持簡單。saveTree() RPC只是簡單地遍歷目錄樹並寫兩個檔案,整個過程都是無鎖的,也沒有edit log,是非常輕量級的操作。二是保持靈活,我們可以讓SaveTree之前的階段來負責禁寫,它可以根據自身需要用任何它想使用的手段,比如簡單的取消src-path的x許可權,或是複雜些的逐個子目錄取消w許可權等等。這些自定義的階段都可以與SaveTree階段組合,來滿足不同需求。saveTree()的結果檔案也不被限制只能用於HFR,也可以被用來其他用途,譬如DEBUG。如果使用者願意,他們可以在沒有禁寫的目錄上呼叫saveTree(),這樣做雖然不會損壞NameNode,但也無法保證寫到外部儲存的目錄樹的完整性。
讀取TREE-META檔案。 合法性檢查,包括路徑名合法性、許可權、quota等。 預分配INode Id和Block Id。 讀取TREE-FILE,反序列化並構造目錄樹。 將構造好的目錄樹接到NameNode根目錄樹上,將所有Id新增到對應Map。
第1步只是讀取TREE-META檔案,包含IO操作且不需要讀寫NameNode自身後設資料,自然應該是無鎖的。 第2步需要做合法性檢查,涉及到讀取NameNode後設資料,和所有其他讀操作一樣,這一步是要拿讀鎖的。 第3步預分配Id,這一步會修改NameNode後設資料,因此必須拿寫鎖。 第4步構造目錄樹,構造過程需要讀取TREE-FILE檔案,並給新建INode和Block分Id,因為所有Id都在第三步分配好了,所以這一步雖然有IO但不需要拿任何鎖。 第5步將目錄樹接到NameNode上,還要新增Id到Map,這都會改變NameNode後設資料,必須拿寫鎖。
Pre-allocation edit log,在第3步預分配Id成功時,記錄分配了哪些Id。 Graft-done edit log,在第5步整個RPC成功時,記錄graftTree()引數列表和id對映表。
無ep無eg(步驟1,2,3其中一個失敗),edit log序列={e1,...,en},屬於原始的NameNode edit log序列,顯然成立。
有ep無eg(步驟4或5失敗),edit log序列={e1,...,ei,ep,...,en}。考慮對於任意起始狀態S,當從Si->Sp時,NameNode會從可用Id集合中去除預分配Id並將去掉的Id記錄到ep,當重放ep時NameNode會將ep記錄的Id從可用Id集合中去除掉。對於Si->Sp和Si->Rp兩個過程來說,起始可用Id集合相同又去除了相同的Id,因此Sp=Rp,進而對任意x,都有Sx=Rx。
有ep有eg(全部步驟成功),edit log序列={e1,...,ei,ep,...,ej,eg,...,en}。在Sj->Sp時,NameNode完成了步驟4和5,並記錄graftTree()引數和預分配Id到eg。步驟4和5可以看作有兩個輸入的函式:f(狀態Sj、預分配Id)。當重放ep時NameNode也重做步驟4、5,其中步驟4使用的Id記錄在eg中,與Sj->Sp時使用的Id完全相同。可見Sj->Sp和Sj-Rp時兩者輸入均相同,因此Sg=Rg。結合上一步證明可知對e1~eg均有Si=Ri,進而對任意x有Sx=Rx。
收集塊位置資訊,並生成hard link計劃。 執行hard link並處理hard link失敗的情況。
Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 12 cores. 128GB RAM, 4T x 12 HDD Linux 2.6.32, JDK 8
資料集"set x-y"表示一個深度為x的目錄樹,樹的每個非葉子節點都有y個孩子節點,樹的每個葉子節點都是一個檔案。 檔案副本數是3,每個檔案只包含一個塊。Linux中對256MB檔案和1KB檔案做HardLink速度是一樣的,因此這裡做了個最佳化,使用1KB塊檔案代表 256MB塊。下表中File Size是按照每個檔案256MB計算的總檔案大小。
將HFR整合到Router服務中,允許小目錄跨NameSpace rename。 HFR支援Hadoop3.1 EC(Erasure Code)編碼檔案。 透過自動分析用量和接入歷史,結合管理員設定的閾值,實現更智慧的負載均衡。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559359/viewspace-2677535/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 線上rename資料檔案Oracle
- 使用Devtron在Kubernetes上實現GitOpsdevGit
- 搞懂容器技術的基石: namespace (上)namespace
- nuxt配置實現axios在開發時的跨域代理UXiOS跨域
- 用WebRTC在Firefox上實現YouTube直播WebFirefox
- Flutter跨應用更改狀態在安卓端的實現Flutter安卓
- Flutter 實現原理及在馬蜂窩的跨平臺開發實踐Flutter
- Fluwx:微信SDK在Flutter上的實現Flutter
- 在vSphere中實現複製貼上功能
- NVDLA-Small在ZCU102上實現
- 用PMML實現機器學習模型的跨平臺上線機器學習模型
- nuxt.js配置實現axios在開發時的跨域代理UXJSiOS跨域
- 九種方式實現跨域跨域
- Nginx反向代理實現跨域Nginx跨域
- JSONP 跨域原理及實現JSON跨域
- SQL Server跨庫跨伺服器訪問實現SQLServer伺服器
- Elasticsearch在Hdfs上build的實現及優化ElasticsearchUI優化
- 在electron下實現PDF線上預覽功能
- 在Apache上實現多HTTPS虛擬主機ApacheHTTP
- 如何獲取Apollo上專案下的所有namespace?namespace
- Docker進階與實踐之二:NamespaceDockernamespace
- EventBus,輕鬆實現跨元件跨執行緒通訊元件執行緒
- 跨域方案總結與實現跨域
- 多種跨域方式實現原理跨域
- 使用AIDL實現跨程式介面回掉AI
- 九種跨域方式實現原理跨域
- 在 HarmonyOS 上使用 ArkUI 實現計步器應用UI
- Kotlin + Netty 在 Android 上實現 Socket 的服務端KotlinNettyAndroid服務端
- 在 Linux 上用 SELinux 或 AppArmor 實現強制訪LinuxAPP
- linux namespace and cgroupLinuxnamespace
- [namespace hdk] modintnamespace
- 關於namespacenamespace
- QT中namespaceQTnamespace
- MySQL rename table方法大全MySql
- Docker Desktop 現在可以在 Linux 上使用DockerLinux
- CORS方式實現ajax跨域 — nginx配置CORS跨域Nginx
- Ajax+SpringMVC實現跨域請求SpringMVC跨域
- Laravel + JWT 實現 API 跨域授權LaravelJWTAPI跨域