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)
ありがとう!
したがって、いつ新しいFileContextを使用する必要がありますか? ...私は似ているクラス間の精神的なフリップをしなければなりません。しかし、FileSystemインスタンスをクローズすることは常に苦痛です。 FileSystemを閉じることについて心配すべきですか? –
キャッシュからファイルシステムを要求する場合は、ファイルシステムを閉じることについてあまり心配しないでください。 newInstanceを使用する場合は、完了したら閉じます。 (注:ユーザーからのサービス要求を受けている場合は、FileSystem.closeAllForUGIで要求を守った後でファイルシステムを取り除く必要があります –
ありがとう、私は古いFileSystemに固執します。 –