對象存儲 OSS 提供了與傳統文件系統不同的 API,為了支持傳統程序的快速遷移,BatchCompute 允許用戶將 OSS 目錄直接掛載到虛擬機的本地文件系統,應用程序無需針對 OSS 進行特殊編程即可訪問 OSS 上的數據。
OSS 掛載分為只讀掛載
和可寫掛載
兩種:
只讀掛載
用于訪問程序的輸入數據,通過只讀掛載點的數據訪問將會被自動轉換為 OSS 的訪問請求,數據不需要先下載到虛擬機本地。可寫掛載
目錄下的結果數據將存放在虛擬機的本地,不會上傳到OSS上。使用可寫掛載時請確保虛擬機為結果數據分配了足夠的磁盤空間。
1. 掛載數據目錄
提交作業的時候,可以配置掛載,請參考如下示例。
A) 使用 Java SDK
TaskDescription taskDesc = new TaskDescription();
taskDesc.addInputMapping("oss://mybucket/mydir/", "/home/admin/mydir/"); //只讀掛載
taskDesc.addOutputMapping("/home/admin/mydir/", "oss://mybucket/mydir/"); //可寫掛載
B) 使用 Python SDK
# 只讀掛載
job_desc['DAG']['Tasks']['my-task']['InputMapping'] = {
"oss://mybucket/mydir/": "/home/admin/mydir/"
}
# 可寫掛載
job_desc['DAG']['Tasks']['my-task']['OutputMapping'] = {
"/home/admin/mydir/": "oss://mybucket/mydir/"
}
C) 使用命令行
bcs sub "python main.py" -r oss://mybucket/mydir/:/home/admin/mydir/ # 如果有多個映射,請用逗號隔開
注意
配置 InputMapping,是只讀掛載,意思是只能讀,不能寫,不能刪除。
配置 OutputMapping,寫到 /home/admin/mydir/目錄下的文件或目錄,在任務運行完成后會被自動上傳到 oss://mybucket/mydir/ 下面。
InputMapping 和 OutputMapping 不能指定為同樣的映射。
2. 掛載程序目錄
假如 main.py 在OSS上的路徑為:oss://mybucket/myprograms/main.py,可以掛載 oss://mybucket/myprograms/ 為 /home/admin/myprograms/,然后指定運行命令行python /home/admin/myprograms/main.py
即可。
A) 使用 Java SDK
TaskDescription taskDesc = new TaskDescription();
taskDesc.addInputMapping("oss://mybucket/myprograms/", "/home/admin/myprograms/"); //只讀掛載
Command cmd = new Command()
cmd.setCommandLine("python /home/admin/myprograms/main.py")
params.setCommand(cmd);
taskDesc.setParameters(params);
B) 使用 Python SDK
# 只讀掛載
job_desc['DAG']['Tasks']['my-task']['InputMapping'] = {
"oss://mybucket/myprograms/": "/home/admin/myprograms/"
}
job_desc['DAG']['Tasks']['my-task']['Parameters']['Command']['CommandLine']='python /home/admin/myprograms/main.py'
C) 使用命令行
bcs sub "python /home/admin/myprograms/main.py" -r oss://mybucket/myprograms/:/home/admin/myprograms/
3. 掛載文件
需求: 在OSS上有多個不同前綴下的文件,需要掛載到批量計算VM中的同一個目錄下,該如何使用;
假設 bucket1 和 bucket2 下有兩個文件掛載到 VM 本地的/home/data/
下:
oss://bucket1/data/file1
掛載到/home/data/file1
oss://bucket2/data/file2
掛載到/home/data/file2
另外,作業結束后有兩個 VM 本地的文件分別上傳到 bucket1 和 bucket2:
/home/output/output1
掛載到oss://bucket1/output/file1
/home/output/output2
掛載到oss://bucket2/output/file2
可以參考如下示例:
A) 使用 Java SDK
TaskDescription taskDesc = new TaskDescription();
taskDesc.addInputMapping("oss://bucket1/data/file1", "/home/data/file1");
taskDesc.addInputMapping("oss://bucket2/data/file2", "/home/data/file2");
taskDesc.addOutputMapping("/home/output/output1", "oss://bucket1/output/file1");
taskDesc.addOutputMapping("/home/output/output2", "oss://bucket2/output/file2");
B) 使用 Python SDK
# 只讀掛載
job_desc['DAG']['Tasks']['my-task']['InputMapping'] = {
"oss://bucket1/data/file1": "/home/data/file1",
"oss://bucket2/data/file2": "/home/data/file2"
}
# 可寫掛載
job_desc['DAG']['Tasks']['my-task']['OutputMapping'] = {
"/home/output/output1": "oss://bucket1/output/file1",
"/home/output/output2": "oss://bucket2/output/file2"
}
4. InputMapping 掛載限制說明
A) OSS上存儲對象的命名
單個文件名最長為 255 字節,其他字符集編碼按照折算成 UTF-8 編碼后所實際占用的字節數量計算,通常一個漢字占用 3 個字節。
從根目錄開始計算的組合路徑+文件名長度最大為 1023 個字節。
合法的文件名僅按照 UTF-8 字符集進行定義,其他字符集需轉換為 UTF-8 之后進行合法性檢查。
支持 UTF-8 0x80 以上的所有字符。
不支持 0x00-0x1F 和 0x7F,以及\ / : * ? “ < > |字符。
B) InputMapping 掛載文件的訪問權限
考慮到多個節點向 OSS 寫入文件的一致性問題,InputMapping 掛載服務本身針對 OSS 是只讀行為;應用程序通過文件系統接口的操作,在 任何情況 下都不會修改 OSS 上對應文件的內容,也不會刪除 OSS 上的對應文件。
所有對掛載目錄的修改操作都會緩存在本地(不會同步到 OSS),應用程序可以通過文件系統接口讀取到修改后的內容。在應用程序運行結束文件系統Umount并停止掛載服務后,所有本地緩存的改動都會被放棄;接下來如果重新啟動掛載服務并 mount,那么本地看到文件同 OSS 上對應 Object 的內容一致,上次的改動不再保留。
在掛載目錄中,OSS 上已經存在的文件都會賦予讀取以及執行的權限,沒有寫入權限。應用程序可以執行讀操作,但是修改、截斷、重命名和刪除等操作都會被拒絕。
在掛載目錄中,應用程序可以自由地創建文件和文件夾,這些新創建出來的內容都會賦予讀取、寫入、和執行權限,應用程序可以修改、截斷、重命名和刪除這些文件。
對于 Windows 操作系統來說,系統認為在只讀文件夾下的內容也是無法刪除的。因此對于一個 OSS 上已經存在的文件夾,應用程序可以在里面創建文件,也可以進行修改和截斷操作,但是刪除和重命名操作會被 Windows 系統禁止。比如\127.0.0.1\ossdata\bucket\dir 是 OSS 上已經存在的一個文件夾,應用程序掛載后又在 dir 文件夾里創建了一個文件 file,那么 \127.0.0.1\ossdata\bucket\dir\file 文件是沒辦法刪除和重命名的。但是如果在 \127.0.0.1\ossdata\bucket\dir 下創建文件夾 local, 此時在 \127.0.0.1\ossdata\bucket\dir\local 中再創建其他的文件就都是可以刪除和重命名的,如 \127.0.0.1\ossdata\bucket\dir\local\file,Linux 操作系統中不存在這個問題。
C) 掛載語言問題
OSS 上所有的 Object 的名稱都是用 UTF-8 編碼來保存的,掛載服務本身可以對字符集進行轉換,您需要在集群/作業的描述中指定應用程序使用的字符集,這樣經過掛載服務的轉換,應用程序才可以訪問到正確的文件。
注意,應用程序使用的字符集和操作系統默認的字符集可能是不同的。例如工作在一個簡體中文操作系統中的繁體程序,需要配置字符集為 BIG5,這樣掛載服務會自動將 OSS 上 UTF-8 的路徑和文件名轉換為 BIG5 編碼,雖然從操作系統上觀察到掛載盤中的文件名都是亂碼,但是應用程序的訪問是正確的。
這個字符集轉換功能僅僅影響路徑的文件名,對于文件的內容并沒有作用。
D) 文件鎖
基于 NFS 的 DOS Share 和文件鎖會影響性能,所以如果有頻繁的 IO 操作,建議關閉文件鎖(在通過 mount 掛載的時候增加 nolock 選項)。但是有些特定的應用程序如 3DSMAX 必須用的文件鎖特性,如果缺失這個特性會導致應用程序執行不正確。
E) 文件掛載
將 OSS 上的單獨文件掛載到 VM 本地時,需要保證所有文件到的本地目錄不能時另外文件掛載或者目錄掛載的父目錄。
F) 其他約定
在應用程序運行期間,不應該修改 OSS 應用程序通過掛載正在訪問的文件夾,否則可能引起沖突。任何對應用程序正在訪問的數據做出的修改(包括但不限于刪除、修改文件內容、截斷文件、Append 文件內容)都可能引發應用程序運行結果錯誤。
OSS 上的容量近似無限,所以操作系統統計的當前磁盤利用率并沒有意義,并不代表當前OSS 上存儲空間的使用狀況。
同時刻支持掛載同一個賬號下多個 bucket 中的內容到虛擬機不同的位置。
同時刻不支持掛載多個賬號下的內容到虛擬機。