本文介绍使用 OSS SDK 存在的问题以及推荐做法。

使用 OSS SDK 存在的问题

若在 Spark 或者 Hadoop 作业中无法直接使用 OSS SDK 来操作 OSS 中的文件,是因为OSS SDK 中依赖的 http-client-4.4.x 版本与 Spark 或者 Hadoop 运行环境中的 http-client 存在版本冲突。如果要这么做,就必须先解决这个依赖冲突问题。实际上在 E-MapReduce 中,Spark 和 Hadoop 已经对 OSS 做了无缝兼容,可以像使用 HDFS 一样来操作 OSS 文件。

  • 当前 E-MapReduce 环境支持 MetaService 服务,可以支持在 E-MapReduce 环境免 AccessKey 访问 OSS 数据。旧的显式输入 AccessKey 的方式依旧支持,请注意在操作 OSS 的时候优先使用内网的 Endpoint。
  • 当您需要在本地进行测试的时候,才要用到 OSS 的外网的 Endpoint,这样才能从本地访问到 OSS 的数据。

所有的 Endpint 可以参考OSS Endpoint

推荐做法(以免 AccessKey 方式为例)

请您使用如下方法来查询 OSS 目录下的文件:
[Scala] 
   import org.apache.hadoop.conf.Configuration
   import org.apache.hadoop.fs.{Path, FileSystem}
   val dir = "oss://bucket/dir"
   val path = new Path(dir)
   val conf = new Configuration()
   conf.set("fs.oss.impl", "com.aliyun.fs.oss.nat.NativeOssFileSystem")
   val fs = FileSystem.get(path.toUri, conf)
   val fileList = fs.listStatus(path)
   ...
   [Java]
   import org.apache.hadoop.conf.Configuration;
   import org.apache.hadoop.fs.Path;
   import org.apache.hadoop.fs.FileStatus;
   import org.apache.hadoop.fs.FileSystem;
   String dir = "oss://bucket/dir";
   Path path = new Path(dir);
   Configuration conf = new Configuration();
   conf.set("fs.oss.impl", "com.aliyun.fs.oss.nat.NativeOssFileSystem");
   FileSystem fs = FileSystem.get(path.toUri(), conf);
   FileStatus[] fileList = fs.listStatus(path);
   ...