[GOBBLIN-1847] Exceptions in the JobLauncher should try to delete the existing workflow if it is launched#3711
Merged
ZihanLi58 merged 2 commits intoapache:masterfrom Jun 28, 2023
Conversation
homatthew
commented
Jun 27, 2023
| // then call still properly call cancel. We use the listener to confirm the cancel hook was correctly called once | ||
| JobListener mockListener = Mockito.mock(JobListener.class); | ||
| gobblinHelixJobLauncher.launchJob(mockListener); | ||
| Mockito.verify(mockListener).onJobCancellation(Mockito.any(JobContext.class)); |
Contributor
Author
There was a problem hiding this comment.
Fun fact: verify without a parameter verifies the method is called exactly once! 😃
6776637 to
77d5f0d
Compare
… existing workflow if it is launched
77d5f0d to
7c42987
Compare
ZihanLi58
requested changes
Jun 27, 2023
gobblin-cluster/src/main/java/org/apache/gobblin/cluster/GobblinHelixJobLauncher.java
Show resolved
Hide resolved
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #3711 +/- ##
============================================
- Coverage 46.87% 46.86% -0.01%
- Complexity 10771 10808 +37
============================================
Files 2138 2141 +3
Lines 84139 84433 +294
Branches 9357 9386 +29
============================================
+ Hits 39436 39569 +133
- Misses 41102 41264 +162
+ Partials 3601 3600 -1 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
phet
added a commit
to phet/gobblin
that referenced
this pull request
Aug 15, 2023
* upstream/master: Fix bug with total count watermark whitelist (apache#3724) [GOBBLIN-1858] Fix logs relating to multi-active lease arbiter (apache#3720) [GOBBLIN-1838] Introduce total count based completion watermark (apache#3701) Correct num of failures (apache#3722) [GOBBLIN- 1856] Add flow trigger handler leasing metrics (apache#3717) [GOBBLIN-1857] Add override flag to force generate a job execution id based on gobbl… (apache#3719) [GOBBLIN-1855] Metadata writer tests do not work in isolation after upgrading to Iceberg 1.2.0 (apache#3718) Remove unused ORC writer code (apache#3710) [GOBBLIN-1853] Reduce # of Hive calls during schema related updates (apache#3716) [GOBBLIN-1851] Unit tests for MysqlMultiActiveLeaseArbiter with Single Participant (apache#3715) [GOBBLIN-1848] Add tags to dagmanager metrics for extensibility (apache#3712) [GOBBLIN-1849] Add Flow Group & Name to Job Config for Job Scheduler (apache#3713) [GOBBLIN-1841] Move disabling of current live instances to the GobblinClusterManager startup (apache#3708) [GOBBLIN-1840] Helix Job scheduler should not try to replace running workflow if within configured time (apache#3704) [GOBBLIN-1847] Exceptions in the JobLauncher should try to delete the existing workflow if it is launched (apache#3711) [GOBBLIN-1842] Add timers to GobblinMCEWriter (apache#3703) [GOBBLIN-1844] Ignore workflows marked for deletion when calculating container count (apache#3709) [GOBBLIN-1846] Validate Multi-active Scheduler with Logs (apache#3707) [GOBBLIN-1845] Changes parallelstream to stream in DatasetsFinderFilteringDecorator to avoid classloader issues in spark (apache#3706) [GOBBLIN-1843] Utility for detecting non optional unions should convert dataset urn to hive compatible format (apache#3705) [GOBBLIN-1837] Implement multi-active, non blocking for leader host (apache#3700) [GOBBLIN-1835]Upgrade Iceberg Version from 0.11.1 to 1.2.0 (apache#3697) Update CHANGELOG to reflect changes in 0.17.0 Reserving 0.18.0 version for next release [GOBBLIN-1836] Ensuring Task Reliability: Handling Job Cancellation and Graceful Exits for Error-Free Completion (apache#3699) [GOBBLIN-1805] Check watermark for the most recent hour for quiet topics (apache#3698) [GOBBLIN-1825]Hive retention job should fail if deleting underlying files fail (apache#3687) [GOBBLIN-1823] Improving Container Calculation and Allocation Methodology (apache#3692) [GOBBLIN-1830] Improving Container Transition Tracking in Streaming Data Ingestion (apache#3693) [GOBBLIN-1833]Emit Completeness watermark information in snapshotCommitEvent (apache#3696)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Dear Gobblin maintainers,
Please accept this PR. I understand that it will not be reviewed until I have checked off all the steps below!
JIRA
Description
If the JobLauncher encounters any errors, Gobblin code cleans up the working directory that contains Gobblin state. But we do not clean up the helix workflows. This can cause us to spin up helix workflows that do not have valid Gobblin State on HDFS / S3.
When this occurs, it causes rapid container recycling, which puts tremendous load on Zookeeper due to Helix API calls, causing a peak in ZK callbacks
The cancellation logic is obnoxious, so here is the high level of what happens.
AbstractJobLauncher#cancelJob(JobListener)setsAbstractJobLauncher#cancellationRequestedtotrueAbstractJobLauncher#cancellationExecutorcreated by theAbstractJobLauncher#startCancellationExecutor()method to call the abstract methodAbstractJobLauncher#executeCancellation()GobblinHelixJobLauncher#executeCancellation(), which eventually callsHelixUtils.cancelWorkflow(...)Considerations
I considered modifying the
runWorkunitsitself since that is where the cleanup directory is called. But I wanted to leverage the existing the cancellation request logic (which is admittedly super overkill and has a ton of concurrency). We also collect a ton of metrics during the cancellation process, so it's important that I call the cancel method that is part of theAbstractJobLauncher. Since we need access to the job listener, it makes most sense to have it be part of thelaunchJobmethodThe reason I clean up even when there is a successful finish, is because there isn't really a reason not to cancel a workflow to run after the job is finished for Fast Ingest. The cancel call is safe to call multiple times and there are clearly still edge cases where we don't call cancel properly
I am not a fan of adding a new flag, but I want to maintain backward compatibility since this job launcher is used beyond Fast Ingest
Testing
Commits