我无法访问S3"文件系统"从HDFS FileContext对象,但我可以使用FileSystem对象来做同样的事情。 据我了解, FileContext 已取代 FileSystem ,所以如果我需要回退使用 FileSystem ,我似乎做错了。 我做错了吗?或者FileContext是否不如旧的FileSystem功能?
我的功能(仅供参考 - 我从Jupyter运行此功能,使用带有hadoop 2.6.0-cdh5.5.1的spark 2.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)
谢谢!
答案 0 :(得分:2)
继续使用FileSystem API;因为它的低级性质,它实际上是S3性能开发的大部分。现在有一个从FileContext到S3AFileSystem类的桥接类,但显然不在你的CDH版本中。