全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
批量计算

OSS挂载

更新时间:2017-06-20 14:12:52

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.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操作系统中不存在这个问题。

(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中的内容到不同的位置。

  • 同一时刻只支持挂载同一个帐号下的文件,不能同时挂载多个帐号下的内容。

本文导读目录