【问题标题】:Create File instance with URI pointing to HDFS使用指向 HDFS 的 URI 创建文件实例
【发布时间】:2017-09-13 13:43:12
【问题描述】:

是否可以通过将我的 HDFS 的 uri 作为 File 类的构造函数来创建文件实例?例如:

val conf = new Configuration()
conf.addResource(hdfsCoreSitePath)
conf.addResource(hdfsHDFSSitePath)

val uri = conf.get("fs.default.name")
val file = new File(uri + pathtothefile)

然后,对于文件实例,我希望使用 File 类提供的函数(例如 file.list())访问文件列表,以返回一个字符串数组,该数组命名由该抽象路径名表示的目录中的文件和目录。我尝试了代码,但它在file.list() 上返回null

不推荐使用以下方法,因为我正在尝试为普通文件系统和hdfs编写相同的代码库以实现代码可重用。

val fileSystem = FileSystem.get(conf)
val status = fileSystem.listStatus(new Path(filepath))
status.map(x => ...

【问题讨论】:

    标签: java scala hadoop hdfs


    【解决方案1】:

    常规的内置 Java/Scala 文件 API 不适用于 HDFS 文件。协议和实现太不同了。您必须使用 Hadoop API 来访问 HDFS 文件,如第二个示例所示。

    不过,好消息是 Hadoop API适用于非 HDFS 文件(常规文件)。所以该代码是可重用的。只需对本地文件使用如下 URI:file:///foo/bar

    【讨论】:

      【解决方案2】:

      fs.default.name 已弃用。尝试使用 fs.defaultFS 并确保此属性在您使用以下命令引用的 core-site.xml 文件中可用

      conf.addResource(hdfsCoreSitePath)
      

      https://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/core-default.xml

      【讨论】:

      • 我提到的方法,val fileSystem = FileSystem.get(conf) val status = fileSystem.listStatus(new Path(filepath)) status.map(x => ... 它正在工作,但是出于某种原因,我试图使用 val file = new File(uri + pathtothefile) 不起作用,我想知道文件的 uri 仅适用于普通文件系统,但不适用于 hdfs
      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 2022-11-18
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      相关资源
      最近更新 更多