-1

假设我有一个 Spark 2.x 应用程序,它启用了推测 (spark.speculation=true),它将数据写入 HDFS 上的特定位置。

现在,如果任务(将数据写入 HDFS)需要很长时间,Spark 将在另一个执行器上创建相同任务的副本,并且两个作业将并行运行。

Spark 是如何处理这个问题的?显然,这两个任务不应该同时尝试在同一个文件位置写入数据(在这种情况下似乎正在发生)。

任何帮助,将不胜感激。

谢谢

4

1 回答 1

1

据我了解,我的任务中发生了什么:

  1. 如果一个推测任务完成,另一个被杀死
    当spark杀死这个任务时,它会删除这个任务写入的临时文件
    所以不会有数据重复
  2. 如果您选择 mode overwrite,某些特定任务可能会失败并出现以下异常:

原因:org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException): 无法创建文件/<hdfs_path>/.spark-staging-<...>///part-00191 -.c000.snappy.parquet 用于 10.3.110.14 上的 DFSClient_NONMAPREDUCE_936684547_1,因为此文件租约当前由 10.0.14.64 上的 DFSClient_NONMAPREDUCE_-1803714432_1 拥有,位于 org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal(FSNamesystem.java:2629.java )

我将继续研究这种情况,所以也许有一天答案会更有帮助

于 2021-07-07T13:51:20.910 回答