Apache Spark作业因FileNotFoundExceptoin

时间:2016-10-31 21:47:24

标签: java hadoop apache-spark

我有一个spark群集,由5个节点组成,我有一个用Java编写的spark作业,它从目录中读取文件集并将内容发送到Kafka

当我在本地测试这项工作时,一切正常。

当我尝试将作业提交到群集时,作业失败并显示FileNoTFoundException

需要处理的文件存在于安装在所有5个节点上的目录中,因此我确信文件路径出现在异常中。

以下是提交作业时出现的异常

java.io.FileNotFoundException: File file:/home/me/shared/input_1.txt does not exist
    at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:534)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:747)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:524)
    at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:409)
    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:766)
    at org.apache.hadoop.mapred.LineRecordReader.<init>(LineRecordReader.java:108)
    at org.apache.hadoop.mapred.TextInputFormat.getRecordReader(TextInputFormat.java:67)
    at org.apache.spark.rdd.HadoopRDD$$anon$1.<init>(HadoopRDD.scala:239)
    at org.apache.spark.rdd.HadoopRDD.compute(HadoopRDD.scala:216)
    at org.apache.spark.rdd.HadoopRDD.compute(HadoopRDD.scala:101)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:300)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:300)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:300)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:300)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:300)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
    at org.apache.spark.scheduler.Task.run(Task.scala:88)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

目录/home/me/shared/安装在所有5个节点上。

编辑:

以下是我用来提交作业的命令

bin$ ./spark-submit --total-executor-cores 20 --executor-memory 5G --class org.company.java.FileMigration.FileSparkMigrator --master spark://spark-master:7077 /home/me/FileMigrator-0.1.1-jar-with-dependencies.jar /home/me/shared kafka01,kafka02,kafka03,kafka04,kafka05 kafka_topic

我遇到了一种奇怪的行为。我提交了作业,而目录只包含一个文件,驱动程序抛出异常,但文件处理成功。然后,我添加了另一个文件,发生了相同的行为。但是,一旦我添加了第三个文件,就会抛出异常并且作业失败。

编辑2

经过一些尝试,我们发现安装目录中存在导致这种奇怪行为的问题。

2 个答案:

答案 0 :(得分:1)

默认情况下,Spark默认为HDFS。这看起来像一个NFS文件,因此请尝试使用:file:///home/me/shared/input_1.txt

进行访问

是的,三个/

答案 1 :(得分:0)

以下是为我解决问题的方法。这很奇怪,我不知道实际问题是什么。

我只是要求系统管理员安装另一个目录而不是我正在使用的目录。在那之后,一切都很好。

旧安装目录中似乎存在问题,但我不知道实际问题是什么。