我正在使用Spark MLlib的ALS类来训练MatrixFactorizationModel。我已经设置了一个用于检查中间rdds的HDFS(如ALS类所示)。 rdds已开始保存,但在尝试再次删除它时出现异常:java.lang.IllegalArgumentException: Wrong FS: hdfs://[url], expected: file:///
这是堆栈跟踪:
Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs://[url], expected: file:///
at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:642)
at org.apache.hadoop.fs.RawLocalFileSystem.pathToFile(RawLocalFileSystem.java:69)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:516)
at org.apache.hadoop.fs.ChecksumFileSystem.delete(ChecksumFileSystem.java:528)
at org.apache.spark.ml.recommendation.ALS$$anonfun$2$$anonfun$apply$mcV$sp$1.apply(ALS.scala:568)
at org.apache.spark.ml.recommendation.ALS$$anonfun$2$$anonfun$apply$mcV$sp$1.apply(ALS.scala:566)
at scala.Option.foreach(Option.scala:236)
at org.apache.spark.ml.recommendation.ALS$$anonfun$2.apply$mcV$sp(ALS.scala:566)
at org.apache.spark.ml.recommendation.ALS$$anonfun$train$1.apply$mcVI$sp(ALS.scala:602)
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:141)
at org.apache.spark.ml.recommendation.ALS$.train(ALS.scala:596)
at org.apache.spark.mllib.recommendation.ALS.run(ALS.scala:219)
at adapters.ALSAdapter.run(ALSAdapter.java:59) ...
罪魁祸首似乎是:
at org.apache.spark.ml.recommendation.ALS.scala 568
FileSystem.get(sc.hadoopConfiguration).delete(new Path(file), true)
似乎返回RawLocalFilesystem
而不是分布式文件系统对象。
我没有碰过sc.hadoopConfiguration
。我唯一的互动是致电myJavaStreamingContext.checkpoint(hdfs://[url + directory]);
。
还有什么需要做客户端来设置sc.hadoopConfiguration或问题是hdfs服务器端吗?
我使用的是Spark 1.3.1,但尝试了1.4.1,问题仍然存在。
答案 0 :(得分:0)
你的sc.hadoopConfiguration正在使用本地文件系统(" fs.default.name" = file:///),尽管明确指定了检查点位置,但ALS代码使用sc.hadoopConfiguration来确定文件系统(例如,如果适用,删除以前的检查点等)
你可以试试 设置sc.hadoopConfiguration.set(" fs.default.name",hfds:// xx:port) 设置sc.setCheckpointDir(yourCheckpointDir) 并且只调用没有显式文件系统路径的检查点或查看setCheckpointInterval是否适合你(即让ALS负责检查点)如果您不想在代码中使用sc.hadoopConfiguration.set,可以将hdfs-site.xml和core-site.xml添加到spark classpath