New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[HUDI-1138] Add timeline-server-based marker file strategy for improving marker-related latency #3233
Conversation
CI report:
Bot commands@hudi-bot supports the following commands:
|
42d1e64
to
de5c236
Compare
...udi-client-common/src/main/java/org/apache/hudi/client/embedded/EmbeddedTimelineService.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/marker/MarkerFiles.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
ab0bf2d
to
2d22335
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm still addressing the rest of the reviews.
...lient/hudi-flink-client/src/main/java/org/apache/hudi/table/HoodieFlinkCopyOnWriteTable.java
Outdated
Show resolved
Hide resolved
...udi-client-common/src/main/java/org/apache/hudi/client/embedded/EmbeddedTimelineService.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
...-common/src/main/java/org/apache/hudi/common/table/view/RemoteHoodieTableFileSystemView.java
Outdated
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/RequestHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
2d22335
to
09c910a
Compare
...udi-client-common/src/main/java/org/apache/hudi/client/embedded/EmbeddedTimelineService.java
Outdated
Show resolved
Hide resolved
...-client/hudi-client-common/src/main/java/org/apache/hudi/table/marker/DirectMarkerFiles.java
Outdated
Show resolved
Hide resolved
hudi-common/src/main/java/org/apache/hudi/common/table/view/HoodieTableFileSystemView.java
Outdated
Show resolved
Hide resolved
7d4d2b5
to
02f953f
Compare
Codecov Report
@@ Coverage Diff @@
## master #3233 +/- ##
=============================================
- Coverage 47.74% 27.53% -20.21%
+ Complexity 5591 1325 -4266
=============================================
Files 938 394 -544
Lines 41823 15659 -26164
Branches 4213 1384 -2829
=============================================
- Hits 19968 4312 -15656
+ Misses 20070 11023 -9047
+ Partials 1785 324 -1461
Flags with carried forward coverage won't be shown. Click here to find out more.
Continue to review full report at Codecov.
|
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
@@ -423,7 +424,8 @@ protected void preWrite(String instantTime, WriteOperationType writeOperationTyp | |||
protected void postCommit(HoodieTable<T, I, K, O> table, HoodieCommitMetadata metadata, String instantTime, Option<Map<String, String>> extraMetadata) { | |||
try { | |||
// Delete the marker directory for the instant. | |||
new MarkerFiles(table, instantTime).quietDeleteMarkerDir(context, config.getMarkersDeleteParallelism()); | |||
MarkerFilesFactory.get(config.getMarkersIOMode(), table, instantTime) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
something to remember.
We might have to add an upgrade step for migration from previous version to new one. I guess it is as simple as just cleaning up the old marker files and recreate marker in new format.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right. I think the upgrade/downgrade functionality can be added in a follow-up PR if we'd like to merge this soon. I'll work on that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do we really have to? as long as we can automatically "detect" the marker versions its fine right? Why migrate to this one (which involved one round of listing), just to do rollbacks?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a TODO in the follow-up PR: https://issues.apache.org/jira/projects/HUDI/issues/HUDI-2271
...udi-client-common/src/main/java/org/apache/hudi/client/embedded/EmbeddedTimelineService.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/marker/MarkerFiles.java
Outdated
Show resolved
Hide resolved
.../hudi-client-common/src/main/java/org/apache/hudi/table/marker/TimelineBasedMarkerFiles.java
Outdated
Show resolved
Hide resolved
...c/test/java/org/apache/hudi/table/action/rollback/TestCopyOnWriteRollbackActionExecutor.java
Outdated
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/TimelineService.java
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
High level comments. Main thing are the changes to TableFileSystemView, need to be avoided. Also we need to deduce the marker type dynamically.. i.e write a MARKERS.type
file also in marker_dir and use it for rollback purposes. Actual writing uses the write configs.
Doing second pass on actual implementaiton/algorithms
@@ -423,7 +424,8 @@ protected void preWrite(String instantTime, WriteOperationType writeOperationTyp | |||
protected void postCommit(HoodieTable<T, I, K, O> table, HoodieCommitMetadata metadata, String instantTime, Option<Map<String, String>> extraMetadata) { | |||
try { | |||
// Delete the marker directory for the instant. | |||
new MarkerFiles(table, instantTime).quietDeleteMarkerDir(context, config.getMarkersDeleteParallelism()); | |||
MarkerFilesFactory.get(config.getMarkersIOMode(), table, instantTime) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do we really have to? as long as we can automatically "detect" the marker versions its fine right? Why migrate to this one (which involved one round of listing), just to do rollbacks?
...lient-common/src/main/java/org/apache/hudi/client/embedded/EmbeddedTimelineServerHelper.java
Show resolved
Hide resolved
...udi-client-common/src/main/java/org/apache/hudi/client/embedded/EmbeddedTimelineService.java
Outdated
Show resolved
Hide resolved
...udi-client-common/src/main/java/org/apache/hudi/client/embedded/EmbeddedTimelineService.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
hudi-common/src/main/java/org/apache/hudi/common/table/view/TableFileSystemView.java
Outdated
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/RequestHandler.java
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/TimelineService.java
Outdated
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/TimelineService.java
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/TimelineService.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
...udi-client-common/src/main/java/org/apache/hudi/client/embedded/EmbeddedTimelineService.java
Outdated
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/RequestHandler.java
Outdated
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/TimelineService.java
Outdated
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/TimelineService.java
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/TimelineService.java
Show resolved
Hide resolved
hudi-timeline-service/src/main/java/org/apache/hudi/timeline/service/TimelineService.java
Outdated
Show resolved
Hide resolved
1323318
to
1d7f4a2
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Probably one round of refining and we can land
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
...client-common/src/main/java/org/apache/hudi/table/marker/TimelineServerBasedMarkerFiles.java
Outdated
Show resolved
Hide resolved
...client-common/src/main/java/org/apache/hudi/table/marker/TimelineServerBasedMarkerFiles.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
private final ScheduledExecutorService executorService; | ||
// A cached copy of all markers in memory | ||
// Mapping: {markerDirPath -> all markers} | ||
private final Map<String, Set<String>> allMarkersMap = new HashMap<>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So we can handle multiple concurrent writers even? Which may all be writing to their own marker directory?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, that's the intention behind this map. Each writer should write to an independent marker directory and the markers are maintained based on the marker directory containing the instant time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The multiple concurrent writers haven't been tested against the timeline-server-based markers, though it is designed to consider such case. I created a TODO to verify this later on: https://issues.apache.org/jira/projects/HUDI/issues/HUDI-2271
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
createMarkerFutures.removeAll(futuresToRemove); | ||
} | ||
LOG.info("Flush to MARKERS file .. "); | ||
flushMarkersToFile(updatedMarkerDirPaths, markerFileIndex); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we fail here, how do we notify the futures of the failure?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The futures time out in 30 seconds for now. We can optimize this later on.
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
cc99aa7
to
e519f64
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm working on adding the MARKERS.type and the switching logic between different types of markers, and addressing other style issues.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I feel the logic in MarkerDirState and associated code can be simplified.
I see we are having 4 synchronized blocks w/ 4 diff vars. It makes the code more complex and hard to maintain in the long run.
Let's sync up sometime today or tomorrow. We can see how to simplify it.
Some of the code blocks don't need a sync block as such. For some, we reorder some operations to see if we can club some sync blocks together.
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/config/HoodieWriteConfig.java
Outdated
Show resolved
Hide resolved
...-client/hudi-client-common/src/main/java/org/apache/hudi/table/marker/DirectMarkerFiles.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-flink-client/src/main/java/org/apache/hudi/client/HoodieFlinkWriteClient.java
Outdated
Show resolved
Hide resolved
...t/hudi-spark-client/src/main/java/org/apache/hudi/table/upgrade/ZeroToOneUpgradeHandler.java
Outdated
Show resolved
Hide resolved
hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/table/marker/TestMarkerFiles.java
Outdated
Show resolved
Hide resolved
...e-service/src/main/java/org/apache/hudi/timeline/service/handlers/marker/MarkerDirState.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...e-service/src/main/java/org/apache/hudi/timeline/service/handlers/marker/MarkerDirState.java
Outdated
Show resolved
Hide resolved
...e-service/src/main/java/org/apache/hudi/timeline/service/handlers/marker/MarkerDirState.java
Show resolved
Hide resolved
...e-service/src/main/java/org/apache/hudi/timeline/service/handlers/marker/MarkerDirState.java
Outdated
Show resolved
Hide resolved
...java/org/apache/hudi/timeline/service/handlers/marker/MarkerCreationDispatchingRunnable.java
Outdated
Show resolved
Hide resolved
…ionBatchingRunnable to MarkerCreationDispatchingRunnable
This reverts commit bdef8e64bdf1033b18dd2adea0dcb696976ab37e.
6273742
to
b7d7187
Compare
CI report:
Bot commands@hudi-bot supports the following commands:
|
CI report:
Bot commands@hudi-bot supports the following commands:
|
@hudi-bot run azure |
CI report:
Bot commands@hudi-bot supports the following commands:
|
@hudi-bot run azure |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Logic looks good to me overall. Added comments on naming, synchronization and more corner cases to think about
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...-timeline-service/src/main/java/org/apache/hudi/timeline/service/handlers/MarkerHandler.java
Outdated
Show resolved
Hide resolved
...n/java/org/apache/hudi/timeline/service/handlers/marker/MarkerCreationCompletableFuture.java
Outdated
Show resolved
Hide resolved
...java/org/apache/hudi/timeline/service/handlers/marker/MarkerCreationDispatchingRunnable.java
Outdated
Show resolved
Hide resolved
...in/java/org/apache/hudi/timeline/service/handlers/marker/MarkerCreationBatchingRunnable.java
Outdated
Show resolved
Hide resolved
...e-service/src/main/java/org/apache/hudi/timeline/service/handlers/marker/MarkerDirState.java
Show resolved
Hide resolved
...e-service/src/main/java/org/apache/hudi/timeline/service/handlers/marker/MarkerDirState.java
Outdated
Show resolved
Hide resolved
} catch (IOException ioe) { | ||
throw new HoodieIOException(ioe.getMessage(), ioe); | ||
} | ||
allMarkers.clear(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
any synchrnoization needed? for e.g if there were concurent adds, this will throw a ConcurrentModificationException. Just think through those scenarios?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Based on the write process, for the same marker directory, there should not be any other requests when the deletion is happening, so we don't put a synchronization block here.
...e-service/src/main/java/org/apache/hudi/timeline/service/handlers/marker/MarkerDirState.java
Show resolved
Hide resolved
try { | ||
fsDataOutputStream = fileSystem.create(markersFilePath); | ||
bufferedWriter = new BufferedWriter(new OutputStreamWriter(fsDataOutputStream, StandardCharsets.UTF_8)); | ||
bufferedWriter.write(fileMarkersMap.get(markerFileIndex).toString()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
reg whether this works on HDFS. I think this write can fail midway, right? then we would n't be able to recover this partial file read? (or all the marker creations will timeout, causing new requests to be made and this marker file will be overwritten?)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The failed overwrite on HDFS can be a problem. As discussed offline, we'll throw an exception for timeline-based markers on HDFS for now and fix the issue later.
Looks good. Awesome job on the patch! Great contribution :) |
…ing marker-related latency (apache#3233) - Can be enabled for cloud stores like S3. Not supported for hdfs yet, due to partial write failures.
What is the purpose of the pull request
This PR adds a new marker file strategy that optimizes the marker-related latency for file systems with non-trivial file I/O latency, such as Amazon S3. The existing marker file mechanism creates one marker file per data file written. When listing and deleting the marker files, S3 throttles the I/O operations if the number of marker files is huge and it can take 10 minutes for listing alone. When write concurrency is high, the marker creation can also be throttled by S3. Such behavior degrades the performance of the write. The new timeline-server-based marker file strategy delegates the marker creation and other marker-related operations from individual executors to the timeline server. The timeline server maintains the markers and consistency by periodically flushing the in-memory markers to a limited number of underlying files in the file system. In such a way, the number of actual file operations and latency related to markers can be reduced, thus improving the performance of the writes.
To improve the efficiency of processing marker creation requests, we design the batch processing in the handler of marker requests at the timeline server. Each marker creation request is handled asynchronously in the Javalin timeline server and queued before processing. For every batch interval, e.g., 20ms, a dispatching thread pulls the pending requests from the queue and sends them to the worker thread for processing. Each worker thread processes the marker creation requests, sets the responses, and flushes the new markers by overwriting the underlying file storing the markers in the file system. There can be multiple worker threads running concurrently, given that the file overwriting takes longer than the batch interval, and each worker thread writes to an exclusive file not touched by other threads, to guarantee consistency and correctness. Both the batch interval and the number of worker threads can be configured through the write options.
Note that the worker thread always checks whether the marker has already been created by comparing the marker name from the request with the memory copy of all markers maintained in the marker directory state class. The underlying files storing the markers are only read upon the first marker request (lazy loading). The responses of requests are only sent back once the new markers are flushed to the files, so that in the case of timeline server failure, the timeline server can recover the already created markers. These ensure consistency between the file system and the in-memory copy, and improve the performance of processing marker requests.
Since the new timeline-server-based marker mechanism is intended for cloud storage, it is not supported for HDFS at this point (an exception is thrown if timeline-server-based marker mechanism is configured for writes on HDFS).
Brief change log
HoodieWriteConfig
hoodie.write.markers.type
: marker type to use for the writes. Two modes are supported:direct
andtimeline_server_based
.hoodie.markers.timeline_server_based.batch.num_threads
: number of threads to use for batch processing marker creation requests at the timeline server for timeline-server-based marker strategyhoodie.markers.timeline_server_based.batch.interval_ms
: the batch interval in milliseconds for marker creation batch processing for timeline-server-based marker strategyWriteMarkers
class)MarkerType
, to indicate the marker type used for the current writeDirectWriteMarkers
, for the existing mechanism which directly creates a marker file per data file in the file system from each executorWriteMarkersFactory
, to generateWriteMarkers
instance based on the marker type. ThrowsHoodieException
iftimeline_server_based
is used for HDFS since the support for HDFS is not ready.WriteMarkersFactory
at all places where markers are needed (write handles, Java, Spark, Flink engines)TimelineServerBasedWriteMarkers
, for the timeline-server-based marker file strategy, which sends requests to the timeline server for all marker-related operationsMarkerOperation
MarkerDirState
class to store the state of a marker directory and operate on the markers inside the directoryMarkerCreationFuture
, to be able to process marker creation requests asynchronouslyMarkerHandler
, for marker-related requests, which schedules the dispatching thread at a fixed rate based on the batching interval upon the first marker creation requestMarkerCreationDispatchingRunnable
for scheduling periodic, batched processing of marker creation requestsBatchedMarkerCreationRunnable
for batch processing marker creation requestsBatchedMarkerCreationContext
, for passing the pending requests from the dispatching thread to the worker threadsEmbeddedTimelineService
,TimelineService
andRequestHandler
Follow-up TODOs are summarized in this ticket: https://issues.apache.org/jira/projects/HUDI/issues/HUDI-2271
Verify this pull request
This direct marker file strategy is covered by existing tests in
TestDirectWriteMarkers
. This change adds unit tests inTestTimelineServerBasedWriteMarkers
to verify the new timeline-server-based marker file strategy.We have also manually verified the change by running multiple Spark jobs on large datasets in the cluster with different file system settings:
WriteMarkersFactory
so the new timeline-server-based markers can be used on HDFS. By default, the job should throw an exception in this setup, which is also tested below. We plan to enhance the support of timeline-server-based markers for HDFS in follow-ups.)direct
: 19.6 mins (1175943 ms)timeline-server-based
: 19.7 mins (1179346 ms)direct
: 55 minstimeline-server-based
: 38 minsspark.speculation=true
spark.speculation.multiplier=1.0
spark.speculation.quantile=0.5
WARN scheduler.TaskSetManager: Lost task 1537.1 in stage 22.0 (TID 17375, executor 290): TaskKilled (another attempt succeeded)
Delete invalid files generated during the write operation
,collect at HoodieSparkEngineContext.java:73
21/08/06 19:39:01 INFO table.HoodieTable: Deleting invalid data files=[(/tmp/temp_marker_test_table/asia/india/chennai,/tmp/temp_marker_test_table/asia/india/chennai/5dcae584-1563-4f13-9ce4-955864a2b616-38_162-12-2694_20210806192244.parquet),...
val df2 = spark.read.parquet("/tmp/temp_marker_test_table/*/*/*/*.parquet")
df2.select("_hoodie_record_key").distinct.count
outputs the same count (400M) as the input dfHoodieException
, which is expected:Caused by: org.apache.hudi.exception.HoodieException: Timeline-server-based markers are not supported for HDFS: base path /tmp/temp_marker_test_table
More details regarding the Hadoop/Yarn cluster with HDFS testing:
Committer checklist
Has a corresponding JIRA in PR title & commit
Commit message is descriptive of the change
CI is green
Necessary doc changes done or have another open PR
For large changes, please consider breaking it into sub-tasks under an umbrella JIRA.