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

问题描述:

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

我们正在提交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) 
+0

该文件是否存在于该位置? – mrsrinivas

+0

@mrsrinivas:是可用的,这就是为什么当我以本地模式在纱线集群中运行作业时,它的工作正常,只有它不能在纱线客户端模式下工作。 – Shankar

+1

在正常情况下,它必须按照您的尝试工作。 但是,如果意图是使其工作,然后尝试[SparkFiles](https://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/SparkFiles.html)您的情况像这样的'进口org.apache.spark.SparkFiles SparkContext.addFile( “文件:/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”))' –

是,这将很好地工作在本地模式,但边缘节点它不会工作的。因为从边缘节点本地文件不可访问。 HDFS通过指定文件的URL来使文件可访问。

+0

是否意味着我们无法从linux读取任何文件文件路径,只有hdfs位置应该用于读取文件? – Shankar

+0

TBO我从来没有试过这个。实际发生的情况是,如果节点无法访问文件,则您为文件提供的路径必须可供主节点和工作节点访问,然后才会遇到此类问题。现在这个问题是基于网络。如果您可以让您的本地文件可以访问主节点和工作节点,那么您不会遇到这样的问题。 –