全部產品
Search
文件中心

Batch Compute:OSS掛載

更新時間:Jul 06, 2024

Object Storage Service 提供了與傳統檔案系統不同的 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 中的內容到虛擬機器不同的位置。

  • 同時刻不支援掛載多個帳號下的內容到虛擬機器。