2017-08-24 3 views
1

HDFS FileContextオブジェクトからS3 "ファイルシステム"にアクセスする際に問題がありますが、FileSystemオブジェクトを使用して同じことを行うことができます。私が理解したよう 、FileContextので、私がFileSystemのを使用してにフォールバックする必要がある場合、私はそれが間違ってやっているようだFileSystemのを置き換えました。 私は間違っているのですか?または、FileContextは古いFileSystemと同じように機能しませんか?Hadoop S3アクセス - FileSystem vs FileContext

マイ機能(FYI - 私はHadoopの2.6.0-cdh5.5.1でスパーク2.1を使用して、Jupyterからこれを実行している):

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) 

ありがとう!

答えて

2

FileSystem APIを使用してください。それは低レベルの性質のため、実際にはS3の性能開発者のほとんどが行くところです。現在、FileContextからS3AFileSystemクラスまでのブリッジクラスがありますが、それは明らかにあなたのCDHバージョンにはありません。

+0

したがって、いつ新しいFileContextを使用する必要がありますか? ...私は似ているクラス間の精神的なフリップをしなければなりません。しかし、FileSystemインスタンスをクローズすることは常に苦痛です。 FileSystemを閉じることについて心配すべきですか? –

+1

キャッシュからファイルシステムを要求する場合は、ファイルシステムを閉じることについてあまり心配しないでください。 newInstanceを使用する場合は、完了したら閉じます。 (注:ユーザーからのサービス要求を受けている場合は、FileSystem.closeAllForUGIで要求を守った後でファイルシステムを取り除く必要があります –

+0

ありがとう、私は古いFileSystemに固執します。 –

関連する問題