From 8add740d2257214fb3b6238091b0c526dee88a26 Mon Sep 17 00:00:00 2001 From: Vinoth Govindarajan Date: Sun, 3 Apr 2022 03:53:25 -0700 Subject: [PATCH] [HUDI-3534] [RFC-34] Added the implementation details for the BigQuery integration (#4503) --- rfc/README.md | 2 +- rfc/rfc-34/big-query-arch.png | Bin 0 -> 38035 bytes rfc/rfc-34/rfc-34.md | 166 ++++++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 rfc/rfc-34/big-query-arch.png create mode 100644 rfc/rfc-34/rfc-34.md diff --git a/rfc/README.md b/rfc/README.md index bc3bfde37..0009a1b72 100644 --- a/rfc/README.md +++ b/rfc/README.md @@ -69,7 +69,7 @@ The list of all RFCs can be found here. | 31 | [Hive integration Improvement](https://cwiki.apache.org/confluence/display/HUDI/RFC+-+31%3A+Hive+integration+Improvment)| `UNDER REVIEW` | | 32 | [Kafka Connect Sink for Hudi](https://cwiki.apache.org/confluence/display/HUDI/RFC-32+Kafka+Connect+Sink+for+Hudi)| `ONGOING` | | 33 | [Hudi supports more comprehensive Schema Evolution](https://cwiki.apache.org/confluence/display/HUDI/RFC+-+33++Hudi+supports+more+comprehensive+Schema+Evolution)| `ONGOING` | -| 34 | [Hudi BigQuery Integration (WIP)](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=188745980) | `IN PROGRESS` | +| 34 | [Hudi BigQuery Integration](./rfc-34/rfc-34.md) | `COMPLETED` | | 35 | [Make Flink MOR table writing streaming friendly](https://cwiki.apache.org/confluence/display/HUDI/RFC-35%3A+Make+Flink+MOR+table+writing+streaming+friendly)| `UNDER REVIEW` | | 36 | [HUDI Metastore Server](https://cwiki.apache.org/confluence/display/HUDI/%5BWIP%5D+RFC-36%3A+HUDI+Metastore+Server)| `UNDER REVIEW` | | 37 | [Hudi Metadata based Bloom Index](rfc-37/rfc-37.md) | `IN PROGRESS` | diff --git a/rfc/rfc-34/big-query-arch.png b/rfc/rfc-34/big-query-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..4503717fd69980aeb3022d8e9c96df1bbcf867e1 GIT binary patch literal 38035 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 literal 0 HcmV?d00001 diff --git a/rfc/rfc-34/rfc-34.md b/rfc/rfc-34/rfc-34.md new file mode 100644 index 000000000..e65611d38 --- /dev/null +++ b/rfc/rfc-34/rfc-34.md @@ -0,0 +1,166 @@ +# Hudi BigQuery Integration + +## Abstract + +BigQuery is Google Cloud's fully managed, petabyte-scale, and cost-effective analytics data warehouse that lets you run +analytics over vast amounts of data in near real time. BigQuery +currently [doesn’t support](https://cloud.google.com/bigquery/external-data-cloud-storage) Apache Hudi, but it has +support for the Parquet and other formats. The proposal is to implement a BigQuerySync similar to HiveSync to sync the +Hudi table as the BigQuery External Parquet table, so that users can query the Hudi tables using BigQuery. Uber is +already syncing some of its Hudi tables to BigQuery data mart this will help them to write, sync and query. + +## Background + +Hudi table types define how data is indexed & laid out on the DFS and how the above primitives and timeline activities +are implemented on top of such organization (i.e how data is written). In turn, query types define how the underlying +data is exposed to the queries (i.e how data is read). + +Hudi supports the following table types: + +* [Copy On Write](https://hudi.apache.org/docs/table_types#copy-on-write-table): Stores data using exclusively columnar + file formats (e.g parquet). Updates simply version & rewrite the files by performing a synchronous merge during write. +* [Merge On Read](https://hudi.apache.org/docs/table_types#merge-on-read-table): Stores data using a combination of + columnar (e.g parquet) + row based (e.g avro) file formats. Updates are logged to delta files & later compacted to + produce new versions of columnar files synchronously or asynchronously. + +Hudi maintains multiple versions of the Parquet files and tracks the latest version using Hudi metadata (Cow), since +BigQuery doesn’t support Hudi yet, when you sync the Hudi’s parquet files to BigQuery and query it without Hudi’s +metadata layer, it will query all the versions of the parquet files which might cause duplicate rows. + +To avoid the above scenario, this proposal is to implement a BigQuery sync tool which will use the Hudi metadata to know +which files are latest and filter only the latest version of parquet files to BigQuery external table so that users can +query the Hudi tables without any duplicate records. + +## Implementation + +This new feature will implement +the [AbstractSyncTool](https://github.com/apache/hudi/blob/master/hudi-sync/hudi-sync-common/src/main/java/org/apache/hudi/sync/common/AbstractSyncTool.java) +similar to +the [HiveSyncTool](https://github.com/apache/hudi/blob/master/hudi-sync/hudi-hive-sync/src/main/java/org/apache/hudi/hive/HiveSyncTool.java) +named BigQuerySyncTool with sync methods for CoW tables. The sync implementation will identify the latest parquet files +for each .commit file and keep these manifests synced with the BigQuery manifest table. Spark datasource & DeltaStreamer +can already take a list of such classes to keep these manifests synced. + +### + +![alt_text](big-query-arch.png "Big Query integration architecture.") + +To avoid duplicate records on the Hudi CoW table, we need to generate the list of latest snapshot files and create a BQ +table for it, then use that table to filter the duplicate records from the history table. + +### Steps to create Hudi table on BigQuery + +1. Let's say you have a Hudi table data on google cloud storage (GCS). + + ``` +CREATE TABLE dwh.bq_demo_partitioned_cow ( + id bigint, + name string, + price double, + ts bigint, + dt string +) +using hudi +partitioned by (dt) +options ( + type = 'cow', + primaryKey = 'id', + preCombineField = 'ts', + hoodie.datasource.write.drop.partition.columns = 'true' +) +location 'gs://hudi_datasets/bq_demo_partitioned_cow/'; +``` + +BigQuery doesn't accept the partition column in the parquet schema, hence we need to drop the partition columns from the +schema by enabling this flag: + +``` +hoodie.datasource.write.drop.partition.columns = 'true' +``` + +2. As part of the BigQuerySync, the sync tool will generate/update the manifest files inside the .hoodie metadata files. + For tables which already exist, you can generate a manifest file for the Hudi table which has the list of the latest + snapshot parquet file names in a CSV format with only one column the file name. The location of the manifest file + will be on the .hoodie metadata folder (`gs://bucket_name/table_name/.hoodie/manifest/latest_snapshot_files.csv`) + +``` +// this command is coming soon. +// the alternative for this command could be a JAVA API to generate the manifest. +GENERATE symlink_format_manifest FOR TABLE dwh.bq_demo_partitioned_cow; +``` + +3. Create a BQ table named `hudi_table_name_manifest` with only one column filename with this location gs: + //bucket_name/table_name/.hoodie/manifest/latest_snapshot_files.csv. + +``` +CREATE EXTERNAL TABLE `my-first-project.dwh.bq_demo_partitioned_cow_manifest` +( + filename STRING +) +OPTIONS( + format="CSV", + uris=["gs://hudi_datasets/bq_demo_partitioned_cow/.hoodie/manifest/latest_snapshot_files.csv"] +); +``` + +4. Create another BQ table named `hudi_table_name_history` with this location `gs://bucket_name/table_name`, don't use + this table to query the data, this table will have duplicate records since it scans all the versions of parquet files + in the table/partition folders. + +``` +CREATE EXTERNAL TABLE `my-first-project.dwh.bq_demo_partitioned_cow_history` +WITH + PARTITION COLUMNS + OPTIONS( + ignore_unknown_values=true, + format="PARQUET", + hive_partition_uri_prefix="gs://hudi_datasets/bq_demo_partitioned_cow/", + uris=["gs://hudi_snowflake/bq_demo_partitioned_cow/dt=*"] + ); +``` + +5. Create a BQ view with the same hudi table name with this query, this view you created has the data from the Hudi + table without any duplicates, you can use that table to query the data. + +``` +CREATE VIEW `my-first-project.dwh.bq_demo_partitioned_cow` AS + SELECT + * + FROM + `my-first-project.dwh.bq_demo_partitioned_cow_history` + WHERE + _hoodie_file_name IN ( + SELECT + filename + FROM + `my-first-project.dwh.bq_demo_partitioned_cow_manifest` + ); +``` + +BigQuerySync tool will +use [HoodieTableMetaClient](https://github.com/apache/hudi/blob/master/hudi-common/src/main/java/org/apache/hudi/common/table/HoodieTableMetaClient.java) +methods to get the list of latest set of parquet data files to generate the manifest csv file, then will invoke +the [BigQuery Java Client](https://github.com/googleapis/java-bigquery/blob/main/samples/snippets/src/main/java/com/example/bigquery/CreateTableExternalHivePartitioned.java) +to create the manifest table, history table and hudi table views. + +**All the steps described here will be automated, all you have to do is to supply a bunch of configs to enable the +BigQuery sync.** + +## Rollout/Adoption Plan + +There are no impacts to existing users since this is entirely a new feature to support a new use case hence there are no +migrations/behavior changes required. + +After the BigQuery sync tool has been implemented, I will reach out to Uber's Hudi/BigQuery team to rollout this feature +for their BigQuery ingestion service. + +## Test Plan + +This RFC aims to implement a new SyncTool to sync the Hudi table to BigQuery, to test this feature, there will be some +test tables created and updated on to the BigQuery along with unit tests for the code. Since this is an entirely new +feature, I am confident that this will not cause any regressions during and after roll out. + +## Future Plans + +After this feature has been rolled out, the same model can be applied to sync the Hudi tables to other external data +warehouses like Snowflake.