From 8f974c9da7f1c1aeeca9be8e4bf9060182ea7442 Mon Sep 17 00:00:00 2001 From: Dale Mcdiarmid Date: Thu, 19 Dec 2024 13:47:10 +0000 Subject: [PATCH 01/10] initial commit --- docs/en/data-modeling/backfilling.md | 292 +++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 docs/en/data-modeling/backfilling.md diff --git a/docs/en/data-modeling/backfilling.md b/docs/en/data-modeling/backfilling.md new file mode 100644 index 00000000000..7d74758c2b2 --- /dev/null +++ b/docs/en/data-modeling/backfilling.md @@ -0,0 +1,292 @@ +--- +slug: /en/data-modeling/backfilling +title: Backfilling Data +description: How to use backfill large datasets in ClickHouse +keywords: [materialized views, backfilling, inserting data, resilent data load] +--- + +# Backfilling Data + +Whether new to ClickHouse or responsible for an existing deployment, users will invariably need to backfill data. This task requires tables to be populated with historical data. In some cases, this is relatively simple but can become more complex when materialized views need to also be populated. This guide documents some techniques for this task that users can apply to their usecase. + +:::important +This guide assumes users are already familar with the concept of [Incremental Materialized Views]() and data loading using table functions such as [s3]() and [gcs](). +::: + +## Example dataset + +Throughout this guide we use a PyPI dataset. Each row in this dataset represents a Python package download using a tool such as `pip`. + +The subset used for example purposes covers a single day - `2024-12-17` and is available publically at `https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/`. For example, users can query with: + +```sql +SELECT count() +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/*.parquet') + +┌────count()─┐ +│ 2039988137 │ -- 2.04 billion +└────────────┘ + +1 row in set. Elapsed: 32.726 sec. Processed 2.04 billion rows, 170.05 KB (62.34 million rows/s., 5.20 KB/s.) +Peak memory usage: 239.50 MiB. +``` + +The full dataset for this bucket contains over `320GB` of parquet files. We thus intentionally target subsets using glob patterns in our examples below. + +We assume the user is consuming a stream of this data e.g. from Kafka or object storage, for data after this date. The schema for this data is shown below: + +```sql +CREATE TABLE pypi +( + `date` Date, + `country_code` LowCardinality(String), + `project` String, + `type` LowCardinality(String), + `installer` LowCardinality(String), + `python_minor` LowCardinality(String), + `system` LowCardinality(String), + `version` String +) +ENGINE = MergeTree +ORDER BY (project, date, version, country_code, python_minor, system) +``` + +:::note +The full PyPi dataset, consisting of over 1 trillion rows, is available in our public demo environment [clickpy.clickhouse.com](https://clickpy.clickhouse.com). For further details on this dataset, including how the demo exploits materialized views for performance and how the data is populated daily, see [here](https://github.com/ClickHouse/clickpy). +::: + +## Backfilling scenarios + +Backfilling is typically needed when a stream of data is being consumed from a point in time. This data is being inserted into ClickHouse tables with [incremental materialized views]() trigging on blocks as they are inserted. These views may be transforming the data prior to insert or computing aggregates and sending results to target tables for later use my downstream applications. + +We will attempt to cover the following scenarios: + +1. **Backfilling data with existing data ingestion** - Data is already inserting and a point in time or montonotically increasing column can be identified from which historical data needs to be backfilled. +2. **Backfilling data with no existing data ingestion** - Users have yet to start streaming new data into ClickHouse but have prepared their table and materialized views. They are ready to ingest. +3. **Adding materialized views to existing tables** - New materialized views need to be added to a setup for which historical data has been populated and data is already streaming. + +For scenarios (1) and (2) we assume data will be backfilled from object storage. + +We recommend backfilling historical data from object storage. While data should be exported to Parquet where possible for optimal read performance and compression (reduced network transfer), with a file size of around 150MB typically prefered, ClickHouse supports over [70 file formats](). + +### Using duplicate tables and views + +For all of the scenarios we rely on the the concept of a "duplicate tables and views". These tables and views represent copies of those used for the live streaming data, and allow the backfill to be performed in isolation with an easy means of recovery should failure occur. For example, we have the above `pypi` table and materialized view which computes the number of downloads per python project: + +```sql +CREATE TABLE pypi_downloads +( + `project` String, + `count` Int64 +) +ENGINE = SummingMergeTree +ORDER BY project + +CREATE MATERIALIZED VIEW pypi_downloads_mv TO pypi_downloads +AS SELECT + project, + count() AS count +FROM pypi +GROUP BY project +``` + +We populate the main table, and associated view, with a subset of the data: + +```sql +INSERT INTO pypi SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/1734393600-000000000{000..100}.parquet') + +0 rows in set. Elapsed: 15.702 sec. Processed 41.23 million rows, 3.94 GB (2.63 million rows/s., 251.01 MB/s.) +Peak memory usage: 977.49 MiB. + +SELECT count() FROM pypi + +┌──count()─┐ +│ 20612750 │ -- 20.61 million +└──────────┘ + +1 row in set. Elapsed: 0.004 sec. + +SELECT sum(count) +FROM pypi_downloads + + +┌─sum(count)─┐ +│ 20612750 │ -- 20.61 million +└────────────┘ + +1 row in set. Elapsed: 0.006 sec. Processed 96.15 thousand rows, 769.23 KB (16.53 million rows/s., 132.26 MB/s.) +Peak memory usage: 682.38 KiB. +``` + +Now suppose we wish to load another subset `{101..200}`. While we could insert directly into `pypi`, we can do this backfill in isolation by creating duplicate tables. + +Should the backfill fail, we have not impacted our main tables and can simply [truncate]() our duplicates tables and repeat. + +To create new copies of these views we can use the `CREATE TABLE AS` clause with the suffix `_v2`: + +```sql +CREATE TABLE pypi_v2 AS pypi + +CREATE TABLE pypi_downloads_v2 AS pypi_downloads + +CREATE MATERIALIZED VIEW pypi_downloads_mv_v2 TO pypi_downloads_v2 +AS SELECT + project, + count() AS count +FROM pypi_v2 +GROUP BY project +``` + +We populate this with our 2nd subset of approximately the same size, and confirm the successful load. + +```sql +INSERT INTO pypi_v2 SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/1734393600-000000000{101..200}.parquet') + +0 rows in set. Elapsed: 17.545 sec. Processed 40.80 million rows, 3.90 GB (2.33 million rows/s., 222.29 MB/s.) +Peak memory usage: 991.50 MiB. + +SELECT count() +FROM pypi_v2 + +┌──count()─┐ +│ 20400020 │ -- 20.40 million +└──────────┘ + +1 row in set. Elapsed: 0.004 sec. + +SELECT sum(count) +FROM pypi_downloads_v2 + +┌─sum(count)─┐ +│ 20400020 │ -- 20.40 million +└────────────┘ + +1 row in set. Elapsed: 0.006 sec. Processed 95.49 thousand rows, 763.90 KB (14.81 million rows/s., 118.45 MB/s.) +Peak memory usage: 688.77 KiB. +``` + +If at any point during this 2nd load we experienced a failure we could simply [truncate]() our `pypi_v2` and `pypi_downloads_v2` and repeat the data load. + +With our data load complete, we can move the data from our duplicate tables to the main tables using the `ALTER TABLE ATTACH PARTITION` clause. + +```sql +ALTER TABLE pypi + (ATTACH PARTITION () FROM pypi_v2) + +0 rows in set. Elapsed: 1.401 sec. + +ALTER TABLE pypi_downloads + (ATTACH PARTITION () FROM pypi_downloads_v2) + +0 rows in set. Elapsed: 0.389 sec. +``` + +We can now confirm `pypi` and `pypi_downloads` contain the complete data. `pypi_downloads_v2` and `pypi_v2` can be safely dropped. + +```sql +SELECT count() +FROM pypi + +┌──count()─┐ +│ 41012770 │ -- 41.01 million +└──────────┘ + +1 row in set. Elapsed: 0.003 sec. + +SELECT sum(count) +FROM pypi_downloads + +┌─sum(count)─┐ +│ 41012770 │ -- 41.01 million +└────────────┘ + +1 row in set. Elapsed: 0.007 sec. Processed 191.64 thousand rows, 1.53 MB (27.34 million rows/s., 218.74 MB/s.) + +SELECT count() +FROM pypi_v2 +``` + +Importantly, the `ATTACH PARTITION` operation is both lightweight (exploiting hardlinks) and is atomic i.e. it either fails or succeeds with no intermediate state. You may notice that `pypi_v2` and `pypi_downloads_v2` still contain data e.g. + +```sql +SELECT count() +FROM pypi_v2 + +┌──count()─┐ +│ 20400020 │ -- 20.40 million +└──────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` +As noted ClickHouse, "copies" the data by using hard links. Should we thus drop `pypi_v2`, with `pypi` retaining a copy to the actual physical data. + +```sql +DROP TABLE pypi_v2 + +SELECT count() +FROM pypi + +┌──count()─┐ +│ 41012770 │ -- 41.01 million +└──────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +We exploit this process heavily in our backfilling scenarios below. + +:::note +ClickPipes uses this approach when loading data from object storage, automatically creating duplicates of the target table and its materialized views. By also using multiple workers (each with their own duplicates), data can be loaded quickly with exactly-once semantic. For those interested, further details can be found [in this blog](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part3). +::: + +### Scenario 1: Backfilling data with existing data ingestion + + +create shadow tables and materialized views. Insert into them using the column or time identifer. Attach partitions to their corresponding live versions. + +clickpipes - can use with clickpipes - better as its exactly once. + +If not using clickpipes, INSERT INTO SELECT in batches. Where you could envisage shadow tables for each batch. + + +### Scenario 2: Backfilling data with no existing data ingestion + +Identifiy a time value or monotonically increasing id. Modify all materialized views such that they only apply to values > this id or time value. + +Start stream. + +Backfill as above. + + +### Scenario 3: Adding materialized views to existing tables + +Ideally users can identify a point in time or montonotically increasing column, which can be used to establish a consistent point in the stream. + +Identifiy a time value or monotonically increasing id. Add new materialized views such that it only applies to values > this id or time value. + + +Either: + +1. create a shadown of the target materialized view. Populate with a query - INSERT INTO SELCT. This can be memory hungry. Can spool to disk but still risky. +2. Do in batches (1) +3. Create a null table engine of the main table. create a shadown of the target mv - trigger off null table. Insert into the data. ATTACH partitions to real mv target table. Drop the mv and null table. Control memory with settings. + + + + + +### Using Clickpipes + + + +## Backfilling materialized views + + + + +### Using Clickpipes + + + From 8fb8aa6bb0ffc951f6d439e66dea6de5c7beaebd Mon Sep 17 00:00:00 2001 From: Dale Mcdiarmid Date: Thu, 19 Dec 2024 14:48:44 +0000 Subject: [PATCH 02/10] more content --- docs/en/data-modeling/backfilling.md | 93 +++++++++++++++------------- 1 file changed, 49 insertions(+), 44 deletions(-) diff --git a/docs/en/data-modeling/backfilling.md b/docs/en/data-modeling/backfilling.md index 7d74758c2b2..41a7674a7c2 100644 --- a/docs/en/data-modeling/backfilling.md +++ b/docs/en/data-modeling/backfilling.md @@ -36,19 +36,7 @@ The full dataset for this bucket contains over `320GB` of parquet files. We thus We assume the user is consuming a stream of this data e.g. from Kafka or object storage, for data after this date. The schema for this data is shown below: ```sql -CREATE TABLE pypi -( - `date` Date, - `country_code` LowCardinality(String), - `project` String, - `type` LowCardinality(String), - `installer` LowCardinality(String), - `python_minor` LowCardinality(String), - `system` LowCardinality(String), - `version` String -) -ENGINE = MergeTree -ORDER BY (project, date, version, country_code, python_minor, system) + ``` :::note @@ -61,19 +49,33 @@ Backfilling is typically needed when a stream of data is being consumed from a p We will attempt to cover the following scenarios: -1. **Backfilling data with existing data ingestion** - Data is already inserting and a point in time or montonotically increasing column can be identified from which historical data needs to be backfilled. +1. **Backfilling data with existing data ingestion** - Data is already inserting and historical data needs to be backfilled. This historical data has been identified. 2. **Backfilling data with no existing data ingestion** - Users have yet to start streaming new data into ClickHouse but have prepared their table and materialized views. They are ready to ingest. -3. **Adding materialized views to existing tables** - New materialized views need to be added to a setup for which historical data has been populated and data is already streaming. +3. **Adding materialized views to existing tables** - New materialized views need to be added to a setup for which historical data has been populated and data is already streaming. A timestamp, or montonotically increasing column, which can be used to identify a point in the stream is useful here and avoids pauses in data ingestion. -For scenarios (1) and (2) we assume data will be backfilled from object storage. +For scenarios (1) and (2) we assume data will be backfilled from object storage. In all cases we aim to avoid pauses in data insertion. We recommend backfilling historical data from object storage. While data should be exported to Parquet where possible for optimal read performance and compression (reduced network transfer), with a file size of around 150MB typically prefered, ClickHouse supports over [70 file formats](). ### Using duplicate tables and views -For all of the scenarios we rely on the the concept of a "duplicate tables and views". These tables and views represent copies of those used for the live streaming data, and allow the backfill to be performed in isolation with an easy means of recovery should failure occur. For example, we have the above `pypi` table and materialized view which computes the number of downloads per python project: +For all of the scenarios we rely on the the concept of a "duplicate tables and views". These tables and views represent copies of those used for the live streaming data, and allow the backfill to be performed in isolation with an easy means of recovery should failure occur. For example, we have the following main `pypi` table and materialized view which computes the number of downloads per python project: ```sql +CREATE TABLE pypi +( + `timestamp` DateTime, + `country_code` LowCardinality(String), + `project` String, + `type` LowCardinality(String), + `installer` LowCardinality(String), + `python_minor` LowCardinality(String), + `system` LowCardinality(String), + `version` String +) +ENGINE = MergeTree +ORDER BY (project, timestamp) + CREATE TABLE pypi_downloads ( `project` String, @@ -169,16 +171,16 @@ Peak memory usage: 688.77 KiB. If at any point during this 2nd load we experienced a failure we could simply [truncate]() our `pypi_v2` and `pypi_downloads_v2` and repeat the data load. -With our data load complete, we can move the data from our duplicate tables to the main tables using the `ALTER TABLE ATTACH PARTITION` clause. +With our data load complete, we can move the data from our duplicate tables to the main tables using the `ALTER TABLE MOVE PARTITION` clause. ```sql ALTER TABLE pypi - (ATTACH PARTITION () FROM pypi_v2) + (MOVE PARTITION () FROM pypi_v2) 0 rows in set. Elapsed: 1.401 sec. ALTER TABLE pypi_downloads - (ATTACH PARTITION () FROM pypi_downloads_v2) + (MOVE PARTITION () FROM pypi_downloads_v2) 0 rows in set. Elapsed: 0.389 sec. ``` @@ -208,40 +210,29 @@ SELECT count() FROM pypi_v2 ``` -Importantly, the `ATTACH PARTITION` operation is both lightweight (exploiting hardlinks) and is atomic i.e. it either fails or succeeds with no intermediate state. You may notice that `pypi_v2` and `pypi_downloads_v2` still contain data e.g. +Importantly, the `MOVE PARTITION` operation is both lightweight (exploiting hardlinks) and is atomic i.e. it either fails or succeeds with no intermediate state. -```sql -SELECT count() -FROM pypi_v2 +We exploit this process heavily in our backfilling scenarios below. -┌──count()─┐ -│ 20400020 │ -- 20.40 million -└──────────┘ +This process requires users to choose the size of each insert operation. Larger inserts i.e. more rows, will mean less `MOVE PARTITION` operations are required. However, this must be balanced against the cost in the event of an insert failure e.g. due to network interruption, to recover. -1 row in set. Elapsed: 0.003 sec. -``` -As noted ClickHouse, "copies" the data by using hard links. Should we thus drop `pypi_v2`, with `pypi` retaining a copy to the actual physical data. +:::note +ClickPipes uses this approach when loading data from object storage, automatically creating duplicates of the target table and its materialized views, and avoiding the need for the user to perform the above steps. By also using multiple workers (each with their own duplicates), data can be loaded quickly with exactly-once semantic. For those interested, further details can be found [in this blog](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part3). +::: -```sql -DROP TABLE pypi_v2 +### Scenario 1: Backfilling data with existing data ingestion -SELECT count() -FROM pypi +In this scenario, data is already inserting and a timestamp or montonotically increasing column can be identified from which historical data needs to be backfilled. -┌──count()─┐ -│ 41012770 │ -- 41.01 million -└──────────┘ +For example, in our PyPI data suppose we have data loaded. We can identify the minimum timestamp, and thus our "checkpoint". -1 row in set. Elapsed: 0.003 sec. -``` +```sql -We exploit this process heavily in our backfilling scenarios below. -:::note -ClickPipes uses this approach when loading data from object storage, automatically creating duplicates of the target table and its materialized views. By also using multiple workers (each with their own duplicates), data can be loaded quickly with exactly-once semantic. For those interested, further details can be found [in this blog](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part3). -::: +``` + +From the above, we know we need to load data prior to `2024-12-17 09:00:00`. Using our earlier process, we create duplicate tables and views and load the subset. -### Scenario 1: Backfilling data with existing data ingestion create shadow tables and materialized views. Insert into them using the column or time identifer. Attach partitions to their corresponding live versions. @@ -288,5 +279,19 @@ Either: ### Using Clickpipes +pypi + +stop ingest + +1. CREATE MV on pypi +2. CREATE TABLE pypi_v2 AS pypi +3. EXCHANGE pypi_v2 AND pypi + +pypi_v2 has all the data. We attach the partitions from pypi_v2 to pypi. + + +Start ingest + +backfill to From 46d5167723bd0caf0ed9e862697787c67f467d6c Mon Sep 17 00:00:00 2001 From: Dale Mcdiarmid Date: Thu, 19 Dec 2024 14:56:40 +0000 Subject: [PATCH 03/10] more --- docs/en/data-modeling/backfilling.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/en/data-modeling/backfilling.md b/docs/en/data-modeling/backfilling.md index 41a7674a7c2..ad826b80820 100644 --- a/docs/en/data-modeling/backfilling.md +++ b/docs/en/data-modeling/backfilling.md @@ -214,7 +214,19 @@ Importantly, the `MOVE PARTITION` operation is both lightweight (exploiting hard We exploit this process heavily in our backfilling scenarios below. -This process requires users to choose the size of each insert operation. Larger inserts i.e. more rows, will mean less `MOVE PARTITION` operations are required. However, this must be balanced against the cost in the event of an insert failure e.g. due to network interruption, to recover. +This process requires users to choose the size of each insert operation. + +Larger inserts i.e. more rows, will mean less `MOVE PARTITION` operations are required. However, this must be balanced against the cost in the event of an insert failure e.g. due to network interruption, to recover. Users can complement this process with batching for files to reduce the risk. This can be performed with either range queries e.g. `WHERE timestamp BETWEEN 2024-12-17 09:00:00 AND 2024-12-17 10:00:00` or glob patterns. For example, + +```sql +INSERT INTO pypi_v2 SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/1734393600-000000000{101..200}.parquet') +INSERT INTO pypi_v2 SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/1734393600-000000000{201..300}.parquet') +INSERT INTO pypi_v2 SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/1734393600-000000000{301..400}.parquet') +--continued to all files loaded OR MOVE PARTITION call is performed +``` :::note ClickPipes uses this approach when loading data from object storage, automatically creating duplicates of the target table and its materialized views, and avoiding the need for the user to perform the above steps. By also using multiple workers (each with their own duplicates), data can be loaded quickly with exactly-once semantic. For those interested, further details can be found [in this blog](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part3). @@ -233,8 +245,11 @@ For example, in our PyPI data suppose we have data loaded. We can identify the m From the above, we know we need to load data prior to `2024-12-17 09:00:00`. Using our earlier process, we create duplicate tables and views and load the subset. +```sql +``` + create shadow tables and materialized views. Insert into them using the column or time identifer. Attach partitions to their corresponding live versions. clickpipes - can use with clickpipes - better as its exactly once. From d3e8c1be540cbd444d3500d85b563775f3645381 Mon Sep 17 00:00:00 2001 From: Dale Mcdiarmid Date: Thu, 19 Dec 2024 20:02:53 +0000 Subject: [PATCH 04/10] update docs --- docs/en/data-modeling/backfilling.md | 155 +++++++++++++++++++++++---- 1 file changed, 133 insertions(+), 22 deletions(-) diff --git a/docs/en/data-modeling/backfilling.md b/docs/en/data-modeling/backfilling.md index ad826b80820..f292e2629cb 100644 --- a/docs/en/data-modeling/backfilling.md +++ b/docs/en/data-modeling/backfilling.md @@ -50,14 +50,13 @@ Backfilling is typically needed when a stream of data is being consumed from a p We will attempt to cover the following scenarios: 1. **Backfilling data with existing data ingestion** - Data is already inserting and historical data needs to be backfilled. This historical data has been identified. -2. **Backfilling data with no existing data ingestion** - Users have yet to start streaming new data into ClickHouse but have prepared their table and materialized views. They are ready to ingest. -3. **Adding materialized views to existing tables** - New materialized views need to be added to a setup for which historical data has been populated and data is already streaming. A timestamp, or montonotically increasing column, which can be used to identify a point in the stream is useful here and avoids pauses in data ingestion. +2. **Adding materialized views to existing tables** - New materialized views need to be added to a setup for which historical data has been populated and data is already streaming. A timestamp, or montonotically increasing column, which can be used to identify a point in the stream is useful here and avoids pauses in data ingestion. -For scenarios (1) and (2) we assume data will be backfilled from object storage. In all cases we aim to avoid pauses in data insertion. +We assume data will be backfilled from object storage. In all cases we aim to avoid pauses in data insertion. We recommend backfilling historical data from object storage. While data should be exported to Parquet where possible for optimal read performance and compression (reduced network transfer), with a file size of around 150MB typically prefered, ClickHouse supports over [70 file formats](). -### Using duplicate tables and views +## Using duplicate tables and views For all of the scenarios we rely on the the concept of a "duplicate tables and views". These tables and views represent copies of those used for the live streaming data, and allow the backfill to be performed in isolation with an easy means of recovery should failure occur. For example, we have the following main `pypi` table and materialized view which computes the number of downloads per python project: @@ -232,41 +231,159 @@ FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12- ClickPipes uses this approach when loading data from object storage, automatically creating duplicates of the target table and its materialized views, and avoiding the need for the user to perform the above steps. By also using multiple workers (each with their own duplicates), data can be loaded quickly with exactly-once semantic. For those interested, further details can be found [in this blog](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part3). ::: -### Scenario 1: Backfilling data with existing data ingestion +## Scenario 1: Backfilling data with existing data ingestion -In this scenario, data is already inserting and a timestamp or montonotically increasing column can be identified from which historical data needs to be backfilled. +In this scenario, we assume that the data to backfill is not in an isolated bucket and thus filtering is required. Data is already inserting and a timestamp or montonotically increasing column can be identified from which historical data needs to be backfilled. For example, in our PyPI data suppose we have data loaded. We can identify the minimum timestamp, and thus our "checkpoint". ```sql +SELECT min(timestamp) +FROM pypi +┌──────min(timestamp)─┐ +│ 2024-12-17 09:00:00 │ +└─────────────────────┘ +1 row in set. Elapsed: 0.163 sec. Processed 1.34 billion rows, 5.37 GB (8.24 billion rows/s., 32.96 GB/s.) +Peak memory usage: 227.84 MiB. ``` -From the above, we know we need to load data prior to `2024-12-17 09:00:00`. Using our earlier process, we create duplicate tables and views and load the subset. +From the above, we know we need to load data prior to `2024-12-17 09:00:00`. Using our earlier process, we create duplicate tables and views and load the subset using a filter on the timestamp. ```sql +CREATE TABLE pypi_v2 AS pypi +CREATE TABLE pypi_downloads_v2 AS pypi_downloads + +CREATE MATERIALIZED VIEW pypi_downloads_mv_v2 TO pypi_downloads_v2 +AS SELECT + project, + count() AS count +FROM pypi_v2 +GROUP BY project +INSERT INTO pypi_v2 SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/1734393600-*.parquet') +WHERE timestamp < '2024-12-17 09:00:00' + +0 rows in set. Elapsed: 500.152 sec. Processed 2.74 billion rows, 364.40 GB (5.47 million rows/s., 728.59 MB/s.) ``` -create shadow tables and materialized views. Insert into them using the column or time identifer. Attach partitions to their corresponding live versions. +:::note +Filtering on timestamp columns in Parquet can be very efficient. ClickHouse will only read the timestamp column to identify the full data ranges to load, minimizing network traffic. Parquet inndices, such as min-max, can also be exploited by the ClickHouse query engine. +::: -clickpipes - can use with clickpipes - better as its exactly once. +Once this insert is complete, we can move the associated partitions. -If not using clickpipes, INSERT INTO SELECT in batches. Where you could envisage shadow tables for each batch. +```sql +ALTER TABLE pypi + (MOVE PARTITION () FROM pypi_v2) + +ALTER TABLE pypi_downloads + (MOVE PARTITION () FROM pypi_downloads_v2) +``` -### Scenario 2: Backfilling data with no existing data ingestion +If the historical data is an isolated bucket the above time filter is not required. -Identifiy a time value or monotonically increasing id. Modify all materialized views such that they only apply to values > this id or time value. +:::important Use ClickPipes in ClickHouse Cloud +ClickHouse Cloud users should use ClickPipes for restoring historical backups if the data can be isolated in its own bucket (and a filter is not required). As well as parallelizing the load with multiple workers, thus reducing the load time, ClickPipes automates the above process - creating duplicate tables for both the main table and materialized views. +::: -Start stream. +## Scenario 2: Adding materialized views to existing tables + +It is not uncommon, that new materialized views need to be added to a setup for which significant data has been populated and data is being inserted. A timestamp, or montonotically increasing column, which can be used to identify a point in the stream is useful here and avoids pauses in data ingestion. We assume both cases in the examples below, prefering approaches which avoid pauses in ingestion. + +:::important Avoid POPULATE +We do not recommend using the [`POPULATE`]() command for backfilling materialized views for anything other than small datasets where ingest is paused. This operator can misses rows inserted into its source table, with the materialized view +created after the populate hash finished. Furthermore this, populate runs against all data and is vulnerable to interruptions or memory limits on large datasets. +::: + +### Timestamp or Monotonically increasing column available + +In this case, we recommend the new materialized view include a filter which restricts rows to those greater than an arbitary data in the future. The materialized view can subsequently be backfilled from this date using historical data from the main table. The approach used for backfilling depends on the size of the data and complexity of the associated query. + +Consider the following materialized view which computes the most popular projects by per hour. + +```sql +CREATE TABLE pypi_downloads_per_day +( + `hour` DateTime, + `project` String, + `count` Int64 +) +ENGINE = SummingMergeTree +ORDER BY (project, hour) + + +CREATE MATERIALIZED VIEW pypi_downloads_per_day_mv TO pypi_downloads_per_day +AS SELECT + toStartOfHour(timestamp) as hour, + project, + count() AS count +FROM pypi +GROUP BY + hour, + project +``` + +While we can add the target table, prior to adding the materialized view we modify its `SELECT` clause to include a filer which only considers rows greater than an arbitary time in the near future - in this case we assume `2024-12-17 09:00:00` is a few minutes in the future. + +```sql +CREATE MATERIALIZED VIEW pypi_downloads_per_day_mv TO pypi_downloads_per_day +AS SELECT + toStartOfHour(timestamp) as hour, + project, + count() AS count +FROM pypi WHERE timestamp < '2024-12-17 09:00:00' +GROUP BY + hour, + project +``` + +Once this view is added, we can backfill all data for the materialized view prior to this data. + +The simplest means of doing this is to simple run the query from the materialized view on the main table with a filter which ignores recently added data, inserting the results into our view's target table via an `INSERT INTO SELECT`. For example for the above view: + +```sql +INSERT INTO pypi_downloads_per_day SELECT + toStartOfHour(timestamp) AS hour, + project, + count() AS count +FROM pypi +WHERE timestamp < '2024-12-17 09:00:00' +GROUP BY + hour, + project + +Ok. + +0 rows in set. Elapsed: 2.830 sec. Processed 798.89 million rows, 17.40 GB (282.28 million rows/s., 6.15 GB/s.) +Peak memory usage: 543.71 MiB. +``` + +In our case this is relatively lightweight aggregation which completes in under `3s` and uses less than `600MiB` of memory. For more complex or longer running aggregations, users can make this more resilent by using the earlier duplicate table approach i.e. create a shadow target table e.g. `pypi_downloads_per_day_v2`, insert into this and attach its resulting partitions to `pypi_downloads_per_day`. + +Often materialized view's query can be more complex (not uncommon as otherwise users wouldn't use a view!) and consume resources. In rarer cases, the resources for the query are beyond that of the server. This highlights one of the advanages of ClickHouse materialized views - they are incremental and don't process the entire dataset in one go! + +In this case users have several options: + +1. Modify your query to backfill ranges e.g. `WHERE timestamp BETWEEN 2024-12-17 08:00:00 AND 2024-12-17 09:00:00`, `WHERE timestamp BETWEEN 2024-12-17 07:00:00 AND 2024-12-17 08:00:00` etc. +2. Use settings to limit memory for the query and spill aggregations (or sorts) to disk. Disk can still be exhausted and queries can still timeout, so this has limitations. For example, in ClickHouse Cloud, local storage is for caching and overspill but is often significantly smaller than full datasets held in object storage. +3. Use a [Null table engine]() to fill the materialized view. This replicates the typical incremental population of a materialized view, executing it's query over blocks of data (of configurable size). + +(1) represents the simplest approach is often sufficient. We do not include examples for brevity. + +(2) and (3) are further explained below. + +#### Limiting memory of GROUP/ORDER BY + + +### No Timestamp or Monotonically increasing column -Backfill as above. -### Scenario 3: Adding materialized views to existing tables Ideally users can identify a point in time or montonotically increasing column, which can be used to establish a consistent point in the stream. @@ -282,13 +399,7 @@ Either: - -### Using Clickpipes - - - -## Backfilling materialized views - +Note: attach parition call above is () as no partitions From 891dd6c3559b0deb257b92087dfff2b7fc6c2fe7 Mon Sep 17 00:00:00 2001 From: Dale Mcdiarmid Date: Fri, 20 Dec 2024 12:36:52 +0000 Subject: [PATCH 05/10] more --- docs/en/data-modeling/backfilling.md | 78 +++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 14 deletions(-) diff --git a/docs/en/data-modeling/backfilling.md b/docs/en/data-modeling/backfilling.md index f292e2629cb..d124fe12fe7 100644 --- a/docs/en/data-modeling/backfilling.md +++ b/docs/en/data-modeling/backfilling.md @@ -10,7 +10,7 @@ keywords: [materialized views, backfilling, inserting data, resilent data load] Whether new to ClickHouse or responsible for an existing deployment, users will invariably need to backfill data. This task requires tables to be populated with historical data. In some cases, this is relatively simple but can become more complex when materialized views need to also be populated. This guide documents some techniques for this task that users can apply to their usecase. :::important -This guide assumes users are already familar with the concept of [Incremental Materialized Views]() and data loading using table functions such as [s3]() and [gcs](). +This guide assumes users are already familar with the concept of [Incremental Materialized Views]() and data loading using table functions such as [s3]() and [gcs](). We also recommend users read our guide on [optimizing insert performance from object storage](), the advice of which can be applied to inserts throughout this guide. ::: ## Example dataset @@ -380,6 +380,68 @@ In this case users have several options: #### Limiting memory of GROUP/ORDER BY +#### Using a Null table engine for filling materialized views + +The [Null table engine]() provides a storage engine which doesn't persist data (think of it as the `/dev/null` of the table engine world). While this seems contradictory, materialized views will still execute on data inserted into this table engine. This allows materialized views to be constructed without persisting the original data - avoiding I/O and the associated storage. + + +Importantly, any materialized views attached to the table engine still execute over blocks of data as its inserted - sending their results to a target table. These blocks are of a configurable size. While larger blocks can potentially be more efficient (and faster to process), they consume more resources (principally memory). Use of this table engine means we can build our materialized view incrementally i.e. a block at a time, avoiding the need to hold the entire aggregation in memory. + + + + + + + +Consider the following example: + +```sql +CREATE TABLE pypi_v2 +( + `timestamp` DateTime, + `project` String +) +ENGINE = Null + +CREATE MATERIALIZED VIEW pypi_downloads_per_day_mv_v2 TO pypi_downloads_per_day +AS SELECT + toStartOfHour(timestamp) as hour, + project, + count() AS count +FROM pypi_v2 +GROUP BY + hour, + project +``` + +Here we create a Null table `pypi_v2` to recieve the rows which will be used to build our materialized view. Note how we limit the schema to only the columns we need. Our materialized view performs an aggregation over rows inserted into this table (block at a time), sending the results to our target table `pypi_downloads_per_day`. + +::note +We have used `pypi_downloads_per_day` as our target table here. For additional resilency users could create a duplicate table `pypi_downloads_per_day_v2` and use this as the target table of the view, as nshown in previous examples. On completion of the insert, partitions in `pypi_downloads_per_day_v2` could in turn be moved to `pypi_downloads_per_day`. This would allow recovery in the case our insert fails or experiences memory issues i.e. we just truncate `pypi_downloads_per_day_v2`, tune settings and retry. +::: + +To populate this materialized view we simply insert the relevant data to backfill into `pypi_v2` from `pypi`. + +```sql +INSERT INTO pypi_v2 SELECT timestamp, project FROM pypi WHERE timestamp < '2024-12-17 09:00:00' + +0 rows in set. Elapsed: 27.325 sec. Processed 1.50 billion rows, 33.48 GB (54.73 million rows/s., 1.23 GB/s.) +Peak memory usage: 639.47 MiB. + +``` + +Notice our memory usage here is `639.47 MiB`. + +##### Tuning performance & resources + +Several factors will determine the performance and resources used in the above scenario. We recommend understand insert mechanics documented in detail [here](/docs/en/integrations/s3/performance#using-threads-for-reads) prior to attempting to tune. In summary: + +- **Insert Parallelism** - The number of insert threads used to insert. Controlled through [`max_insert_threads`](). In ClickHouse Cloud this is determined by the instance size (between 2 and 4) and is set to 1 in OSS. Increasing this value may improve insert performance at the expense of greater memory usage. +- **Insert Block Size** - data is processed in a loop where it is pulled, parsed, and formed into in-memory insert blocks based on the [partitioning key](). These blocks are sorted, optimized, compressed, and written to storage as new [data parts](). The size of the insert block, controlled by settings [`min_insert_block_size_rows`]() and [`min_insert_block_size_bytes`](), impacts memory usage and disk I/O. Larger blocks use more memory but create fewer parts, reducing I/O and background merges. These settings represent minimum thresholds (whichever is reached first triggers a flush), with blocks rarely containing precisely the configured rows or bytes due to ClickHouse’s streaming and block-wise processing approach. + + + + ### No Timestamp or Monotonically increasing column @@ -403,21 +465,9 @@ Note: attach parition call above is () as no partitions -### Using Clickpipes - -pypi - -stop ingest - -1. CREATE MV on pypi -2. CREATE TABLE pypi_v2 AS pypi -3. EXCHANGE pypi_v2 AND pypi - -pypi_v2 has all the data. We attach the partitions from pypi_v2 to pypi. +### Improving backfill performance -Start ingest -backfill to From a78a8d1698435ffcbb9588513724cbc17a2f5605 Mon Sep 17 00:00:00 2001 From: Dale Mcdiarmid Date: Fri, 20 Dec 2024 15:08:16 +0000 Subject: [PATCH 06/10] guide --- docs/en/data-modeling/backfilling.md | 336 +++++++++++++----- .../en/data-modeling/images/null_table_mv.png | Bin 0 -> 184692 bytes 2 files changed, 245 insertions(+), 91 deletions(-) create mode 100644 docs/en/data-modeling/images/null_table_mv.png diff --git a/docs/en/data-modeling/backfilling.md b/docs/en/data-modeling/backfilling.md index d124fe12fe7..3efb7fdfc65 100644 --- a/docs/en/data-modeling/backfilling.md +++ b/docs/en/data-modeling/backfilling.md @@ -2,22 +2,22 @@ slug: /en/data-modeling/backfilling title: Backfilling Data description: How to use backfill large datasets in ClickHouse -keywords: [materialized views, backfilling, inserting data, resilent data load] +keywords: [materialized views, backfilling, inserting data, resilient data load] --- # Backfilling Data -Whether new to ClickHouse or responsible for an existing deployment, users will invariably need to backfill data. This task requires tables to be populated with historical data. In some cases, this is relatively simple but can become more complex when materialized views need to also be populated. This guide documents some techniques for this task that users can apply to their usecase. +Whether new to ClickHouse or responsible for an existing deployment, users will invariably need to backfill tables with historical data. In some cases, this is relatively simple but can become more complex when materialized views need to be populated. This guide documents some processes for this task that users can apply to their use case. -:::important -This guide assumes users are already familar with the concept of [Incremental Materialized Views]() and data loading using table functions such as [s3]() and [gcs](). We also recommend users read our guide on [optimizing insert performance from object storage](), the advice of which can be applied to inserts throughout this guide. +:::note +This guide assumes users are already familiar with the concept of [Incremental Materialized Views](/docs/en/materialized-view) and [data loading using table functions such as s3 and gcs](/docs/en/integrations/s3). We also recommend users read our guide on [optimizing insert performance from object storage](/docs/en/integrations/s3/performance), the advice of which can be applied to inserts throughout this guide. ::: ## Example dataset -Throughout this guide we use a PyPI dataset. Each row in this dataset represents a Python package download using a tool such as `pip`. +Throughout this guide, we use a PyPI dataset. Each row in this dataset represents a Python package download using a tool such as `pip`. -The subset used for example purposes covers a single day - `2024-12-17` and is available publically at `https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/`. For example, users can query with: +For example, the subset covers a single day - `2024-12-17` and is available publicly at `https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/`. Users can query with: ```sql SELECT count() @@ -31,12 +31,33 @@ FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12- Peak memory usage: 239.50 MiB. ``` -The full dataset for this bucket contains over `320GB` of parquet files. We thus intentionally target subsets using glob patterns in our examples below. +The full dataset for this bucket contains over 320 GB of parquet files. In the examples below, we intentionally target subsets using glob patterns. We assume the user is consuming a stream of this data e.g. from Kafka or object storage, for data after this date. The schema for this data is shown below: ```sql - +DESCRIBE TABLE s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12-17/*.parquet') +FORMAT PrettyCompactNoEscapesMonoBlock +SETTINGS describe_compact_output = 1 + +┌─name───────────────┬─type────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ timestamp │ Nullable(DateTime64(6)) │ +│ country_code │ Nullable(String) │ +│ url │ Nullable(String) │ +│ project │ Nullable(String) │ +│ file │ Tuple(filename Nullable(String), project Nullable(String), version Nullable(String), type Nullable(String)) │ +│ installer │ Tuple(name Nullable(String), version Nullable(String)) │ +│ python │ Nullable(String) │ +│ implementation │ Tuple(name Nullable(String), version Nullable(String)) │ +│ distro │ Tuple(name Nullable(String), version Nullable(String), id Nullable(String), libc Tuple(lib Nullable(String), version Nullable(String))) │ +│ system │ Tuple(name Nullable(String), release Nullable(String)) │ +│ cpu │ Nullable(String) │ +│ openssl_version │ Nullable(String) │ +│ setuptools_version │ Nullable(String) │ +│ rustc_version │ Nullable(String) │ +│ tls_protocol │ Nullable(String) │ +│ tls_cipher │ Nullable(String) │ +└────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` :::note @@ -45,20 +66,20 @@ The full PyPi dataset, consisting of over 1 trillion rows, is available in our p ## Backfilling scenarios -Backfilling is typically needed when a stream of data is being consumed from a point in time. This data is being inserted into ClickHouse tables with [incremental materialized views]() trigging on blocks as they are inserted. These views may be transforming the data prior to insert or computing aggregates and sending results to target tables for later use my downstream applications. +Backfilling is typically needed when a stream of data is being consumed from a point in time. This data is being inserted into ClickHouse tables with [incremental materialized views](/docs/en/materialized-view), trigging on blocks as they are inserted. These views may be transforming the data prior to insert or computing aggregates and sending results to target tables for later use my downstream applications. We will attempt to cover the following scenarios: -1. **Backfilling data with existing data ingestion** - Data is already inserting and historical data needs to be backfilled. This historical data has been identified. -2. **Adding materialized views to existing tables** - New materialized views need to be added to a setup for which historical data has been populated and data is already streaming. A timestamp, or montonotically increasing column, which can be used to identify a point in the stream is useful here and avoids pauses in data ingestion. +1. **Backfilling data with existing data ingestion** - New data is being loaded, and historical data needs to be backfilled. This historical data has been identified. +2. **Adding materialized views to existing tables** - New materialized views need to be added to a setup for which historical data has been populated and data is already streaming. -We assume data will be backfilled from object storage. In all cases we aim to avoid pauses in data insertion. +We assume data will be backfilled from object storage. In all cases, we aim to avoid pauses in data insertion. -We recommend backfilling historical data from object storage. While data should be exported to Parquet where possible for optimal read performance and compression (reduced network transfer), with a file size of around 150MB typically prefered, ClickHouse supports over [70 file formats](). +We recommend backfilling historical data from object storage. Data should be exported to Parquet where possible for optimal read performance and compression (reduced network transfer). A file size of around 150MB is typically preferred, but ClickHouse supports over [70 file formats](/docs/en/interfaces/formats) and is capable of handling files of all sizes. ## Using duplicate tables and views -For all of the scenarios we rely on the the concept of a "duplicate tables and views". These tables and views represent copies of those used for the live streaming data, and allow the backfill to be performed in isolation with an easy means of recovery should failure occur. For example, we have the following main `pypi` table and materialized view which computes the number of downloads per python project: +For all of the scenarios, we rely on the concept of "duplicate tables and views". These tables and views represent copies of those used for the live streaming data and allow the backfill to be performed in isolation with an easy means of recovery should failure occur. For example, we have the following main `pypi` table and materialized view, which computes the number of downloads per Python project: ```sql CREATE TABLE pypi @@ -85,13 +106,13 @@ ORDER BY project CREATE MATERIALIZED VIEW pypi_downloads_mv TO pypi_downloads AS SELECT - project, + project, count() AS count FROM pypi GROUP BY project ``` -We populate the main table, and associated view, with a subset of the data: +We populate the main table and associated view with a subset of the data: ```sql INSERT INTO pypi SELECT * @@ -120,11 +141,11 @@ FROM pypi_downloads Peak memory usage: 682.38 KiB. ``` -Now suppose we wish to load another subset `{101..200}`. While we could insert directly into `pypi`, we can do this backfill in isolation by creating duplicate tables. +Suppose we wish to load another subset `{101..200}`. While we could insert directly into `pypi`, we can do this backfill in isolation by creating duplicate tables. -Should the backfill fail, we have not impacted our main tables and can simply [truncate]() our duplicates tables and repeat. +Should the backfill fail, we have not impacted our main tables and can simply [truncate](/docs/en/managing-data/truncate) our duplicate tables and repeat. -To create new copies of these views we can use the `CREATE TABLE AS` clause with the suffix `_v2`: +To create new copies of these views, we can use the `CREATE TABLE AS` clause with the suffix `_v2`: ```sql CREATE TABLE pypi_v2 AS pypi @@ -133,13 +154,13 @@ CREATE TABLE pypi_downloads_v2 AS pypi_downloads CREATE MATERIALIZED VIEW pypi_downloads_mv_v2 TO pypi_downloads_v2 AS SELECT - project, + project, count() AS count FROM pypi_v2 GROUP BY project ``` -We populate this with our 2nd subset of approximately the same size, and confirm the successful load. +We populate this with our 2nd subset of approximately the same size and confirm the successful load. ```sql INSERT INTO pypi_v2 SELECT * @@ -168,22 +189,26 @@ FROM pypi_downloads_v2 Peak memory usage: 688.77 KiB. ``` -If at any point during this 2nd load we experienced a failure we could simply [truncate]() our `pypi_v2` and `pypi_downloads_v2` and repeat the data load. +If we experienced a failure at any point during this second load, we could simply [truncate](/docs/en/managing-data/truncate) our `pypi_v2` and `pypi_downloads_v2` and repeat the data load. -With our data load complete, we can move the data from our duplicate tables to the main tables using the `ALTER TABLE MOVE PARTITION` clause. +With our data load complete, we can move the data from our duplicate tables to the main tables using the [`ALTER TABLE MOVE PARTITION`](docs/en/sql-reference/statements/alter/partition#move-partition-to-table) clause. ```sql ALTER TABLE pypi - (MOVE PARTITION () FROM pypi_v2) + (MOVE PARTITION () FROM pypi_v2) 0 rows in set. Elapsed: 1.401 sec. ALTER TABLE pypi_downloads - (MOVE PARTITION () FROM pypi_downloads_v2) + (MOVE PARTITION () FROM pypi_downloads_v2) 0 rows in set. Elapsed: 0.389 sec. ``` +:::note Partition names +The above `MOVE PARTITION` call uses the partition name `()`. This represents the single partition for this table (which isn't partitioned). For tables that are partitioned, users will need to invoke multiple `MOVE PARTITION` calls - one for each partition. The name of the current partitions can be established from the [`system.parts`](/docs/en/operations/system-tables/parts) table e.g. `SELECT DISTINCT partition FROM system.parts WHERE (table = 'pypi_v2')`. +::: + We can now confirm `pypi` and `pypi_downloads` contain the complete data. `pypi_downloads_v2` and `pypi_v2` can be safely dropped. ```sql @@ -209,13 +234,13 @@ SELECT count() FROM pypi_v2 ``` -Importantly, the `MOVE PARTITION` operation is both lightweight (exploiting hardlinks) and is atomic i.e. it either fails or succeeds with no intermediate state. +Importantly, the `MOVE PARTITION` operation is both lightweight (exploiting hard links) and atomic, i.e. it either fails or succeeds with no intermediate state. We exploit this process heavily in our backfilling scenarios below. -This process requires users to choose the size of each insert operation. +Notice how this process requires users to choose the size of each insert operation. -Larger inserts i.e. more rows, will mean less `MOVE PARTITION` operations are required. However, this must be balanced against the cost in the event of an insert failure e.g. due to network interruption, to recover. Users can complement this process with batching for files to reduce the risk. This can be performed with either range queries e.g. `WHERE timestamp BETWEEN 2024-12-17 09:00:00 AND 2024-12-17 10:00:00` or glob patterns. For example, +Larger inserts i.e. more rows, will mean fewer `MOVE PARTITION` operations are required. However, this must be balanced against the cost in the event of an insert failure e.g. due to network interruption, to recover. Users can complement this process with batching files to reduce the risk. This can be performed with either range queries e.g. `WHERE timestamp BETWEEN 2024-12-17 09:00:00 AND 2024-12-17 10:00:00` or glob patterns. For example, ```sql INSERT INTO pypi_v2 SELECT * @@ -228,14 +253,22 @@ FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/2024-12- ``` :::note -ClickPipes uses this approach when loading data from object storage, automatically creating duplicates of the target table and its materialized views, and avoiding the need for the user to perform the above steps. By also using multiple workers (each with their own duplicates), data can be loaded quickly with exactly-once semantic. For those interested, further details can be found [in this blog](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part3). +ClickPipes uses this approach when loading data from object storage, automatically creating duplicates of the target table and its materialized views and avoiding the need for the user to perform the above steps. By also using multiple worker threads, each handling different subsets (via glob patterns) and with its own duplicate tables, data can be loaded quickly with exactly-once semantics. For those interested, further details can be found [in this blog](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part3). ::: ## Scenario 1: Backfilling data with existing data ingestion In this scenario, we assume that the data to backfill is not in an isolated bucket and thus filtering is required. Data is already inserting and a timestamp or montonotically increasing column can be identified from which historical data needs to be backfilled. -For example, in our PyPI data suppose we have data loaded. We can identify the minimum timestamp, and thus our "checkpoint". +This process follows the following steps: + +1. Identify the checkpoint - either a timestamp or column value from which historical data needs to be restored. +2. Create duplicates of the main table and target tables for materialized views. +3. Create copies of any materialized views pointing to the target tables created in step (2). +4. Insert into our duplicate main table created in step (2). +5. Move all partitions from the duplicate tables to their original versions. Drop duplicate tables. + +For example, in our PyPI data suppose we have data loaded. We can identify the minimum timestamp and, thus, our "checkpoint". ```sql SELECT min(timestamp) @@ -257,9 +290,7 @@ CREATE TABLE pypi_v2 AS pypi CREATE TABLE pypi_downloads_v2 AS pypi_downloads CREATE MATERIALIZED VIEW pypi_downloads_mv_v2 TO pypi_downloads_v2 -AS SELECT - project, - count() AS count +AS SELECT project, count() AS count FROM pypi_v2 GROUP BY project @@ -269,7 +300,6 @@ WHERE timestamp < '2024-12-17 09:00:00' 0 rows in set. Elapsed: 500.152 sec. Processed 2.74 billion rows, 364.40 GB (5.47 million rows/s., 728.59 MB/s.) ``` - :::note Filtering on timestamp columns in Parquet can be very efficient. ClickHouse will only read the timestamp column to identify the full data ranges to load, minimizing network traffic. Parquet inndices, such as min-max, can also be exploited by the ClickHouse query engine. ::: @@ -278,33 +308,38 @@ Once this insert is complete, we can move the associated partitions. ```sql ALTER TABLE pypi - (MOVE PARTITION () FROM pypi_v2) + (MOVE PARTITION () FROM pypi_v2) ALTER TABLE pypi_downloads - (MOVE PARTITION () FROM pypi_downloads_v2) + (MOVE PARTITION () FROM pypi_downloads_v2) ``` +If the historical data is an isolated bucket, the above time filter is not required. If a time or monotonic column is unavailable, isolate your historical data. -If the historical data is an isolated bucket the above time filter is not required. - -:::important Use ClickPipes in ClickHouse Cloud +:::note Just use ClickPipes in ClickHouse Cloud ClickHouse Cloud users should use ClickPipes for restoring historical backups if the data can be isolated in its own bucket (and a filter is not required). As well as parallelizing the load with multiple workers, thus reducing the load time, ClickPipes automates the above process - creating duplicate tables for both the main table and materialized views. ::: ## Scenario 2: Adding materialized views to existing tables -It is not uncommon, that new materialized views need to be added to a setup for which significant data has been populated and data is being inserted. A timestamp, or montonotically increasing column, which can be used to identify a point in the stream is useful here and avoids pauses in data ingestion. We assume both cases in the examples below, prefering approaches which avoid pauses in ingestion. +It is not uncommon for new materialized views to need to be added to a setup for which significant data has been populated and data is being inserted. A timestamp or monotonically increasing column, which can be used to identify a point in the stream, is useful here and avoids pauses in data ingestion. In the examples below, we assume both cases, preferring approaches that avoid pauses in ingestion. -:::important Avoid POPULATE -We do not recommend using the [`POPULATE`]() command for backfilling materialized views for anything other than small datasets where ingest is paused. This operator can misses rows inserted into its source table, with the materialized view -created after the populate hash finished. Furthermore this, populate runs against all data and is vulnerable to interruptions or memory limits on large datasets. +:::note Avoid POPULATE +We do not recommend using the [`POPULATE`](/docs/en/sql-reference/statements/create/view#materialized-view) command for backfilling materialized views for anything other than small datasets where ingest is paused. This operator can miss rows inserted into its source table, with the materialized view created after the populate hash is finished. Furthermore, this populate runs against all data and is vulnerable to interruptions or memory limits on large datasets. ::: ### Timestamp or Monotonically increasing column available -In this case, we recommend the new materialized view include a filter which restricts rows to those greater than an arbitary data in the future. The materialized view can subsequently be backfilled from this date using historical data from the main table. The approach used for backfilling depends on the size of the data and complexity of the associated query. +In this case, we recommend the new materialized view include a filter that restricts rows to those greater than arbitrary data in the future. The materialized view can subsequently be backfilled from this date using historical data from the main table. The backfilling approach depends on the data's size and the complexity of the associated query. + +Our simplest approach involves the following steps: + +1. Create our materialized view with a filter that only considers rows greater than an arbitrary time in the near future. +2. Run an `INSERT INTO SELECT` query which inserts into our materialized view's target table, reading from the source table with the views aggregation query. + +This can be further enhanced to target subsets of data in step (2) and/or use a duplicate target table for the materialized view (attach partitions to the original once the insert is complete) for easier recovery after failure. -Consider the following materialized view which computes the most popular projects by per hour. +Consider the following materialized view, which computes the most popular projects per hour. ```sql CREATE TABLE pypi_downloads_per_day @@ -319,13 +354,13 @@ ORDER BY (project, hour) CREATE MATERIALIZED VIEW pypi_downloads_per_day_mv TO pypi_downloads_per_day AS SELECT - toStartOfHour(timestamp) as hour, - project, + toStartOfHour(timestamp) as hour, + project, count() AS count FROM pypi GROUP BY hour, - project + project ``` While we can add the target table, prior to adding the materialized view we modify its `SELECT` clause to include a filer which only considers rows greater than an arbitary time in the near future - in this case we assume `2024-12-17 09:00:00` is a few minutes in the future. @@ -333,29 +368,26 @@ While we can add the target table, prior to adding the materialized view we modi ```sql CREATE MATERIALIZED VIEW pypi_downloads_per_day_mv TO pypi_downloads_per_day AS SELECT - toStartOfHour(timestamp) as hour, - project, - count() AS count + toStartOfHour(timestamp) as hour, + project, count() AS count FROM pypi WHERE timestamp < '2024-12-17 09:00:00' -GROUP BY - hour, - project +GROUP BY hour, project ``` Once this view is added, we can backfill all data for the materialized view prior to this data. -The simplest means of doing this is to simple run the query from the materialized view on the main table with a filter which ignores recently added data, inserting the results into our view's target table via an `INSERT INTO SELECT`. For example for the above view: +The simplest means of doing this is to simply run the query from the materialized view on the main table with a filter that ignores recently added data, inserting the results into our view's target table via an `INSERT INTO SELECT`. For example, for the above view: ```sql INSERT INTO pypi_downloads_per_day SELECT - toStartOfHour(timestamp) AS hour, - project, + toStartOfHour(timestamp) AS hour, + project, count() AS count FROM pypi WHERE timestamp < '2024-12-17 09:00:00' GROUP BY hour, - project + project Ok. @@ -363,35 +395,35 @@ Ok. Peak memory usage: 543.71 MiB. ``` -In our case this is relatively lightweight aggregation which completes in under `3s` and uses less than `600MiB` of memory. For more complex or longer running aggregations, users can make this more resilent by using the earlier duplicate table approach i.e. create a shadow target table e.g. `pypi_downloads_per_day_v2`, insert into this and attach its resulting partitions to `pypi_downloads_per_day`. +:::note +In the above example our target table is a [SummingMergeTree](/docs/en/engines/table-engines/mergetree-family/summingmergetree). In this case we can simply use our original aggregation query. For more complex usecases which exploit the [AggregatingMergeTree](/docs/en/engines/table-engines/mergetree-family/aggregatingmergetree), users will use `-State` functions for the aggregates. An example of this can be found [here](/docs/en/integrations/s3/performance#be-aware-of-merges). +::: + +In our case, this is a relatively lightweight aggregation that completes in under 3s and uses less than 600MiB of memory. For more complex or longer-running aggregations, users can make this process more resilient by using the earlier duplicate table approach i.e. create a shadow target table, e.g., `pypi_downloads_per_day_v2`, insert into this, and attach its resulting partitions to `pypi_downloads_per_day`. Often materialized view's query can be more complex (not uncommon as otherwise users wouldn't use a view!) and consume resources. In rarer cases, the resources for the query are beyond that of the server. This highlights one of the advanages of ClickHouse materialized views - they are incremental and don't process the entire dataset in one go! -In this case users have several options: +In this case, users have several options: 1. Modify your query to backfill ranges e.g. `WHERE timestamp BETWEEN 2024-12-17 08:00:00 AND 2024-12-17 09:00:00`, `WHERE timestamp BETWEEN 2024-12-17 07:00:00 AND 2024-12-17 08:00:00` etc. -2. Use settings to limit memory for the query and spill aggregations (or sorts) to disk. Disk can still be exhausted and queries can still timeout, so this has limitations. For example, in ClickHouse Cloud, local storage is for caching and overspill but is often significantly smaller than full datasets held in object storage. -3. Use a [Null table engine]() to fill the materialized view. This replicates the typical incremental population of a materialized view, executing it's query over blocks of data (of configurable size). +2. Use a [Null table engine](/docs/en/engines/table-engines/special/null) to fill the materialized view. This replicates the typical incremental population of a materialized view, executing it's query over blocks of data (of configurable size). (1) represents the simplest approach is often sufficient. We do not include examples for brevity. -(2) and (3) are further explained below. - -#### Limiting memory of GROUP/ORDER BY - +We explore (2) further below. #### Using a Null table engine for filling materialized views -The [Null table engine]() provides a storage engine which doesn't persist data (think of it as the `/dev/null` of the table engine world). While this seems contradictory, materialized views will still execute on data inserted into this table engine. This allows materialized views to be constructed without persisting the original data - avoiding I/O and the associated storage. - +The [Null table engine](/docs/en/engines/table-engines/special/null) provides a storage engine which doesn't persist data (think of it as the `/dev/null` of the table engine world). While this seems contradictory, materialized views will still execute on data inserted into this table engine. This allows materialized views to be constructed without persisting the original data - avoiding I/O and the associated storage. Importantly, any materialized views attached to the table engine still execute over blocks of data as its inserted - sending their results to a target table. These blocks are of a configurable size. While larger blocks can potentially be more efficient (and faster to process), they consume more resources (principally memory). Use of this table engine means we can build our materialized view incrementally i.e. a block at a time, avoiding the need to hold the entire aggregation in memory. +Denormalization in ClickHouse - - - - +
Consider the following example: @@ -405,69 +437,191 @@ ENGINE = Null CREATE MATERIALIZED VIEW pypi_downloads_per_day_mv_v2 TO pypi_downloads_per_day AS SELECT - toStartOfHour(timestamp) as hour, - project, + toStartOfHour(timestamp) as hour, + project, count() AS count FROM pypi_v2 GROUP BY hour, - project + project ``` -Here we create a Null table `pypi_v2` to recieve the rows which will be used to build our materialized view. Note how we limit the schema to only the columns we need. Our materialized view performs an aggregation over rows inserted into this table (block at a time), sending the results to our target table `pypi_downloads_per_day`. +Here, we create a Null table, `pypi_v2,` to receive the rows that will be used to build our materialized view. Note how we limit the schema to only the columns we need. Our materialized view performs an aggregation over rows inserted into this table (one block at a time), sending the results to our target table, `pypi_downloads_per_day`. ::note -We have used `pypi_downloads_per_day` as our target table here. For additional resilency users could create a duplicate table `pypi_downloads_per_day_v2` and use this as the target table of the view, as nshown in previous examples. On completion of the insert, partitions in `pypi_downloads_per_day_v2` could in turn be moved to `pypi_downloads_per_day`. This would allow recovery in the case our insert fails or experiences memory issues i.e. we just truncate `pypi_downloads_per_day_v2`, tune settings and retry. +We have used `pypi_downloads_per_day` as our target table here. For additional resiliency, users could create a duplicate table, `pypi_downloads_per_day_v2`, and use this as the target table of the view, as shown in previous examples. On completion of the insert, partitions in `pypi_downloads_per_day_v2` could, in turn, be moved to `pypi_downloads_per_day.` This would allow recovery in the case our insert fails due to memory issues or server interruptions i.e. we just truncate `pypi_downloads_per_day_v2`, tune settings, and retry. ::: -To populate this materialized view we simply insert the relevant data to backfill into `pypi_v2` from `pypi`. +To populate this materialized view, we simply insert the relevant data to backfill into `pypi_v2` from `pypi.` ```sql INSERT INTO pypi_v2 SELECT timestamp, project FROM pypi WHERE timestamp < '2024-12-17 09:00:00' 0 rows in set. Elapsed: 27.325 sec. Processed 1.50 billion rows, 33.48 GB (54.73 million rows/s., 1.23 GB/s.) Peak memory usage: 639.47 MiB. - ``` Notice our memory usage here is `639.47 MiB`. ##### Tuning performance & resources -Several factors will determine the performance and resources used in the above scenario. We recommend understand insert mechanics documented in detail [here](/docs/en/integrations/s3/performance#using-threads-for-reads) prior to attempting to tune. In summary: +Several factors will determine the performance and resources used in the above scenario. We recommend readers understand insert mechanics documented in detail [here](/docs/en/integrations/s3/performance#using-threads-for-reads) prior to attempting to tune. In summary: -- **Insert Parallelism** - The number of insert threads used to insert. Controlled through [`max_insert_threads`](). In ClickHouse Cloud this is determined by the instance size (between 2 and 4) and is set to 1 in OSS. Increasing this value may improve insert performance at the expense of greater memory usage. -- **Insert Block Size** - data is processed in a loop where it is pulled, parsed, and formed into in-memory insert blocks based on the [partitioning key](). These blocks are sorted, optimized, compressed, and written to storage as new [data parts](). The size of the insert block, controlled by settings [`min_insert_block_size_rows`]() and [`min_insert_block_size_bytes`](), impacts memory usage and disk I/O. Larger blocks use more memory but create fewer parts, reducing I/O and background merges. These settings represent minimum thresholds (whichever is reached first triggers a flush), with blocks rarely containing precisely the configured rows or bytes due to ClickHouse’s streaming and block-wise processing approach. +- **Read Parallelism** - The number of threads used to read. Controlled through [`max_threads`](/docs/en/operations/settings/settings#max_threads). In ClickHouse Cloud this is determined by the instance size with it defaulting to the number of vCPUs. Increasing this value may improve read performance at the expense of greater memory usage. +- **Insert Parallelism** - The number of insert threads used to insert. Controlled through [`max_insert_threads`](/docs/en/operations/settings/settings#max_insert_threads). In ClickHouse Cloud this is determined by the instance size (between 2 and 4) and is set to 1 in OSS. Increasing this value may improve performance at the expense of greater memory usage. +- **Insert Block Size** - data is processed in a loop where it is pulled, parsed, and formed into in-memory insert blocks based on the [partitioning key](/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key). These blocks are sorted, optimized, compressed, and written to storage as new [data parts](/docs/en/parts). The size of the insert block, controlled by settings [`min_insert_block_size_rows`](/docs/en/operations/settings/settings#min_insert_block_size_rows) and [`min_insert_block_size_bytes`](/docs/en/operations/settings/settings#min_insert_block_size_bytes) (uncompressed), impacts memory usage and disk I/O. Larger blocks use more memory but create fewer parts, reducing I/O and background merges. These settings represent minimum thresholds (whichever is reached first triggers a flush). +- **Materialized view block size** - As well as the above mechanics for the main insert, prior to insertion into materialized views, blocks are also squashed for more efficient processing. The size of these blocks is determined by the settings [`min_insert_block_size_bytes_for_materialized_views`](/docs/en/operations/settings/settings#min_insert_block_size_bytes_for_materialized_views) and [`min_insert_block_size_rows_for_materialized_views`](/docs/en/operations/settings/settings#min_insert_block_size_rows_for_materialized_views). Larger blocks allow more efficient processing at the expense of greater memory usage. By default, these settings revert to the values of the source table settings [`min_insert_block_size_rows`](/docs/en/operations/settings/settings#min_insert_block_size_rows) and [`min_insert_block_size_bytes`](/docs/en/operations/settings/settings#min_insert_block_size_bytes), respectively. +For improving performance, users can follow the guidelines outlined [here](/docs/en/integrations/s3/performance#tuning-threads-and-block-size-for-inserts). It should not be neccessary to also modify `min_insert_block_size_bytes_for_materialized_views` and `min_insert_block_size_rows_for_materialized_views` to improve performance in most cases. If these are modified, use the same best practices as discussed for `min_insert_block_size_rows` and `min_insert_block_size_bytes`. +To minimize memory, users may wish to experiment with these settings. This will invariably lower performance. Using the earlier query, we show examples below. +Lowering `max_insert_threads` to 1 reduces our memory overhead. -### No Timestamp or Monotonically increasing column +```sql +INSERT INTO pypi_v2 +SELECT + timestamp, + project +FROM pypi +WHERE timestamp < '2024-12-17 09:00:00' +SETTINGS max_insert_threads = 1 +0 rows in set. Elapsed: 27.752 sec. Processed 1.50 billion rows, 33.48 GB (53.89 million rows/s., 1.21 GB/s.) +Peak memory usage: 506.78 MiB. +``` +We can lower memory further by reducing our `max_threads` setting to 1. +```sql +INSERT INTO pypi_v2 +SELECT timestamp, project +FROM pypi +WHERE timestamp < '2024-12-17 09:00:00' +SETTINGS max_insert_threads = 1, max_threads = 1 -Ideally users can identify a point in time or montonotically increasing column, which can be used to establish a consistent point in the stream. +Ok. -Identifiy a time value or monotonically increasing id. Add new materialized views such that it only applies to values > this id or time value. +0 rows in set. Elapsed: 43.907 sec. Processed 1.50 billion rows, 33.48 GB (34.06 million rows/s., 762.54 MB/s.) +Peak memory usage: 272.53 MiB. +``` +Finally, we can reduce memory further by setting `min_insert_block_size_rows` to 0 (disables it as a deciding factor on block size) and `min_insert_block_size_bytes` to 10485760 (10MiB). -Either: +```sql +INSERT INTO pypi_v2 +SELECT + timestamp, + project +FROM pypi +WHERE timestamp < '2024-12-17 09:00:00' +SETTINGS max_insert_threads = 1, max_threads = 1, min_insert_block_size_rows = 0, min_insert_block_size_bytes = 10485760 -1. create a shadown of the target materialized view. Populate with a query - INSERT INTO SELCT. This can be memory hungry. Can spool to disk but still risky. -2. Do in batches (1) -3. Create a null table engine of the main table. create a shadown of the target mv - trigger off null table. Insert into the data. ATTACH partitions to real mv target table. Drop the mv and null table. Control memory with settings. +0 rows in set. Elapsed: 43.293 sec. Processed 1.50 billion rows, 33.48 GB (34.54 million rows/s., 773.36 MB/s.) +Peak memory usage: 218.64 MiB. +``` + +Finally, be aware that lowering block sizes produces more parts and causes greater merge pressure. As discussed [here](/docs/en/integrations/s3/performance#be-aware-of-merges), these settings should be changed cautiously. + +### No timestamp or monotonically increasing column +The above processes rely on the user have a timestamp or monotonically increasing column. In some cases this is simply not available. In this case, we recommend the following process, which exploits many of the steps outlined previously but requires users to pause ingest. +1. Pause inserts into your main table. +2. Create a duplicate of your main target table using the `CREATE AS` syntax. +3. Attach partitions from the original target table to the duplicate using [`ALTER TABLE ATTACH`](/docs/en/sql-reference/statements/alter/partition#attach-partitionpart). **Note:** This attach operation is different than the earlier used move. While relying on hard links, the data in the original table is preserved. +4. Create new materialized views. +5. Restart inserts. **Note:** Inserts will only update the target table, and not the duplicate, which will reference only the original data. +6. Backfill the materialized view, applying the same process used above for data with timestamps, using the duplicate table as the source. +Consider the following example using PyPi and our previous new materialized view `pypi_downloads_per_day` (we'll assume we can't use the timestamp): -Note: attach parition call above is () as no partitions +```sql +SELECT count() FROM pypi +┌────count()─┐ +│ 2039988137 │ -- 2.04 billion +└────────────┘ +1 row in set. Elapsed: 0.003 sec. -### Improving backfill performance +-- (1) Pause inserts +-- (2) Create a duplicate of our target table +CREATE TABLE pypi_v2 AS pypi +SELECT count() FROM pypi_v2 +┌────count()─┐ +│ 2039988137 │ -- 2.04 billion +└────────────┘ + +1 row in set. Elapsed: 0.004 sec. + +-- (3) Attach partitions from the original target table to the duplicate. + +ALTER TABLE pypi_v2 + (ATTACH PARTITION tuple() FROM pypi) + +-- (4) Create our new materialized views + +CREATE TABLE pypi_downloads_per_day +( + `hour` DateTime, + `project` String, + `count` Int64 +) +ENGINE = SummingMergeTree +ORDER BY (project, hour) + + +CREATE MATERIALIZED VIEW pypi_downloads_per_day_mv TO pypi_downloads_per_day +AS SELECT + toStartOfHour(timestamp) as hour, + project, + count() AS count +FROM pypi +GROUP BY + hour, + project + +-- (4) Restart inserts. We replicate here by inserting a single row. + +INSERT INTO pypi SELECT * +FROM pypi +LIMIT 1 + +SELECT count() FROM pypi + +┌────count()─┐ +│ 2039988138 │ -- 2.04 billion +└────────────┘ + +1 row in set. Elapsed: 0.003 sec. + +-- notice how pypi_v2 contains same number of rows as before + +SELECT count() FROM pypi_v2 +┌────count()─┐ +│ 2039988137 │ -- 2.04 billion +└────────────┘ + +-- (5) Backfill the view using the backup pypi_v2 + +INSERT INTO pypi_downloads_per_day SELECT + toStartOfHour(timestamp) as hour, + project, + count() AS count +FROM pypi_v2 +GROUP BY + hour, + project + +0 rows in set. Elapsed: 3.719 sec. Processed 2.04 billion rows, 47.15 GB (548.57 million rows/s., 12.68 GB/s.) + +DROP TABLE pypi_v2; +``` +In the penultimate step we backfill `pypi_downloads_per_day` using our simple `INSERT INTO SELECT` approach described [earlier](#timestamp-or-monotonically-increasing-column-available). This can also be enhanced using the Null table approach documented [above](#using-a-null-table-engine-for-filling-materialized-views), with the optional use of a duplicate table for more resiliency. +While this operation does require inserts to be paused, the intermediate operations can typically be completed quickly - minimizing any data interruption. diff --git a/docs/en/data-modeling/images/null_table_mv.png b/docs/en/data-modeling/images/null_table_mv.png new file mode 100644 index 0000000000000000000000000000000000000000..51d41d422337b2bbaf5f81c7916c9a8679918734 GIT binary patch literal 184692 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 Date: Fri, 20 Dec 2024 15:08:53 +0000 Subject: [PATCH 07/10] add to sidebar --- sidebars.js | 1 + 1 file changed, 1 insertion(+) diff --git a/sidebars.js b/sidebars.js index b56b3cb5492..829defb50ec 100644 --- a/sidebars.js +++ b/sidebars.js @@ -965,6 +965,7 @@ const sidebars = { ], }, "en/data-modeling/denormalization", + "en/data-modeling/backfilling", ], }, { From 70163bcec62a37b173717fc2f4dea330d383e407 Mon Sep 17 00:00:00 2001 From: Dale Mcdiarmid Date: Fri, 20 Dec 2024 15:22:09 +0000 Subject: [PATCH 08/10] fix link --- docs/en/data-modeling/backfilling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/data-modeling/backfilling.md b/docs/en/data-modeling/backfilling.md index 3efb7fdfc65..3f5f14423f3 100644 --- a/docs/en/data-modeling/backfilling.md +++ b/docs/en/data-modeling/backfilling.md @@ -191,7 +191,7 @@ Peak memory usage: 688.77 KiB. If we experienced a failure at any point during this second load, we could simply [truncate](/docs/en/managing-data/truncate) our `pypi_v2` and `pypi_downloads_v2` and repeat the data load. -With our data load complete, we can move the data from our duplicate tables to the main tables using the [`ALTER TABLE MOVE PARTITION`](docs/en/sql-reference/statements/alter/partition#move-partition-to-table) clause. +With our data load complete, we can move the data from our duplicate tables to the main tables using the [`ALTER TABLE MOVE PARTITION`](/docs/en/sql-reference/statements/alter/partition#move-partition-to-table) clause. ```sql ALTER TABLE pypi From 292f554fe17e5f2c8b25d6dc57820ac6fa7c540f Mon Sep 17 00:00:00 2001 From: Tom Schreiber <97666923+tom-clickhouse@users.noreply.github.com> Date: Fri, 20 Dec 2024 15:44:33 +0000 Subject: [PATCH 09/10] Update backfilling.md --- docs/en/data-modeling/backfilling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/data-modeling/backfilling.md b/docs/en/data-modeling/backfilling.md index 3f5f14423f3..54d1e453d2f 100644 --- a/docs/en/data-modeling/backfilling.md +++ b/docs/en/data-modeling/backfilling.md @@ -66,7 +66,7 @@ The full PyPi dataset, consisting of over 1 trillion rows, is available in our p ## Backfilling scenarios -Backfilling is typically needed when a stream of data is being consumed from a point in time. This data is being inserted into ClickHouse tables with [incremental materialized views](/docs/en/materialized-view), trigging on blocks as they are inserted. These views may be transforming the data prior to insert or computing aggregates and sending results to target tables for later use my downstream applications. +Backfilling is typically needed when a stream of data is being consumed from a point in time. This data is being inserted into ClickHouse tables with [incremental materialized views](/docs/en/materialized-view), trigging on blocks as they are inserted. These views may be transforming the data prior to insert or computing aggregates and sending results to target tables for later use in downstream applications. We will attempt to cover the following scenarios: From 6725289518fb423de8b5ed0f95bf0dbdfde75713 Mon Sep 17 00:00:00 2001 From: Dale McDiarmid Date: Sat, 21 Dec 2024 18:04:40 +0000 Subject: [PATCH 10/10] fix >= --- docs/en/data-modeling/backfilling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/data-modeling/backfilling.md b/docs/en/data-modeling/backfilling.md index 54d1e453d2f..1f99136ce35 100644 --- a/docs/en/data-modeling/backfilling.md +++ b/docs/en/data-modeling/backfilling.md @@ -370,7 +370,7 @@ CREATE MATERIALIZED VIEW pypi_downloads_per_day_mv TO pypi_downloads_per_day AS SELECT toStartOfHour(timestamp) as hour, project, count() AS count -FROM pypi WHERE timestamp < '2024-12-17 09:00:00' +FROM pypi WHERE timestamp >= '2024-12-17 09:00:00' GROUP BY hour, project ```