无法从本地文件路径读取文本文件 - Spark CSV 阅读器

Posted

技术标签:

【中文标题】无法从本地文件路径读取文本文件 - Spark CSV 阅读器【英文标题】:Not able to read text file from local file path - Spark CSV reader 【发布时间】:2016-12-24 08:54:45 【问题描述】:

我们正在使用 Spark CSV 阅读器读取要转换为 DataFrame 的 csv 文件,我们正在 yarn-client 上运行作业,它在本地模式下工作正常。

我们正在edge node 提交火花作业。

但是当我们将文件放在本地文件路径而不是 HDFS 中时,我们会收到文件未找到异常。

代码:

sqlContext.read.format("com.databricks.spark.csv")
      .option("header", "true").option("inferSchema", "true")
      .load("file:/filepath/file.csv")

我们也尝试了file:///,但仍然遇到同样的错误。

错误日志:

2016-12-24 16:05:40,044 WARN  [task-result-getter-0] scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, hklvadcnc06.hk.standardchartered.com): java.io.FileNotFoundException: File file:/shared/sample1.csv does not exist
        at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:609)
        at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:822)
        at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:599)
        at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:421)
        at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.<init>(ChecksumFileSystem.java:140)
        at org.apache.hadoop.fs.ChecksumFileSystem.open(ChecksumFileSystem.java:341)
        at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:767)
        at org.apache.hadoop.mapred.LineRecordReader.<init>(LineRecordReader.java:109)
        at org.apache.hadoop.mapred.TextInputFormat.getRecordReader(TextInputFormat.java:67)
        at org.apache.spark.rdd.HadoopRDD$$anon$1.<init>(HadoopRDD.scala:241)
        at org.apache.spark.rdd.HadoopRDD.compute(HadoopRDD.scala:212)
        at org.apache.spark.rdd.HadoopRDD.compute(HadoopRDD.scala:101)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:313)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:277)
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:313)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:277)
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:313)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:277)
        at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
        at org.apache.spark.scheduler.Task.run(Task.scala:89)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

【问题讨论】:

该文件是否存在于该位置? @mrsrinivas:是的,它可用,这就是为什么当我在本地模式下在纱线集群中运行作业时,它工作正常,只是它在纱线客户端模式下不工作。 在正常情况下,它必须像您尝试的那样工作。但是,如果打算让它工作,那么试试SparkFiles你的情况类似import org.apache.spark.SparkFiles SparkContext.addFile("file:/filepath/file.csv") println(SparkFiles.getRootDirectory()) println(SparkFiles.get("file.csv")) sqlContext.read.format("com.databricks.spark.csv") .option("header", "true").option("inferSchema", "true") .load(SparkFiles.get("file.csv")) 另外,请将所有版本和 spark-submit 命令一起发布/作为您问题的一部分。 @Ram Ghadiyaram:谢谢,我明天会试试 Sparkfiles,然后告诉你.... 【参考方案1】:

是的,这在本地模式下可以正常工作,但在 边缘节点 上它将无法正常工作。因为从 edge 节点 无法访问本地文件。 HDFS 通过指定文件的 URL 使文件可以访问。

【讨论】:

是不是说我们不能从linux文件路径读取任何文件,只能使用hdfs位置读取文件? TBO 我从来没有试过这个。实际发生的是,如果节点无法访问文件,则您为文件提供的路径必须可供主节点和工作节点访问,那么您将面临此类问题。现在这个问题是基于网络的。如果您可以使主节点和工作节点可以访问本地文件,那么您就不会遇到此类问题。【参考方案2】:

看起来像一个错误。在读取本地文件时在 spark-shell 命令中,但是有一个解决方法 在运行spark-submit 命令时,只需在命令中指定即可。

--conf "spark.authenticate=false"

SPARK-23476 供参考。

【讨论】:

以上是关于无法从本地文件路径读取文本文件 - Spark CSV 阅读器的主要内容,如果未能解决你的问题,请参考以下文章

windows上spark shell读取本地文件

无法从 synapse spark scala notebook 读取 csv 文件

spark 可以直接向hdfs 输入数据吗

Spark,Scala在从文件读取后无法正确创建视图

在火花分析之前从 FTP 读取大文本文件

C#从文本文件中读取路径说路径不存在[重复]