Hadoop S3访问 - FileSystem vs FileContext

时间:2017-08-24 18:33:18

标签: hadoop amazon-s3

我无法访问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)

谢谢!

1 个答案:

答案 0 :(得分:2)

继续使用FileSystem API;因为它的低级性质,它实际上是S3性能开发的大部分。现在有一个从FileContext到S3AFileSystem类的桥接类,但显然不在你的CDH版本中。