Uh oh!
There was an error while loading. Please reload this page.
[SPARK-28699][Core] Fix a corner case for aborting indeterminate stage - #25498
[SPARK-28699][Core] Fix a corner case for aborting indeterminate stage#25498xuanyuanking wants to merge 2 commits into
Conversation
Uh oh!
There was an error while loading. Please reload this page.
cloud-fan
commented
Aug 19, 2019
good catch! LGTM |
Uh oh!
There was an error while loading. Please reload this page.
SparkQA
commented
Aug 19, 2019
Test build #109349 has finished for PR 25498 at commit
|
Uh oh!
There was an error while loading. Please reload this page.
| null)) | ||
| val failedStages = scheduler.failedStages.toSeq | ||
| assert(failedStages.length == 2) |
There was a problem hiding this comment.
not big deal, but I think this assert still applies?
There was a problem hiding this comment.
After this change, failedStages.length == 0 because we do the cleanup work in failJobAndIndependentStages by cleanupStateForJobAndIndependentStages.
Uh oh!
There was an error while loading. Please reload this page.
SparkQA
commented
Aug 20, 2019
Test build #109378 has finished for PR 25498 at commit
|
cloud-fan
commented
Aug 20, 2019
thanks, merging to master! @xuanyuanking can you send PRs for branch 2.3 and 2.4? the code conflicts. |
xuanyuanking
commented
Aug 20, 2019
Sure, I'm doing the backport now. |
Change the logic of collecting the indeterminate stage, we should look at stages from mapStage, not failedStage during handle FetchFailed.
In the fetch failed error handle logic, the original logic of collecting indeterminate stage from the fetch failed stage. And in the scenario of the fetch failed happened in the first task of this stage, this logic will cause the indeterminate stage to resubmit partially. Eventually, we are capable of getting correctness bug.
It makes the corner case of indeterminate stage abort as expected.
New UT in DAGSchedulerSuite.
Run below integrated test with `local-cluster[5, 2, 5120]`, and set `spark.sql.execution.sortBeforeRepartition`=false, it will abort the indeterminate stage as expected:
```
import scala.sys.process._
import org.apache.spark.TaskContext
val res = spark.range(0, 10000 * 10000, 1).map{ x => (x % 1000, x)}
// kill an executor in the stage that performs repartition(239)
val df = res.repartition(113).map{ x => (x._1 + 1, x._2)}.repartition(239).map { x =>
if (TaskContext.get.attemptNumber == 0 && TaskContext.get.partitionId < 1 && TaskContext.get.stageAttemptNumber == 0) {
throw new Exception("pkill -f -n java".!!)
}
x
}
val r2 = df.distinct.count()
```
Closesapache#25498 from xuanyuanking/SPARK-28699-followup.
Authored-by: Yuanjian Li <xyliyuanjian@gmail.com>
Signed-off-by: Wenchen Fan <wenchen@databricks.com>
(cherry picked from commit 0d3a783)
Signed-off-by: Yuanjian Li <xyliyuanjian@gmail.com>Change the logic of collecting the indeterminate stage, we should look at stages from mapStage, not failedStage during handle FetchFailed.
In the fetch failed error handle logic, the original logic of collecting indeterminate stage from the fetch failed stage. And in the scenario of the fetch failed happened in the first task of this stage, this logic will cause the indeterminate stage to resubmit partially. Eventually, we are capable of getting correctness bug.
It makes the corner case of indeterminate stage abort as expected.
New UT in DAGSchedulerSuite.
Run below integrated test with `local-cluster[5, 2, 5120]`, and set `spark.sql.execution.sortBeforeRepartition`=false, it will abort the indeterminate stage as expected:
```
import scala.sys.process._
import org.apache.spark.TaskContext
val res = spark.range(0, 10000 * 10000, 1).map{ x => (x % 1000, x)}
// kill an executor in the stage that performs repartition(239)
val df = res.repartition(113).map{ x => (x._1 + 1, x._2)}.repartition(239).map { x =>
if (TaskContext.get.attemptNumber == 0 && TaskContext.get.partitionId < 1 && TaskContext.get.stageAttemptNumber == 0) {
throw new Exception("pkill -f -n java".!!)
}
x
}
val r2 = df.distinct.count()
```
Closesapache#25498 from xuanyuanking/SPARK-28699-followup.
Authored-by: Yuanjian Li <xyliyuanjian@gmail.com>
Signed-off-by: Wenchen Fan <wenchen@databricks.com>
(cherry picked from commit 0d3a783)
Signed-off-by: Yuanjian Li <xyliyuanjian@gmail.com>dongjoon-hyun
commented
Aug 20, 2019
Thank you, @xuanyuanking , @cloud-fan and @viirya ! Also, cc @kiszk for |
What changes were proposed in this pull request?
When collecting the indeterminate stages for handling FetchFailed, we should look at stages from mapStage, instead of failedStage.
Why are the changes needed?
In the fetch failed error handle logic, the original logic of collecting indeterminate stage from the fetch failed stage. And in the scenario of the fetch failed happened in the first task of this stage, this logic will cause the indeterminate stage to resubmit partially. Eventually, we are capable of getting correctness bug.
Does this PR introduce any user-facing change?
It makes the corner case of indeterminate stage abort as expected.
How was this patch tested?
New UT in DAGSchedulerSuite.
Run below integrated test with
local-cluster[5, 2, 5120], and setspark.sql.execution.sortBeforeRepartition=false, it will abort the indeterminate stage as expected: