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

时间:2018-02-12 22:03:37

标签: hadoop apache-spark

出于测试目的,我们希望写入{em>相对本地路径,例如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)

那么是否无法写入本地相对路径?

1 个答案:

答案 0 :(得分:0)

要使用Hadoop API访问本地文件系统,您必须在冒号后使用单次/或三次

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. 

在Spark中,可以使用--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> \