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



我在从HDFS FileContext对象访问S3"文件系统"时遇到问题,但我可以使用FileSystem对象来做同样的事情。 据我了解,FileContext已经取代了文件系统,所以如果我需要回退到使用文件系统,我似乎做错了。 我做错了吗? 还是 FileContext 不如旧的文件系统功能强大?

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

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)
}

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

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)

谢谢!

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

最新更新