Skip to content

Conversation

@v3nkatesh
Copy link
Contributor

@v3nkatesh v3nkatesh commented Apr 3, 2020

Tips

What is the purpose of the pull request

This pull request optimizes hbase index write operations.

Brief change log

  • Replaces Thread.sleep() with RateLimiter to reduce wait time during hbase puts operation
  • Repartitions WriteStatus with new records to improve parallelism of hbase index operations

Verify this pull request

This change added tests and can be verified as follows:

  • Added tests to TestHbaseIndex to verify the repartition optimization
  • Also verified the change by running a ob end to end

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.

@n3nash n3nash requested review from bvaradar and vinothchandar April 3, 2020 21:06
@n3nash n3nash changed the title Hbase qps repartition writestatus [HUDI-316] : Hbase qps repartition writestatus Apr 3, 2020
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we please avoid using this? Should not be too hard to roll our own..

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vinothchandar Re implemented for most part and stripped unnecessary methods of RateLimiter. And removed Ticker class as well (that was from Google/Guava).

@n3nash
Copy link
Contributor

n3nash commented Apr 13, 2020

@satishkotha can you please help review this ?

Copy link
Member

@satishkotha satishkotha left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@v3nkatesh Added some questions/comments. Please take a look.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you need this map as instance variable? Looks like there is one HBaseIndex object per client. We don't seem to be clearing entries from this map also. So, over time, this map can get pretty large and can cause increased memory utilization? Please correct me if I'm misreading.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah we don't need a class variable for this. Moved it inside updateLocation() method.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dont see how this is used. could you please add a comment for all these instance variables? It seems like they can be local variables specific to the operation being performed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah can be removed actually, I am anyway recalculating this inside getBatchSize(). Also cleaned up other variables that are not used.

Comment on lines 387 to 388
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you help me understand this code? why do we need to force trigger here? Is this just to releaseQPSResources? releaseQPSResources seems to be doing nothing (at least default implementation, are there other implementations outside hoodie?). Is it really important to release here as opposed to doing it in 'close()' (earlier behavior)?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct, releaseQPSResources() has implementation outside of hoodie. This ensures that we release any resources acquired for HBase operations are released right after the spark stage is done (i.e. because of forced spark action)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not directly related to your change, so feel free to ignore this comment. But hBaseIndexQPSResourceAllocator is instance variable. why is this again passed as argument. This seems like a consistent pattern in this class. Because we are also using exact same name for local variable, it masks instance variable and can become easily error prone if the two variables evolve to mean different things.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I think it makes sense to refactor it here. Let me update other parts of this class where hBaseIndexQPSResourceAllocator is passed around.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share the context on why we created HBaseIndexQPSResourceAllocator? Do you think calls to RateLimiter#acquire can be made inside HBaseIndexQPSResourceAllocator#acquireQPSResources to simplify?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Synced offline to go over use-case outside of hoodie and why we need to rate limit here.
Just to summarize, we need to rate limit here because the actual hbase operations are handled here. And HBaseIndexQPSResourceAllocator#acquireQPSResources is mostly meant to manage metadata like checking for available resources before an operation, releasing meta resources etc.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please make this a static class if its not using any instance variables of outer class

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: looks like this is logged in the above method call too. so i think this can be removed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done.

Comment on lines 370 to 379
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider redoing this logic, because if this.numWriteStatusWithInserts == 0 , we still go through the process of generating fileIdPartitionMap which is not ideal.

Also, curious, if you did any performance measurements before and after this change. It is worth highlighting in release notes if this improvement is significant

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When this.numWriteStatusWithInserts == 0, fileIds will be empty. So fileIdPartitionMap will also be empty in this case.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: can we also move hTable.get(keys) inside this if? do we need to invoke hTable.get if keys is empty?

Copy link
Contributor Author

@v3nkatesh v3nkatesh May 1, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Invoking hTable.get on empty keys is returning an empty Result array. But anyway, I changed it to explicitly return empty array now.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lot of code in this test seems like repetition from source code. consider refactoring this part into a library to reuse in tests if needed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, I have moved this logic inside HBaseIndex to a separate method instead of a different class, let me know. Using this util method from tests.

Comment on lines 358 to 360
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

another question, what is the typical latency of these mutate operations? If time taken here combined with time taken to collect 'multiPutBatchSize' is > 1 second, then it seems like limiter would generate enough tokens for next run and would not wait at all.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because of the synchronous nature, we will not acquire more permits until the operation is done even if it takes more than a second.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

example to help clarify what i meant:

lets say, mutator.mutate() + flush +clear takes 2 seconds as minimum. limiter.acquire would never wait because it generates mutations.size() tokens every second. So we would never wait. looks like this is expected and we dont see it as a problem. So I'm fine with it. (if possible, having metrics on per operation wait time would help us debug any potential issues)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we synced offline for this, but let me try to summarize.
Token will be acquired only after previous batch is done, so it won't flood the system or over-utilize the cluster as planned. Though the side effect is hbase operation running slower than intended. Yes metrics on operation will be useful, will create follow up ticket.

@n3nash
Copy link
Contributor

n3nash commented Apr 21, 2020

@v3nkatesh any updates on this ?

Comment on lines 96 to 97
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these two also seem like related to the operation being performed and not really need to be instance variables. If we can find a way to move them to local variables, that would make it cleaner.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@v3nkatesh can you address or respond to this comment ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These 2 are actually used at multiple places inside the class, so did not refactor. It's possible to move them inside methods, but it will mean re-calculating.

@satishkotha
Copy link
Member

@n3nash @v3nkatesh added few more comments. these are in nice-to-have bucket. Since this is already running in production for quiet some time, you can merge given there is time pressure. I can also make additional changes in a later PR if needed.

Copy link
Contributor

@n3nash n3nash left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@v3nkatesh There are a couple of pending comments from @satishkotha. If you can finish up with those we can merge this PR with the condition that we need to add to LICENSE file because of the copied code in ratelimiter here -> https://github.com/apache/incubator-hudi/blob/master/LICENSE

@v3nkatesh
Copy link
Contributor Author

@v3nkatesh There are a couple of pending comments from @satishkotha. If you can finish up with those we can merge this PR with the condition that we need to add to LICENSE file because of the copied code in ratelimiter here -> https://github.com/apache/incubator-hudi/blob/master/LICENSE

@n3nash I have replied to the remaining comments. For RateLimiter class, can you check if the new refactoring is good enough to skip the LICENSE part ?

@n3nash
Copy link
Contributor

n3nash commented May 17, 2020

@v3nkatesh The rate limiter looks good to me but it's still inspired from guava. I'll let @vinothchandar comment since he felt strongly about implementing our own.

@vinothchandar
Copy link
Member

vinothchandar commented May 20, 2020

@v3nkatesh allow me to give some context around why we are strict around guava.. Hudi as you know has to be dropped under many different services (hive/spark/presto,...) and guava as universal it is, presents a jar conflict nightmare...

On the re-using code itself, i know we have done this in few places in the past. but, this often leads to maintenance issues more often than not... we change the re-used code, people fix the original code.. and overtime we don't invest in getting upstream bug fixes etc.. So for small stuff like this, I prefer that we write it ourselves..

Is this the original code ? I would say if we are trimming down that file and using some parts verbatim, we are still reusing code.. (which I think is what we are doing)

The act of adding new things to LICENSE/NOTICE is not that straightforward, given we don't have an entry for guava yet.. We need to examine, guava's NOTICE, its dependencies etc.. I thought, even for you, just writing a small class and being done would be a better use of time?

Copy link
Member

@vinothchandar vinothchandar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In any case, we need unit tests for the RateLimiter class..
Few alternatives ..
You can maintain the index outside Hudi (index classes are pluggable)
I can write the rate limiter for you and check it in..

let's hash this out together :)

@v3nkatesh
Copy link
Contributor Author

In any case, we need unit tests for the RateLimiter class..
Few alternatives ..
You can maintain the index outside Hudi (index classes are pluggable)
I can write the rate limiter for you and check it in..

let's hash this out together :)

Thanks @vinothchandar. Reg. restrictions around guava makes sense. Would be great if you can check in a Rate limiter equivalent. Let me know if you don't have time for that in the near future.

@v3nkatesh
Copy link
Contributor Author

Hi @vinothchandar Let me know if you will have time for the RateLimiter class. If not I will explore other options, pls let know.

@vinothchandar
Copy link
Member

@v3nkatesh are you able to write the rate limiter class yourself? :) if not can @garyli1019 @xushiyan help?

@v3nkatesh v3nkatesh force-pushed the hbase-qps-repartition-writestatus branch from a1f5407 to 5cc01a1 Compare September 4, 2020 07:55
@v3nkatesh
Copy link
Contributor Author

@v3nkatesh are you able to write the rate limiter class yourself? :) if not can @garyli1019 @xushiyan help?

@vinothchandar Pushed a custom RateLimiter, pls take a look.

@vinothchandar vinothchandar self-assigned this Sep 9, 2020
@vinothchandar
Copy link
Member

will do. thanks ! @n3nash can take a pass as well

@n3nash
Copy link
Contributor

n3nash commented Sep 10, 2020

Yes, I will do by Friday.

@vinothchandar
Copy link
Member

@n3nash I tried to rebase this and noticed that the custom ratelimiter is still a reuse from Guava. Are we still pursuing this PR?

@v3nkatesh
Copy link
Contributor Author

@n3nash I tried to rebase this and noticed that the custom ratelimiter is still a reuse from Guava. Are we still pursuing this PR?

Sry for the delay folks, I just came back from my break. @vinothchandar latest RateLimiter clss is not based on Guava. Let me know

@v3nkatesh v3nkatesh force-pushed the hbase-qps-repartition-writestatus branch from 5cc01a1 to 6b62b8a Compare October 29, 2020 07:48
@n3nash
Copy link
Contributor

n3nash commented Oct 29, 2020

@v3nkatesh the build is failing, can you please fix it and then I can merge the PR

@v3nkatesh v3nkatesh force-pushed the hbase-qps-repartition-writestatus branch from 6b62b8a to 1bdf773 Compare October 29, 2020 18:37
@codecov-io
Copy link

codecov-io commented Oct 29, 2020

Codecov Report

Merging #1484 into master will increase coverage by 0.05%.
The diff coverage is 86.66%.

Impacted file tree graph

@@             Coverage Diff              @@
##             master    #1484      +/-   ##
============================================
+ Coverage     53.68%   53.74%   +0.05%     
- Complexity     2849     2858       +9     
============================================
  Files           359      360       +1     
  Lines         16565    16595      +30     
  Branches       1782     1782              
============================================
+ Hits           8893     8919      +26     
- Misses         6915     6919       +4     
  Partials        757      757              
Flag Coverage Δ Complexity Δ
#hudicli 38.37% <ø> (ø) 193.00 <ø> (ø)
#hudiclient 100.00% <ø> (ø) 0.00 <ø> (ø)
#hudicommon 54.81% <86.66%> (+0.11%) 1803.00 <9.00> (+9.00)
#hudihadoopmr 33.05% <ø> (ø) 181.00 <ø> (ø)
#hudispark 65.95% <ø> (ø) 304.00 <ø> (ø)
#huditimelineservice 62.29% <ø> (ø) 50.00 <ø> (ø)
#hudiutilities 70.09% <ø> (ø) 327.00 <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ Complexity Δ
.../java/org/apache/hudi/common/util/RateLimiter.java 86.66% <86.66%> (ø) 9.00 <9.00> (?)

@n3nash n3nash self-requested a review November 2, 2020 16:32
Copy link
Contributor

@n3nash n3nash left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@n3nash n3nash merged commit 59f995a into apache:master Nov 2, 2020
prashantwason pushed a commit to prashantwason/incubator-hudi that referenced this pull request Feb 22, 2021
prashantwason pushed a commit to prashantwason/incubator-hudi that referenced this pull request Feb 22, 2021
…pache#2185)

Summary:
[MINOR] Make sure factory method is used to instanciate DFSPathSelector (apache#2187)

* Move createSourceSelector into DFSPathSelector factory method
* Replace constructor call with factory method
* Added some javadoc

[HUDI-1330] handle prefix filtering at directory level (apache#2157)

The current DFSPathSelector only ignore prefix(_, .) at the file level while files under subdirectories
e.g. (.checkpoint/*) are still considered which result in bad-format exception during reading.

[HUDI-1200] fixed NPE in CustomKeyGenerator (apache#2093)

- config field is no longer transient in key generator
- verified that the key generator object is shipped from the driver to executors, just the one time and reused for each record

[HUDI-1209] Properties File must be optional when running deltastreamer (apache#2085)

[MINOR] Fix caller to SparkBulkInsertCommitActionExecutor (apache#2195)

Fixed calling the wrong constructor

[HUDI-1326] Added an API to force publish metrics and flush them. (apache#2152)

* [HUDI-1326] Added an API to force publish metrics and flush them.

Using the added API, publish metrics after each level of the DAG completed in hudi-test-suite.

* Code cleanups

Co-authored-by: Vinoth Chandar <[email protected]>

[HUDI-1118] Cleanup rollback files residing in .hoodie folder (apache#2205)

[MINOR] Private the NoArgsConstructor of SparkMergeHelper and code clean (apache#2194)

1. Fix merge on read DAG to make docker demo pass (apache#2092)

1. Fix merge on read DAG to make docker demo pass (apache#2092)
2. Fix repeat_count, rollback node

[HUDI-1274] Make hive synchronization supports hourly partition (apache#2122)

[HUDI-1351] Improvements to the hudi test suite for scalability and repeated testing. (apache#2197)

1. Added the --clean-input and --clean-output parameters to clean the input and output directories before starting the job
2. Added the --delete-old-input parameter to deleted older batches for data already ingested. This helps keep number of redundant files low.
3. Added the --input-parallelism parameter to restrict the parallelism when generating input data. This helps keeping the number of generated input files low.
4. Added an option start_offset to Dag Nodes. Without ability to specify start offsets, data is generated into existing partitions. With start offset, DAG can control on which partition, the data is to be written.
5. Fixed generation of records for correct number of partitions
  - In the existing implementation, the partition is chosen as a random long. This does not guarantee exact number of requested partitions to be created.
6. Changed variable blacklistedFields to be a Set as that is faster than List for membership checks.
7. Fixed integer division for Math.ceil. If two integers are divided, the result is not double unless one of the integer is casted to double.

[HUDI-1338] Adding Delete support to test suite framework (apache#2172)

- Adding Delete support to test suite.
         Added DeleteNode
         Added support to generate delete records

Use RateLimiter instead of sleep. Repartition WriteStatus to optimize Hbase index writes (apache#1484)

[HUDI-912] Refactor and relocate KeyGenerator to support more engines (apache#2200)

* [HUDI-912] Refactor and relocate KeyGenerator to support more engines

* Rename KeyGenerators

[HUDI-892] RealtimeParquetInputFormat skip adding projection columns if there are no log files (apache#2190)

* [HUDI-892] RealtimeParquetInputFormat skip adding projection columns if there are no log files
* [HUDI-892]  for test
* [HUDI-892]  fix bug generate array from split
* [HUDI-892] revert test log

[HUDI-1352] Add FileSystemView APIs to query pending clustering operations (apache#2202)

[HUDI-1375] Fix bug in HoodieAvroUtils.removeMetadataFields() method (apache#2232)

Co-authored-by: Wenning Ding <[email protected]>

[HUDI-1358] Fix Memory Leak in HoodieLogFormatWriter (apache#2217)

[HUDI-1377] remove duplicate code (apache#2235)

[HUDI-1327] Introduce base implemetation of hudi-flink-client (apache#2176)

[HUDI-1400] Replace Operation enum with WriteOperationType (apache#2259)

[HUDI-1384] Decoupling hive jdbc dependency when HIVE_USE_JDBC_OPT_KEY set false (apache#2241)

[MINOR] clean up and add comments to flink client (apache#2261)

[MINOR] Add apacheflink label (apache#2268)

[HUDI-1393] Add compaction action in archive command (apache#2246)

[HUDI-1364] Add HoodieJavaEngineContext to hudi-java-client (apache#2222)

[HUDI-1396] Fix for preventing bootstrap datasource jobs from hanging via spark-submit (apache#2253)

Co-authored-by: Wenning Ding <[email protected]>

[HUDI-1358] Fix leaks in DiskBasedMap and LazyFileIterable (apache#2249)

[HUDI-1392] lose partition info when using spark parameter basePath (apache#2243)

Co-authored-by: zhang wen <[email protected]>

[MINOR] refactor code in HoodieMergeHandle (apache#2272)

[HUDI-1424]  Write Type changed to BULK_INSERT when set ENABLE_ROW_WRITER_OPT_KEY=true (apache#2289)

[HUDI-1373] Add Support for OpenJ9 JVM (apache#2231)

* add supoort for OpenJ9 VM
* add 32bit openJ9
* Pulled the memory layout specs into their own classes.

[HUDI-1357] Added a check to validate records are not lost during merges. (apache#2216)

- Turned off by default

[HUDI-1196] Update HoodieKey when deduplicating records with global index (apache#2248)

- Works only for overwrite payload (default)
- Does not alter current semantics otherwise

Co-authored-by: Ryan Pifer <[email protected]>

[HUDI-1349] spark sql support overwrite use insert_overwrite_table (apache#2196)

[HUDI-1343] Add standard schema postprocessor which would rewrite the schema using spark-avro conversion (apache#2192)

Co-authored-by: liujh <[email protected]>

[HUDI-1427] Fix FileAlreadyExistsException when set HOODIE_AUTO_COMMIT_PROP to true (apache#2295)

[HUDI-1412] Make HoodieWriteConfig support setting different default … (apache#2278)

* [HUDI-1412] Make HoodieWriteConfig support setting different default value according to engine type

fix typo (apache#2308)

Co-authored-by: Xi Chen <[email protected]>

[HUDI-1040] Make Hudi support Spark 3 (apache#2208)

* Fix flaky MOR unit test

* Update Spark APIs to make it be compatible with both spark2 & spark3

* Refactor bulk insert v2 part to make Hudi be able to compile with Spark3

* Add spark3 profile to handle fasterxml & spark version

* Create hudi-spark-common module & refactor hudi-spark related modules

Co-authored-by: Wenning Ding <[email protected]>

[MINOR] Throw an exception when keyGenerator initialization failed (apache#2307)

[HUDI-1395] Fix partition path using FSUtils (apache#2312)

Fixed the logic to get partition path in Copier and Exporter utilities.

[HUDI-1445] Refactor AbstractHoodieLogRecordScanner to use Builder (apache#2313)

[MINOR] Minor improve in IncrementalRelation (apache#2314)

[HUDI-1439] Remove scala dependency from hudi-client-common (apache#2306)

[HUDI-1428] Clean old fileslice is invalid (apache#2292)

Co-authored-by: zhang wen <[email protected]>
Co-authored-by: zhang wen <[email protected]>

[HUDI-1448]  Hudi dla sync support skip rt table syncing (apache#2324)

[HUDI-1435] Fix bug in Marker File Reconciliation for Non-Partitioned datasets (apache#2301)

[MINOR] Improve code readability by passing in the fileComparisonsRDD in bloom index (apache#2319)

[HUDI-1376] Drop Hudi metadata cols at the beginning of Spark datasource writing (apache#2233)

Co-authored-by: Wenning Ding <[email protected]>

[MINOR] Fix error information in exception (apache#2341)

[MINOR] Make QuickstartUtil generate random timestamp instead of 0 (apache#2340)

[HUDI-1406] Add date partition based source input selector for Delta streamer (apache#2264)

- Adds ability to list only recent date based partitions from source data.
- Parallelizes listing for faster tailing of DFSSources

[HUDI-1437]  support more accurate spark JobGroup for better performance tracking (apache#2322)

[HUDI-1470] Use the latest writer schema, when reading from existing parquet files in the hudi-test-suite (apache#2344)

[HUDI-115] Adding DefaultHoodieRecordPayload to honor ordering with combineAndGetUpdateValue (apache#2311)

* Added ability to pass in `properties` to payload methods, so they can perform table/record specific merges
* Added default methods so existing payload classes are backwards compatible.
* Adding DefaultHoodiePayload to honor ordering while merging two records
* Fixing default payload based on feedback

[HUDI-1419] Add base implementation for hudi java client (apache#2286)

[MINOR] Pass root exception to HoodieKeyGeneratorException for more information (apache#2354)

Co-authored-by: Xi Chen <[email protected]>

[HUDI-1075] Implement simple clustering strategies to create ClusteringPlan and to run the plan

[HUDI-1471] Make QuickStartUtils generate deletes according to specific ts (apache#2357)

[HUDI-1485] Fix Deletes issued without any prior commits exception (apache#2361)

[HUDI-1488] Fix Test Case Failure in TestHBaseIndex (apache#2365)

[HUDI-1489] Fix null pointer exception when reading updated written bootstrap table (apache#2370)

Co-authored-by: Wenning Ding <[email protected]>

[HUDI-1451] Support bulk insert v2 with Spark 3.0.0 (apache#2328)

Co-authored-by: Wenning Ding <[email protected]>

- Added support for bulk insert v2 with datasource v2 api in Spark 3.0.0.

[HUDI-1487] fix unit test testCopyOnWriteStorage random failed (apache#2364)

[HUDI-1490] Incremental Query should work even when there are  partitions that have no incremental changes (apache#2371)

* Incremental Query should work even when there are  partitions that have no incremental changes

Co-authored-by: Sivabalan Narayanan <[email protected]>

[HUDI-1331] Adding support for validating entire dataset and long running tests in test suite framework (apache#2168)

* trigger rebuild

* [HUDI-1156] Remove unused dependencies from HoodieDeltaStreamerWrapper Class (apache#1927)

* Adding support for validating records and long running tests in test sutie framework

* Adding partial validate node

* Fixing spark session initiation in Validate nodes

* Fixing validation

* Adding hive table validation to ValidateDatasetNode

* Rebasing with latest commits from master

* Addressing feedback

* Addressing comments

Co-authored-by: lamber-ken <[email protected]>
Co-authored-by: linshan-ma <[email protected]>

[HUDI-1481]  add  structured streaming and delta streamer clustering unit test (apache#2360)

[HUDI-1354] Block updates and replace on file groups in clustering (apache#2275)

* [HUDI-1354] Block updates and replace on file groups in clustering

* [HUDI-1354]  Block updates and replace on file groups in clustering

[HUDI-1350] Support Partition level delete API in HUDI (apache#2254)

* [HUDI-1350] Support Partition level delete API in HUDI

* [HUDI-1350] Support Partition level delete API in HUDI base InsertOverwriteCommitAction

* [HUDI-1350] Support Partition level delete API in HUDI base InsertOverwriteCommitAction

[HUDI-1495] Upgrade Flink version to 1.12.0 (apache#2384)

[MINOR] Remove the duplicate code in AbstractHoodieWriteClient.startCommit (apache#2385)

[HUDI-1398] Align insert file size for reducing IO (apache#2256)

* [HUDI-1398] Align insert file size for reducing IO

Co-authored-by: zhang wen <[email protected]>

[HUDI-1484] Escape the partition value in HiveSyncTool (apache#2363)

[HUDI-1474] Add additional unit tests to TestHBaseIndex (apache#2349)

[HUDI-1147] Modify GenericRecordFullPayloadGenerator to generate vali… (apache#2045)

* [HUDI-1147] Modify GenericRecordFullPayloadGenerator to generate valid timestamps

Co-authored-by: Sivabalan Narayanan <[email protected]>

[HUDI-1493] Fixed schema compatibility check for fields. (apache#2350)

Some field types changes are allowed (e.g. int -> long) while maintaining schema backward compatibility within HUDI. The check was reversed with the reader schema being passed for the write schema.

[MINOR] Update report_coverage.sh (apache#2396)

[HUDI-1434] fix incorrect log file path in HoodieWriteStat (apache#2300)

* [HUDI-1434] fix incorrect log file path in HoodieWriteStat

* HoodieWriteHandle#close() returns a list of WriteStatus objs

* Handle rolled-over log files and return a WriteStatus per log file written

 - Combined data and delete block logging into a single call
 - Lazily initialize and manage write status based on returned AppendResult
 - Use FSUtils.getFileSize() to set final file size, consistent with other handles
 - Added tests around returned values in AppendResult
 - Added validation of the file sizes returned in write stat

Co-authored-by: Vinoth Chandar <[email protected]>

[HUDI-1418] Set up flink client unit test infra (apache#2281)

[MINOR] Sync UpsertPartitioner modify of HUDI-1398 to flink/java (apache#2390)

Co-authored-by: zhang wen <[email protected]>

[HUDI-1423] Support delete in hudi-java-client (apache#2353)

[MINOR] Add maven profile to support skipping shade sources jars (apache#2358)

Co-authored-by: Xi Chen <[email protected]>

[HUDI-842] Implementation of HUDI RFC-15.

 - Introduced an internal metadata table, that stores file listings.
 - metadata table is kept upto date with
 - Fixed handling of CleanerPlan.
 - [HUDI-842] Reduce parallelism to speed up the test.
 - [HUDI-842] Implementation of CLI commands for metadata operations and lookups.
 - [HUDI-842] Extend rollback metadata to include the files which have been appended to.
 - [HUDI-842] Support for rollbacks in MOR Table.
 - MarkerBasedRollbackStrategy needs to correctly provide the list of files for which rollback blocks were appended.
 - [HUDI-842] Added unit test for rollback of partial commits (inflight but not completed yet).
 - [HUDI-842] Handled the error case where metadata update succeeds but dataset commit fails.
 - [HUDI-842] Schema evolution strategy for Metadata Table. Each type of metadata saved (FilesystemMetadata, ColumnIndexMetadata, etc.) will be a separate field with default null. The type of the record will identify the valid field. This way, we can grow the schema when new type of information is saved within in which still keeping it backward compatible.
 - [HUDI-842] Fix non-partitioned case and speedup initial creation of metadata table.Choose only 1 partition for jsc as the number of records is low (hundreds to thousands). There is more overhead of creating large number of partitions for JavaRDD and it slows down operations like WorkloadProfile.
For the non-partitioned case, use "." as the name of the partition to prevent empty keys in HFile.
 - [HUDI-842] Reworked metrics pusblishing.
 - Code has been split into reader and writer side. HoodieMetadata code to be accessed by using HoodieTable.metadata() to get instance of metdata for the table.
Code is serializable to allow executors to use the functionality.
 - [RFC-15] Add metrics to track the time for each file system call.
 - [RFC-15] Added a distributed metrics registry for spark which can be used to collect metrics from executors. This helps create a stats dashboard which shows the metadata table improvements in real-time for production tables.
 - [HUDI-1321] Created HoodieMetadataConfig to specify configuration for the metadata table. This is safer than full-fledged properties for the metadata table (like HoodieWriteConfig) as it makes burdensome to tune the metadata. With limited configuration, we can control the performance of the metadata table closely.

[HUDI-1319][RFC-15] Adding interfaces for HoodieMetadata, HoodieMetadataWriter (apache#2266)
 - moved MetadataReader to HoodieBackedTableMetadata, under the HoodieTableMetadata interface
 - moved MetadataWriter to HoodieBackedTableMetadataWriter, under the HoodieTableMetadataWriter
 - Pulled all the metrics into HoodieMetadataMetrics
 - Writer now wraps the metadata, instead of extending it
 - New enum for MetadataPartitionType
 - Streamlined code flow inside HoodieBackedTableMetadataWriter w.r.t initializing metadata state
 - [HUDI-1319] Make async operations work with metadata table (apache#2332)
 - Changes the syncing model to only move over completed instants on data timeline
 - Syncing happens postCommit and on writeClient initialization
 - Latest delta commit on the metadata table is sufficient as the watermark for data timeline archival
 - Cleaning/Compaction use a suffix to the last instant written to metadata table, such that we keep the 1-1
 - .. mapping between data and metadata timelines.
 - Got rid of a lot of the complexity around checking for valid commits during open of base/log files
 - Tests now use local FS, to simulate more failure scenarios
 - Some failure scenarios exposed HUDI-1434, which is needed for MOR to work correctly

co-authored by: Vinoth Chandar <[email protected]>

[HUDI-1450] Use metadata table for listing in HoodieROTablePathFilter (apache#2326)

[HUDI-1394] [RFC-15] Use metadata table (if present) to get all partition paths (apache#2351)

[HUDI-1469] Faster initialization of metadata table using parallelized listing. (apache#2343)

 * [HUDI-1469] Faster initialization of metadata table using parallelized listing which finds partitions and files in a single scan.
 * MINOR fixes

Co-authored-by: Vinoth Chandar <[email protected]>

[HUDI-1325] [RFC-15] Merge updates of unsynced instants to metadata table (apache#2342)

[RFC-15] Fix partition key in metadata table when bootstrapping from file system (apache#2387)

Co-authored-by: Ryan Pifer <[email protected]>

[HUDI-1312] [RFC-15] Support for metadata listing for snapshot queries through Hive/SparkSQL (apache#2366)

Co-authored-by: Ryan Pifer <[email protected]>

[HUDI-1504] Allow log files generated during restore/rollback to be synced as well

 - TestHoodieBackedMetadata#testSync etc now run for MOR tables
 - HUDI-1502 is still pending and has issues for MOR/rollbacks
 - Also addressed bunch of code review comments.

[HUDI-1498] Read clustering plan from requested file for inflight instant (apache#2389)

[HUDI-1506] Fix wrong exception thrown in HoodieAvroUtils (apache#2405)

[HUDI-1383] Fixing sorting of partition vals for hive sync computation (apache#2402)

[HUDI-1507] Change timeline utils to support reading replacecommit metadata (apache#2407)

[MINOR] Rename unit test package of hudi-spark3 from scala to java (apache#2411)

[HUDI-1513] Introduce WriteClient#preWrite() and relocate metadata table syncing (apache#2413)

- Syncing to metadata table, setting operation type, starting async cleaner done in preWrite()
 - Fixes an issues where delete() was not starting async cleaner correctly
 - Fixed tests and enabled metadata table for TestAsyncCompaction

[HUDI-1510] Move HoodieEngineContext and its dependencies to hudi-common (apache#2410)

[MINOR] Sync HUDI-1196 to  FlinkWriteHelper (apache#2415)

[HUDI-1514] Avoid raw type use for parameter of Transformer interface (apache#2420)

[HUDI-920] Support Incremental query for MOR table (apache#1938)

[HUDI-1276] [HUDI-1459] Make Clustering/ReplaceCommit and Metadata table be compatible (apache#2422)

* [HUDI-1276] [HUDI-1459] Make Clustering/ReplaceCommit and Metadata table be compatible

* Use filesystemview and json format from metadata. Add tests

Co-authored-by: Satish Kotha <[email protected]>

[HUDI-1399] support a independent clustering spark job to asynchronously clustering (apache#2379)

* [HUDI-1481]  add  structured streaming and delta streamer clustering unit test

* [HUDI-1399] support a independent clustering spark job to asynchronously clustering

* [HUDI-1399]  support a  independent clustering spark job to asynchronously clustering

* [HUDI-1498] Read clustering plan from requested file for inflight instant (apache#2389)

* [HUDI-1399]  support  a independent clustering spark job with schedule generate instant time

Co-authored-by: satishkotha <[email protected]>

[MINOR] fix spark 3 build for incremental query on MOR (apache#2425)

[HUDI-1479] Use HoodieEngineContext to parallelize fetching of partiton paths (apache#2417)

* [HUDI-1479] Use HoodieEngineContext to parallelize fetching of partition paths

* Adding testClass for FileSystemBackedTableMetadata

Co-authored-by: Nishith Agarwal <[email protected]>

[HUDI-1520] add configure for spark sql overwrite use INSERT_OVERWRITE_TABLE (apache#2428)

[HUDI-1502] MOR rollback and restore support for metadata sync (apache#2421)

- Adds field to RollbackMetadata that capture the logs written for rollback blocks
- Adds field to RollbackMetadata that capture new logs files written by unsynced deltacommits

Co-authored-by: Vinoth Chandar <[email protected]>

Reviewers: O955 Project Hoodie Project Reviewer: Add blocking reviewers!, PHID-PROJ-pxfpotkfgkanblb3detq!, #ldap_hudi, modi

Reviewed By: #ldap_hudi, modi

Differential Revision: https://code.uberinternal.com/D5347141
kroushan-nit pushed a commit to kroushan-nit/hudi-oss-fork that referenced this pull request Aug 28, 2025
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants