From 6faed3d90ab99844017465e63c6a0604bdc3a68c Mon Sep 17 00:00:00 2001 From: ForwardXu Date: Fri, 4 Mar 2022 12:02:46 +0800 Subject: [PATCH] [HUDI-3161][RFC-47] Add Call Produce Command for Spark SQL (#4607) --- rfc/README.md | 1 + rfc/rfc-46/rfc-46.md | 2 +- rfc/rfc-47/process.png | Bin 0 -> 54876 bytes rfc/rfc-47/rfc-47.md | 111 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 rfc/rfc-47/process.png create mode 100644 rfc/rfc-47/rfc-47.md diff --git a/rfc/README.md b/rfc/README.md index a9587d1d7..0b3142e8b 100644 --- a/rfc/README.md +++ b/rfc/README.md @@ -70,3 +70,4 @@ The list of all RFCs can be found here. | 44 | [Hudi Connector for Presto](./rfc-44/rfc-44.md) | `UNDER REVIEW` | | 45 | [Asynchronous Metadata Indexing](./rfc-45/rfc-45.md) | `UNDER REVIEW` | | 46 | [Optimizing Record Payload Handling](./rfc-46/rfc-46.md) | `UNDER REVIEW` | +| 47 | [Add Call Produce Command for Spark SQL](./rfc-47/rfc-47.md) | `UNDER REVIEW` | diff --git a/rfc/rfc-46/rfc-46.md b/rfc/rfc-46/rfc-46.md index 8b0feff23..92aed5554 100644 --- a/rfc/rfc-46/rfc-46.md +++ b/rfc/rfc-46/rfc-46.md @@ -156,4 +156,4 @@ This refactoring will not be modifying any existing Hudi semantics other than th logical correctness of the many flows that will be affected by the refactoring we will rely on the existing set of test-suites. Nevertheless, we will run corresponding set of benchmarks stressing the flows being affected by the refactoring to validate -that there are considerable performance advantage of abandoning conversion into intermediate representation completely. \ No newline at end of file +that there are considerable performance advantage of abandoning conversion into intermediate representation completely. diff --git a/rfc/rfc-47/process.png b/rfc/rfc-47/process.png new file mode 100644 index 0000000000000000000000000000000000000000..0553fea6f78c4d4aeb5cc0c9f702c17a404c60e4 GIT binary patch literal 54876 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 + +# RFC-[47]: Add RFC for Add Call Produce Command for Spark SQL + + +## Proposers +- @forwardxu + +## Approvers + - @vinoth @Danny @Raymond + +## Status + +JIRA: [https://issues.apache.org/jira/browse/HUDI-3161](https://issues.apache.org/jira/browse/HUDI-3161) + +## Abstract + +We intend to implement Call Procedure Command for Spark SQL. + +## Background +The Call Procedure Command can solve the problems that DDL and DML functions cannot handle. What I can think of are the following 4 aspects: +- Commit management +- Metadata table management +- Table migration +- Optimization table(Such as Table services like clustering) + +## Implementation + +### Extended SQL for CALL Command Syntax +#### Named arguments +All procedure arguments are named. When passing arguments by name, arguments can be in any order and any optional argument can be omitted. +``` +CALL system.procedure_name(arg_name_2 => arg_2, arg_name_1 => arg_1, ... arg_name_n => arg_n) +``` +#### Positional arguments +When passing arguments by position, the arguments may be omitted if they are optional. +``` +CALL system.procedure_name(arg_1, arg_2, ... arg_n) +``` +*note:* The system here has no practical meaning, the complete procedure name is system.procedure_name. + +![](process.png) + +As shown in the figure above, The execution process of Call Command consists of two parts, SQL Parser and Procedure Run. + +### parse +In the sql parse stage, we will inject a HoodieSqlParser to spark sql which will parse our extended `CALL` syntax to LogicalPlan. If the HoodieSqlParser failed to parse the sql statement, Spark will route it to Spark SQL parser. So we just need to implement our extended syntax in `HoodieSqlParser`. + +### resolution +In the resolution stage, some Hudi resolution rules will be injected to Spark SQL to resolve our extended LogicalPlan to the resolve plan which is a command plan for `CALL`. + +### procedure#call +The `procedure#call` method will translate the logical plan to Hudi's API call. For example, the `ShowCommitsProcedure` will be translated to Hudi API for showing Hudi timeline's commits. + +### examples +Example 1: + +``` +call show_commits_metadata(table => 'test_hudi_table'); +``` + +| commit_time | action | partition | file_id | previous_commit | num_writes | num_inserts | num_deletes | num_update_writes | total_errors | total_log_blocks | total_corrupt_logblocks | total_rollback_blocks | total_log_records | total_updated_records_compacted | total_bytes_written| +|----------------- | ---- | ------------ |----------------------------------------| ---------------- |------------- |-------------|-------------|------------------ |------------- |---------------- |-------------------------|---------------------- |-------------------|------------------------------- |------------------- | +|20220109225319449 | commit | dt=2021-05-03 | d0073a12-085d-4f49-83e9-402947e7e90a-0 | null | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 435349 | +|20220109225311742 | commit | dt=2021-05-02 | b3b32bac-8a44-4c4d-b433-0cb1bf620f23-0 | 20220109214830592| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 435340 | +|20220109225301429 | commit | dt=2021-05-01 | 0d7298b3-6b55-4cff-8d7d-b0772358b78a-0 | 20220109214830592| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 435340 | +|20220109214830592 | commit | dt=2021-05-01 | 0d7298b3-6b55-4cff-8d7d-b0772358b78a-0 | 20220109191631015| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 432653 | +|20220109214830592 | commit | dt=2021-05-02 | b3b32bac-8a44-4c4d-b433-0cb1bf620f23-0 | 20220109191648181| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 432653 | +|20220109191648181 | commit | dt=2021-05-02 | b3b32bac-8a44-4c4d-b433-0cb1bf620f23-0 | null | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 435341 | +|20220109191631015 | commit | dt=2021-05-01 | 0d7298b3-6b55-4cff-8d7d-b0772358b78a-0 | null | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 435341 | + +Time taken: 0.844 seconds, Fetched 7 row(s) + +Example 2: + +``` +call rollback_to_instant(table => 'test_hudi_table', instant_time => '20220109225319449'); +``` + +| rollback_result | +| :---------------| +| true | + +Time taken: 5.038 seconds, Fetched 1 row(s) + +### Spark SQL permissions and security +For security, please refer to the description of [Spark Security](https://spark.apache.org/docs/latest/security.html). + +## Rollout/Adoption Plan +This is a new feature can use Spark SQL works And does not depend on the Spark version. + +## Test Plan + +- [☑️️] Unit tests for this feature +- [✖️] Product integration tests +- [✖️] Benchmark snapshot query for large tables