无法从本地文件路径读取文本文件 - 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)
是,这将很好地工作在本地模式,但边缘节点它不会工作的。因为从边缘节点本地文件不可访问。 HDFS通过指定文件的URL来使文件可访问。
是否意味着我们无法从linux读取任何文件文件路径,只有hdfs位置应该用于读取文件? – Shankar
TBO我从来没有试过这个。实际发生的情况是,如果节点无法访问文件,则您为文件提供的路径必须可供主节点和工作节点访问,然后才会遇到此类问题。现在这个问题是基于网络。如果您可以让您的本地文件可以访问主节点和工作节点,那么您不会遇到这样的问题。 –
该文件是否存在于该位置? – mrsrinivas
@mrsrinivas:是可用的,这就是为什么当我以本地模式在纱线集群中运行作业时,它的工作正常,只有它不能在纱线客户端模式下工作。 – Shankar
在正常情况下,它必须按照您的尝试工作。 但是,如果意图是使其工作,然后尝试[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”))' –