閱讀718 返回首頁    go 阿裏雲


OSS掛載__操作指南_批量計算-阿裏雲

A君: 我在OSS上有10G的數據, 想要在BatchCompute中使用,有沒有方法掛載為虛擬機上的一個目錄,我可以想訪問本地文件一樣使用數據?

假設 OSS目錄為: oss://mybucket/mydir/, 這個目錄下有10G的數據。

你可以將這個OSS目錄掛載到 /home/admin/mydir/ 目錄下,任務程序可以把它當做本地目錄來處理。

  • 注意:如果使用windows鏡像,隻能掛載到盤符, 如: “E:”, 而不能掛載到文件夾.

1. 掛載數據目錄

提交作業的時候,可以配置掛載,請看下麵的例子。

(1). 使用 Java SDK

  1. TaskDescription taskDesc = new TaskDescription();
  2. taskDesc.addInputMapping("oss://mybucket/mydir/", "/home/admin/mydir/"); //隻讀掛載
  3. taskDesc.addOutputMapping("/home/admin/mydir/", "oss://mybucket/mydir/"); //可寫掛載

(2). 使用 Python SDK

  1. # 隻讀掛載
  2. job_desc['DAG']['Tasks']['my-task']['InputMapping'] = {
  3. "oss://mybucket/mydir/": "/home/admin/mydir/"
  4. }
  5. # 可寫掛載
  6. job_desc['DAG']['Tasks']['my-task']['OutputMapping'] = {
  7. "/home/admin/mydir/": "oss://mybucket/mydir/"
  8. }

(3). 使用命令行

  1. bcs sub "python main.py" -r oss://mybucket/mydir/:/home/admin/mydir/ # 如果有多個映射,請用逗號隔開

注意:

  • 配置InputMapping,是隻讀掛載,意思是隻能讀,不能寫,不能刪除。

  • 配置OutputMapping,凡是寫到 /home/admin/mydir/目錄下的文件或目錄,在任務運行完成後,會被自動上傳到 oss://mybucket/mydir/ 下麵。

2. 掛載程序目錄

A君: 我在OSS上有個程序 main.py, 想要在BatchCompute中使用, 如何使用?

假如 main.py 在OSS上的路徑為: oss://mybucket/myprograms/main.py。

可以掛載 oss://mybucket/myprograms/ 為 /home/admin/myprograms/,

然後指定運行命令行:python /home/admin/myprograms/main.py 即可。

(1). 使用 Java SDK

  1. TaskDescription taskDesc = new TaskDescription();
  2. taskDesc.addInputMapping("oss://mybucket/myprograms/", "/home/admin/myprograms/"); //隻讀掛載
  3. Command cmd = new Command()
  4. cmd.setCommandLine("python /home/admin/myprograms/main.py")
  5. params.setCommand(cmd);
  6. taskDesc.setParameters(params);

(2). 使用 Python SDK

  1. # 隻讀掛載
  2. job_desc['DAG']['Tasks']['my-task']['InputMapping'] = {
  3. "oss://mybucket/myprograms/": "/home/admin/myprograms/"
  4. }
  5. job_desc['DAG']['Tasks']['my-task']['Parameters']['Command']['CommandLine']='python /home/admin/myprograms/main.py'

(3). 使用命令行

  1. bcs sub "python /home/admin/myprograms/main.py" -r oss://mybucket/myprograms/:/home/admin/myprograms/

3. InputMapping掛載限製說明

(1) OSS上存儲對象的命名

  • 單個文件名最長為255個字節,其他字符集編碼按照折算成UTF-8編碼後所實際占用的字節數量計算,通常一個漢字占用3個字節。
  • 從根目錄開始計算的組合路徑+文件名長度最大為1023個字節。
  • 合法的文件名僅按照UTF-8字符集進行定義,其他字符集需轉換為UTF-8之後進行合法性檢查。
  • 支持UTF-8 0x80以上的所有字符。
  • 不支持0x00-0x1F和0x7F,以及 / : * ? “ < > |字符。

(2) InputMapping掛載文件的訪問權限

考慮到多個節點向OSS寫入文件的一致性問題,InputMapping掛載服務本身針對OSS是隻讀行為,應用程序通過文件係統接口的操作,在任何情況下都不會修改OSS上對應文件的內容,也不會刪除OSS上的對應文件。

  • 所有對掛載目錄的修改操作,都會緩存在本地,應用程序可以通過文件係統接口讀取到修改後的內容,但是不會自動同步到OSS。在應用程序運行結束,unmount文件係統並停止掛載服務後,所有本地緩存的改動都會被放棄,接下來如果重新啟動掛載服務並mount,那麼本地看到文件同OSS上對應Object的內容一致,上次的改動不再保留。

  • 在掛載目錄中,OSS上已經存在的文件都會賦予讀取、執行的權限,沒有寫入權限。應用程序可以執行讀操作,但是修改、截斷、重命名和刪除等操作都會被拒絕。

  • 在掛載目錄中,應用程序可以自由地創建文件和文件夾,這些新創建出來的內容都會賦予讀取、寫入、和執行權限,應用程序可以修改、截斷、重命名和刪除這些文件。

  • 對於Windows操作係統來說,係統認為在隻讀文件夾下的內容也是無法刪除的。因此對於一個OSS上已經存在的文件夾,應用程序可以在裏麵創建文件,也可以進行修改和截斷操作,但是刪除和重命名操作會被Windows係統禁止。比如127.0.0.1ossdatabucketdir 是OSS上已經存在的一個文件夾,應用程序掛載後又在dir文件夾裏創建了一個文件file,那麼這個 127.0.0.1ossdatabucketdirfile文件是沒辦法刪除和重命名的。但是如果在127.0.0.1ossdatabucketdir下創建文件夾local, 此時在127.0.0.1ossdatabucketdirlocal中再創建其他的文件就都是可以刪除和重命名的了,如127.0.0.1ossdatabucketdirlocalfile。Linux操作係統中不存在這個問題。

(3) 掛載語言問題

OSS上所有的Object的名稱都是用UTF-8編碼來保存的,掛載服務本身可以對字符集進行轉換,您需要在集群/作業的描述中指定應用程序使用的字符集,這樣經過掛載服務的轉換,應用程序才可以訪問到正確的文件。

注意,應用程序使用的字符集和操作係統默認的字符集可能是不同的。例如工作在一個簡體中文操作係統中的繁體程序,需要配置字符集為BIG5,這樣掛載服務會自動將OSS上UTF-8的路徑和文件名轉換為BIG5編碼,雖然從操作係統上觀察到掛載盤中的文件名都是亂碼,但是應用程序的訪問是正確的。

這個字符集轉換功能僅僅影響路徑的文件名,對於文件的內容並沒有作用。

(4) 文件鎖

基於NFS的DOS Share和文件鎖會影響性能,所以如果有頻繁的IO操作,建議關閉文件鎖(在通過mount掛載的時候增加nolock選項)。但是有些特定的應用程序如3DSMAX必須用的文件鎖特性,如果缺失這個特性會導致應用程序執行不正確,在這個時候就需要打開文件鎖選項。

(5) 其他約定

  • 在應用程序運行期間,不應該修改OSS應用程序通過掛載正在訪問的文件夾,否則可能引起衝突。任何對應用程序正在訪問的數據做出的修改(包括但不限於刪除、修改文件內容、截斷文件、Append文件內容)都可能引發應用程序運行結果錯誤。

  • OSS上的容量近似無限,所以操作係統統計的當前磁盤利用率並沒有意義,並不代表當前OSS上存儲空間的使用狀況。

  • 可以同時分別掛載同一bucket中的多個目錄到不同的位置。

  • 可以同時分別掛載同一帳號下多個bucket中的內容到不同的位置。

  • 同一時刻隻支持掛載同一個帳號下的文件,不能同時掛載多個帳號下的內容。

最後更新:2016-11-23 16:03:58

  上一篇:go 如何提交作業__操作指南_批量計算-阿裏雲
  下一篇:go 自定義鏡像__操作指南_批量計算-阿裏雲