Hadoop S3访问-文件系统与文件上下文

Hadoop S3访问-文件系统与文件上下文,hadoop,amazon-s3,Hadoop,Amazon S3,我从HDFS FileContext对象访问S3“文件系统”时遇到问题,但我可以使用FileSystem对象执行同样的操作。 据我所知,FileContext已经取代了文件系统,因此,如果我需要重新使用文件系统,我似乎做错了。 我做错了吗?或者FileContext的功能不如旧的文件系统 我的函数(仅供参考-我从Jupyter运行此函数,使用spark 2.1和hadoop 2.6.0-cdh5.5.1): 输出(pathExistsFs工作,pathExistsFc失败): 路径existsf

我从HDFS FileContext对象访问S3“文件系统”时遇到问题,但我可以使用FileSystem对象执行同样的操作。 据我所知,FileContext已经取代了文件系统,因此,如果我需要重新使用文件系统,我似乎做错了。 我做错了吗?或者FileContext的功能不如旧的文件系统

我的函数(仅供参考-我从Jupyter运行此函数,使用spark 2.1和hadoop 2.6.0-cdh5.5.1):

输出(pathExistsFs工作,pathExistsFc失败):

路径existsf(“myBucket”、“my3key/path.txt”) >>>res36_5:布尔值=真值 pathExistsFc(“myBucket”、“my3key/path.txt”) >>>org.apache.hadoop.fs.UnsupportedFileSystemException:scheme:s3a没有抽象文件系统。。。 org.apache.hadoop.fs.UnsupportedFileSystemException:scheme:s3a没有抽象文件系统 org.apache.hadoop.fs.AbstractFileSystem.createFileSystem(AbstractFileSystem.java:154) org.apache.hadoop.fs.AbstractFileSystem.get(AbstractFileSystem.java:242) org.apache.hadoop.fs.FileContext$2.run(FileContext.java:337) org.apache.hadoop.fs.FileContext$2.run(FileContext.java:334) java.security.AccessController.doPrivileged(本机方法) javax.security.auth.Subject.doAs(Subject.java:422) org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671) org.apache.hadoop.fs.FileContext.getAbstractFileSystem(FileContext.java:334) org.apache.hadoop.fs.FileContext.getFileContext(FileContext.java:451) $sess.cmd37包装器$Helper$Hadoop$.pathExistsFc(cmd37.sc:14) $sess.cmd42Wrapper$Helper。(cmd42.sc:8) $sess.cmd42Wrapper.(cmd42.sc:686) $sess.cmd42$(cmd42.sc:545) $sess.cmd42$(cmd42.sc:-1)
谢谢

继续使用文件系统API;由于它的低级别特性,它实际上是大多数S3性能开发人员的目标。现在有一个从FileContext到S3AFileSystem类的桥接类,但这显然不在CDH版本中。

那么我什么时候应该使用较新的FileContext。。。我不喜欢在类似的课程之间进行思维转换。但是跟踪关闭文件系统实例总是一件痛苦的事情。我应该担心关闭文件系统吗?如果您要求从缓存中获取文件系统,不要太担心关闭它们。如果使用newInstance,请在完成后关闭。(注意:如果您有一些来自用户的服务部署请求,您确实需要在使用文件系统部署请求后删除文件系统。CloseAllForugi谢谢,听起来我会继续使用旧的文件系统。似乎FileContext是一个很好的升级主意,它没有完全跨越终点线。两个问题:1.它没有向后移植到Hadoop 1,因此推迟了它的采用;2.从FileContext到文件系统的桥梁非常好,实现无需承诺只作为FileContext。
val hdfsConf = spark.sparkContext.hadoopConfiguration  
import _root_.org.apache.hadoop.conf.Configuration
import _root_.org.apache.hadoop.fs.{FileContext, Path, FileSystem}

def pathExistsFs(bucket:String, pStr:String): Boolean = {
  val p = new Path(pStr)
  val fs = FileSystem.get(new URI(s"s3a://$bucket"), spark.sparkContext.hadoopConfiguration)
  fs.exists(p)  
}

def pathExistsFc(bucket:String, pStr:String): Boolean = {
  val p = new Path(pStr)
  val fc = FileContext.getFileContext(new URI(s"s3a://$bucket"), 
  spark.sparkContext.hadoopConfiguration)
  fc.util().exists(p)
}
pathExistsF("myBucket", "myS3Key/path.txt") 
>>> res36_5: Boolean = true


pathExistsFc("myBucket", "myS3Key/path.txt") 
>>> org.apache.hadoop.fs.UnsupportedFileSystemException: No AbstractFileSystem for scheme: s3a...


org.apache.hadoop.fs.UnsupportedFileSystemException: No AbstractFileSystem for scheme: s3a
org.apache.hadoop.fs.AbstractFileSystem.createFileSystem(AbstractFileSystem.java:154)
org.apache.hadoop.fs.AbstractFileSystem.get(AbstractFileSystem.java:242)
org.apache.hadoop.fs.FileContext$2.run(FileContext.java:337)
org.apache.hadoop.fs.FileContext$2.run(FileContext.java:334)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAs(Subject.java:422)
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
org.apache.hadoop.fs.FileContext.getAbstractFileSystem(FileContext.java:334)
org.apache.hadoop.fs.FileContext.getFileContext(FileContext.java:451)
$sess.cmd37Wrapper$Helper$Hadoop$.pathExistsFc(cmd37.sc:14)
$sess.cmd42Wrapper$Helper.<init>(cmd42.sc:8)
$sess.cmd42Wrapper.<init>(cmd42.sc:686)
$sess.cmd42$.<init>(cmd42.sc:545)
$sess.cmd42$.<clinit>(cmd42.sc:-1)