背景
相較傳統的重量級OLAP數據倉庫,“數據湖”以其數據體量大、綜合成本低、支持非結構化數據、查詢靈活多變等特點,受到越來越多企業的青睞,逐漸成為了現代數據平台的核心和架構范式。
數據湖的核心功能,簡單地可以分為數據存儲與數據查詢計算兩個部分,在雲端可以有多種的實現選擇。在之前的文章中,我們曾介紹Azure上Azure Data Lake Storage (ADLS Gen1)和Azure Data Lake Analytics (ADLA)這一對可配合使用的服務。這對黃金搭檔正是為數據湖而生,分別對應着大數據存儲和查詢計算的能力。
在數據湖存儲服務方面Azure繼續着快速發展的腳步,在重新梳理了產品思路之后,將ADLS與同為存儲服務的Azure Storage進行了大力整合。的確,在底層存儲基礎設施方面,ADLS完全可以復用Azure Storage久經考驗的存儲機制和成熟實現,並在此基礎上支持企業級大數據分析的特性並進行針對性優化。在這一新體系下的成果,則是微軟於18年開放預覽、於19年2月正式對外發布的Azure Data Lake Storage Gen2 (下稱ADLS Gen2)。第二代ADLS的口號是“不妥協的數據湖平台,它結合了豐富的高級數據湖解決方案功能集以及 Azure Blob 存儲的經濟性、全球規模和企業級安全性”。
那么,全新一代的ADLS Gen2實際體驗如何?在架構及特性上是否堪任大型數據湖應用的主存儲呢?這正是本文希望探討的話題。
ADLS Gen2初體驗
百聞不如一見,我們首先來嘗試創建一個ADLS Gen2的實例。需要注意的是,與第一代ADLS是獨立服務不同,ADLS Gen2已經集成於大家熟悉的存儲賬號(Storage Account)的功能體系之中。在建立存儲賬號時,請注意勾選"Advanced"選項卡下"Hierarchical namespace"(中文譯作“層次結構命名空間”)這個看似不起眼的選項:

當這個選項被勾選時,創建出的存儲賬號中的原Blob存儲部分就自然被耳目一新的ADLS Gen2文件系統所替代了:

從這里的產品措辭可以看出,“層次結構”和“文件系統”是反復被強調的ADLS Gen2的最大特點,也是它有別於傳統Blob對象存儲的最大不同。傳統對象存儲雖然從路徑上看起來也具有“目錄”的虛擬概念,但其實目錄通常並不實際存在,可認為僅是Blob對象路徑字符串中的一部分,因為對象存儲本質上是key-value形式的存儲。而ADLS這樣的“文件系統”級別的存儲能力上,目錄則是一等公民,可以設置訪問權限等元數據(並且能夠被子節點繼承),也可以使目錄重命名等操作變得十分便捷迅速。這樣的特性無疑使ADLS更適合作為企業數據湖這樣應用的存儲介質。
讓我們繼續操作。點擊"Data Lake Gen2 file systems"來到文件系統的管理界面,可看到支持創建多個File System。我們先新建一個File System,這個步驟非常類似Blob存儲中建立Container:

再嘗試點擊進入剛建立的cloudpickerfs這個文件系統,會發現界面上幾乎空空如也,提示我們需要使用客戶端工具Azure Storage Explorer才可進行操作:

不必對於這個簡單的界面過於失望,ADLS Gen2畢竟還是一個初生的產品,相信之后會得到不斷豐富。事實上在國際版Azure上已經有集成在Portal中的Storage Explorer,目前還在預覽狀態,相信之后也會在中國區發布。
我們打開最新版本的Azure Storage Explorer(該工具成熟度很高,非常推薦),可以看到輕松地識別出了剛才建立的文件系統:

嘗試建立目錄及上傳一些文件,毫無問題:

ADLS Gen2特性測試:權限控制
如果說剛才我們走通了最基本的流程,接下來我們則需要對ADLS Gen2的特性進行深度的測試,尤其是針對其“文件系統”的設計目標和大數據應用的典型場景來進行實操體驗。在本文中,我們先聚焦ADLS Gen2的權限控制。
我們知道傳統的存儲賬戶主要依靠Access Key和SAS token等方式來進行身份認證,並且在權限控制的粒度上比較粗放,只能設置到整個存儲賬戶或是Blob容器的粒度。而在ADLS Gen2中,一般推薦使用集成度更佳的Azure AD進行訪問身份認證(Access Key和SAS token也同樣支持),而權限方面的控制則可以非常精細:不僅支持文件系統粒度的RBAC權限指定,而且引入了類似POSIX的ACL體系,使得用戶可以將權限設置下沉到目錄乃至文件的級別。這樣一來,ADLS這個大數據存儲服務相當於提供了類似Linux文件系統的權限管理能力,極大地滿足了企業級數據平台在資源管控和權限治理方面的需要。
接下來我們對於權限進行一個基本嘗試。我們在cloudpickerfs文件系統中新建zone-a和zone-b兩個目錄來模擬企業不同業務領域的數據。

然后我們在Azure AD中新建一個用戶Karl:

現在我們希望Karl擁有整個文件系統的讀權限,但還能夠對zone-a進行修改和寫入。該需求應該如何實現呢?在ADLS Gen2上可以輕松地結合使用RBAC和目錄ACL來達到目的。我們先為Karl添加文件系統粒度的Storage Blob Data Reader角色,這使得Karl可以基於RBAC權限機制讀取cloudpickerfs這個文件系統中的所有數據:

然后再在Azure Storage Explorer中定位到zone-a,對該目錄賦予Karl讀寫及執行權限,這樣Karl就能夠實現對於zone-a這個目錄的完全控制。可以看到,這里的操作體驗與Linux/Unix中的ACL權限機制非常接近:

(圖中Default一欄對應的是目錄中子項將繼承的權限)
權限設置完成后,我們接下來使用一台Linux VM通過AzCopy這個工具來進行相關權限的實操驗證。AzCopy作為微軟官方的文件復制工具,已經全面地添加了對於ADLS Gen2的支持。
首先我們使用Karl的身份進行AzCopy的登錄,注意需指定tenant-id參數為用戶Karl所屬AD的id:
./azcopy login --tenant-id xxxxxxxx-yyyy-zzzz-zzzz-xxxxxxxxxxxx To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code ******** to authenticate

(這里按照AzCopy要求打開瀏覽器進行身份認證)
成功后AzCopy現在就擁有Karl這個用戶的權限了。我們先驗證其全局讀的能力,嘗試下載一個cloudpickerfs文件系統下根目錄的文件:
./azcopy cp https://cloudpickerdlg2.dfs.core.windows.net/cloudpickerfs/credit_card_loans.csv . INFO: Scanning... INFO: Using OAuth token for authentication. Job e3ed4551-713a-2e40-5e47-72b5ee3e3280 has started 0 Done, 0 Failed, 1 Pending, 0 Skipped, 1 Total, Job e3ed4551-713a-2e40-5e47-72b5ee3e3280 summary Elapsed Time (Minutes): 0.0333 Total Number Of Transfers: 1 Number of Transfers Completed: 1 Number of Transfers Failed: 0 Number of Transfers Skipped: 0 TotalBytesTransferred: 60991 Final Job Status: Completed
可以看到這個讀取並下載的任務順利完成。我們再測試向zone-a寫入的權限是否被正確地開啟了,把剛才下載的本地文件上傳到zone-a文件夾:
./azcopy cp ./credit_card_loans.csv https://cloudpickerdlg2.dfs.core.windows.net/cloudpickerfs/zone-a/ INFO: Scanning... INFO: Using OAuth token for authentication. Job a9dc4d08-c279-974e-707d-cceb3fad3720 has started 0 Done, 0 Failed, 1 Pending, 0 Skipped, 1 Total, Job a9dc4d08-c279-974e-707d-cceb3fad3720 summary Elapsed Time (Minutes): 0.0333 Total Number Of Transfers: 1 Number of Transfers Completed: 1 Number of Transfers Failed: 0 Number of Transfers Skipped: 0 TotalBytesTransferred: 60991 Final Job Status: Completed
再次獲得了成功!最后,為了驗證Karl僅擁有zone-a的寫入權限,我們嘗試向另一個目錄zone-b寫入看看效果:
./azcopy cp ./credit_card_loans.csv https://cloudpickerdlg2.dfs.core.windows.net/cloudpickerfs/zone-b/ INFO: Scanning... INFO: Using OAuth token for authentication. Job 484e24c1-366b-e94b-79b9-8f6351a4d503 has started 0 Done, 0 Failed, 1 Pending, 0 Skipped, 1 Total, Authentication failed, it is either not correct, or expired, or does not have the correct permission -> github.com/Azure/azure-storage-azcopy/azbfs.newStorageError, /home/vsts/work/1/s/azbfs/zc_storage_error.go:41 ===== RESPONSE ERROR (ServiceCode=AuthorizationPermissionMismatch) ===== Description=403 This request is not authorized to perform this operation using this permission., Details: (none) PUT https://cloudpickerdlg2.dfs.core.windows.net/cloudpickerfs/zone-b/credit_card_loans.csv?resource=file&timeout=901 Authorization: REDACTED User-Agent: [AzCopy/10.2.1 Azure-Storage/0.1 (go1.12; linux)] X-Ms-Cache-Control: [] X-Ms-Client-Request-Id: [d8504958-5666-42c1-6041-6db6602713a9] X-Ms-Content-Disposition: [] X-Ms-Content-Encoding: [] X-Ms-Content-Language: [] X-Ms-Content-Type: [text/csv; charset=utf-8] X-Ms-Version: [2018-11-09] -------------------------------------------------------------------------------- RESPONSE Status: 403 This request is not authorized to perform this operation using this permission. Content-Length: [227] Content-Type: [application/json;charset=utf-8] Date: [Sat, 10 Aug 2019 16:33:21 GMT] Server: [Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0] X-Ms-Error-Code: [AuthorizationPermissionMismatch] X-Ms-Request-Id: [206085ca-601f-0035-2699-4f617e000000] X-Ms-Version: [2018-11-09]
也如我們所期望的那樣,向zone-b這個未授權目錄的寫入失敗了。本次實驗充分證明,ADLS Gen2大數據文件系統在ACL方式的加持下,可以輕松實現對目錄層級的細粒度權限控制。
總結
Azure Data Lake Storage Gen2是微軟Azure全新一代的大數據存儲產品,專為企業級數據湖類應用所構建。它被稱為“不妥協的存儲基礎設施”,是因為它繼承了Azure Blob Storage易於使用、成本低廉的特點,同時又加入了目錄層次結構、細粒度權限控制等企業級特性。值得一提的是,這個新近發布的PaaS服務也已經在Azure中國區正式上線。如果您近期有基於Azure構建數據平台的需求,ADLS Gen2非常值得考慮。
在雲間拾遺的本次實踐中,我們從無到有地創建了ADLS Gen2實例並進行了上傳下載等基本操作;我們還基於一個相對復雜的需求場景深度體驗了其權限控制特性。整個的測試體驗是相當流暢的。在本文的下篇,我們還將進一步關注ADLS Gen2的目錄原子操作能力,以及大數據集群掛載場景的表現。敬請期待。
“雲間拾遺”專注於從用戶視角介紹雲計算產品與技術,堅持以實操體驗為核心輸出內容,同時結合產品邏輯對應用場景進行深度解讀。歡迎掃描下方二維碼關注“雲間拾遺”微信公眾號,或訂閱本博客。

