无法从本地文件路径读取文本文件 - 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 阅读器的主要内容,如果未能解决你的问题,请参考以下文章