Scala [随机出现][Spark ML ALS][AWS EMR]FileNotFoundException在检查点文件夹中,但文件存在

Scala [随机出现][Spark ML ALS][AWS EMR]FileNotFoundException在检查点文件夹中,但文件存在,scala,apache-spark-ml,checkpoint,Scala,Apache Spark Ml,Checkpoint,我正在AWS EMR上运行一个计划的(每天一次)spark应用程序,该应用程序是一个基于spark.ml.Recommension.ALS的推荐算法,数据位于AWS S3上,该应用程序向一组用户输出建议 为了确保迭代算法运行稳定,我使用了spark的检查点函数。我在AWSS3上设置了checkpoint文件夹 有时候一切都很好。但有时,spark应用程序无法在检查点文件夹中找到该文件,即使该文件实际上存在。我不知道为什么 下面是一个典型的错误日志: 19/10/30 13:46:01警告Task

我正在AWS EMR上运行一个计划的(每天一次)spark应用程序,该应用程序是一个基于spark.ml.Recommension.ALS的推荐算法,数据位于AWS S3上,该应用程序向一组用户输出建议

为了确保迭代算法运行稳定,我使用了spark的检查点函数。我在AWSS3上设置了checkpoint文件夹

有时候一切都很好。但有时,spark应用程序无法在检查点文件夹中找到该文件,即使该文件实际上存在。我不知道为什么

下面是一个典型的错误日志:

19/10/30 13:46:01警告TaskSetManager:在阶段873.0中丢失了任务5.0(TID 12169,ip-10-79-9-182.us-west-2.compute.internal,executor 5):java.io.FileNotFoundException:没有这样的文件或目录:s3a://bucket name/checkpoint/8f63442c-dd06-45d8-8e3a-ec30634b1a2f/rdd-2166/part-00005 位于org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:1642) 位于org.apache.hadoop.fs.s3a.S3AFileSystem.open(S3AFileSystem.java:521) 位于org.apache.spark.rdd.ReliableCheckpointRDD$.readCheckpointFile(ReliableCheckpointRDD.scala:292) 位于org.apache.spark.rdd.ReliableCheckpointRDD.compute(ReliableCheckpointRDD.scala:100) 在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:324)

我检查了S3存储上是否存在
s3a://bucket name/checkpoint/8f63442c-dd06-45d8-8e3a-ec30634b1a2f/rdd-2166/part-00005

我的具体步骤如下:

  • 在s3上创建一个检查点文件夹
  • 将spark的CheckpointDir设置为刚创建的文件夹
  • 运行算法
  • 删除要清理的检查点文件夹
  • 这是我的scala代码:

    //step 1
    val pathString = "s3a://bucket-name/checkpoint"
    val path = new Path(pathString)
    val fileSystem = FileSystem.get(path.toUri, sparkContext.hadoopConfiguration)
    fileSystem.mkdirs(path)
    
    //step 2
    sparkContext.setCheckpointDir(pathString)
    
    //step 3
    //... lots of data that not so relevant
    val als = new ALS()
          .setRank(10)
          .setMaxIter(20)
          .setUserCol("userId")
          .setItemCol("clubId")
          .setRatingCol("rating")
          .setCheckpointInterval(10)
          .setColdStartStrategy("drop")
          .setPredictionCol("prediction")
    //... another lots of data that not so relevant
    
    //step 4
    fileSystem.delete(path, recursive = true)
    

    S3最终是一致的-有时404可以缓存在负载平衡器中,如果客户端在创建文件之前执行HEAD操作-然后在后续的HEAD/get请求中返回404(a)缓存项刷新,使其保持不变

    S3A连接器最近做了大量工作,试图消除此问题(与此相关),但尚未发货。虽然它在消除s3a连接器中的问题方面做了很多工作,但它仍然可能容易受到spark使用代码时出现的怪癖的影响。应该有人检查检查点,以确保它创建的文件覆盖=true

    同时:如果您使用hadoop 3.2.x二进制文件并使用S3Guard来获得一致的列表,那么它应该知道在这里重试足够多——您可能只需要将重试间隔调整得更大一点,以便URL保持足够长的时间,以便缓存被清除


    否则,请尝试在创建文件和尝试重命名或打开文件之间的工作流程中添加一些30-60秒睡眠,看看这是否有帮助

    S3最终是一致的-有时,如果客户端在创建文件之前执行HEAD,404可以缓存在负载平衡器中-然后在后续HEAD/get请求中,404(a)返回(b)缓存条目刷新,使其保持不变

    S3A连接器最近做了大量工作,试图消除此问题(与此相关),但尚未发货。虽然它在消除s3a连接器中的问题方面做了很多工作,但它仍然可能容易受到spark使用代码时出现的怪癖的影响。应该有人检查检查点,以确保它创建的文件覆盖=true

    同时:如果您使用hadoop 3.2.x二进制文件并使用S3Guard来获得一致的列表,那么它应该知道在这里重试足够多——您可能只需要将重试间隔调整得更大一点,以便URL保持足够长的时间,以便缓存被清除


    否则,请尝试在创建文件和尝试重命名或打开文件之间的工作流程中添加一些30-60秒睡眠,看看这是否有帮助

    问题已经解决了。 我将检查点文件夹的位置从使用s3更改为hdfs,现在程序每次都能成功运行。s3最终是一致的,因此不适合用于检查点文件夹


    问题已经解决了。 我将检查点文件夹的位置从使用s3更改为hdfs,现在程序每次都能成功运行。s3最终是一致的,因此不适合用于检查点文件夹


    谢谢你的建议!您是对的,S3最终是一致的,所以它不太适合用于检查点。我改为使用HDFS来存储checkpoint文件夹,现在一切都好了谢谢你的建议!您是对的,S3最终是一致的,所以它不太适合用于检查点。我改为使用HDFS来存储checkpoint文件夹,现在一切都好了
    val pathString = "s3a://bucket-name/checkpoint"
    
    val pathString = "hdfs:///checkpoint"