Hadoop文件系统API可以写入相对本地文件路径吗?



为了测试目的,我们想写入相对 target/pipelines的本地路径。尝试的URI

 file://target/pipelines/output.parquet

通过Spark访问:

if (!FileSystem.get(spark.sparkContext.hadoopConfiguration).exists(new Path(path))) {

但是,hadoop filesystem API似乎对此并不热衷:

Wrong FS: file://target/pipelines/inputData1, expected: file:///

完整的堆栈:

java.lang.IllegalArgumentException: 
    Wrong FS: file://target/pipelines/inputData1, expected: file:///
    at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:649)
    at org.apache.hadoop.fs.RawLocalFileSystem.pathToFile(RawLocalFileSystem.java:82)
    at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:606)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:824)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:601)
    at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:421)
    at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1426)
    at com.mycompany.DataFrameUtils$.generateParquetFile(DataFrameUtils.scala:71)

所以不可能写入本地相对路径?

用于使用Hadoop API访问本地文件系统,您必须在colon

之后使用单个/或//三次

file:/target/pipelines/output.parquet

file:///target/pipelines/output.parquet

为了使用相对路径(PWD(,如果是通过命令行 - 下面的命令应起作用。

hadoop  fs -Dfs.defaultFS="file:/" -ls  testdir 

如果要在Scala或Java应用程序中使用相同的内容,则需要在驱动程序代码中设置以下配置,从路径变量中取出file:///,只需给出相对路径即可。

conf.set("fs.defaultFS","file:/");  # Hadoop Configuration Object. 

在火花中,这种配置可以使用-CONF选项在Spark-Submit命令行中骑行,并从路径变量中取出file:///,只需给出相对路径即可。

./bin/spark-submit
  --conf fs.defaultFS="file:/" 
  --class <main-class> 
  --master <master-url> 
  --deploy-mode <deploy-mode> 
  ... # other options
  <application-jar> 

最新更新