返回文章列表

Amazon Redshift 資料倉儲效能最佳化實踐

本文探討 Amazon Redshift 資料倉儲的效能最佳化策略,涵蓋資料型別選擇、資料載入最佳實踐、表格型別最佳化、CDC 操作、資料快取、資料移動以及 UNLOAD 和 COPY 命令的使用。文章提供程式碼範例和最佳實踐,幫助讀者設計高效能的 Redshift 資料倉儲。

資料函式庫 雲端服務

Amazon Redshift 作為雲端資料倉儲方案,效能調校至關重要。資料型別選擇影響儲存空間和查詢效率,例如使用最小整數型別和精確控制小數位數。COPY 命令能高效載入資料,搭配分割檔案和合適格式能最大化平行處理。外部表格讓 Redshift 直接查詢 S3 資料湖,避免資料複製。暫存表格則適用於更新和插入資料,提升效能並避免備份幹擾。SUPER 資料型別支援半結構化資料,簡化資料處理。物化檢視預先計算查詢結果,提升 BI 工具查詢速度。UNLOAD 命令能將資料匯出至 S3,HLLSKETCH 有效估計唯一值數量。善用這些技巧,能有效提升 Redshift 資料倉儲效能。

在 Amazon Redshift 中設計高效能的資料倉儲:資料型別的最佳實踐

在設計高效能的資料倉儲時,選擇適當的資料型別是至關重要的。Amazon Redshift 提供了多種資料型別,以支援不同的資料儲存需求。本文將探討 Redshift 中的主要資料型別,並提供最佳實踐建議。

字串資料型別的最佳實踐

在 Redshift 中,字串資料型別包括 CHARVARCHARBPCHAR。為了獲得最佳效能,AWS 建議使用盡可能小的欄位大小,而不是為了方便而提供一個非常大的值。使用不必要的大長度可能會對複雜查詢的效能產生影響。然而,如果指定的值太小,查詢可能會因為插入的資料超過指定的長度而失敗。因此,在定義欄位時,應考慮可能的最大潛在值。

數值型別的選擇與最佳實踐

Redshift 中的數值型別包括整數、小數和浮點數。以下是主要的數值型別:

整數型別

整數型別用於儲存整數,根據需要儲存的整數大小,有以下幾種選擇:

  • SMALLINT/INT2:範圍為 -32,768 至 +32,767。
  • INTEGER/INT/INT4:範圍為 -2,147,483,648 至 +2,147,483,647。
  • BIGINT/INT8:範圍為 -9,223,372,036,854,775,808 至 +9,223,372,036,854,775,807。

應始終使用能夠儲存所有預期值的最小整數型別。例如,如果儲存的是人的年齡,應使用 SMALLINT;如果儲存的是產品庫存數量,預期會有數十萬到數百萬單位,應使用 INTEGER 型別。

小數型別

DECIMAL 型別允許指定所需的精確度和小數位數。精確度表示小數點兩側的總位數,而小數位數表示小數點右側的位數。定義欄位時,使用 DECIMAL(precision, scale) 來指定。例如,定義一個 DECIMAL(7,3) 的欄位,可以儲存 -9999.999 至 +9999.999 之間的值。DECIMAL 型別適用於需要完全控制計算結果精確度的情況。

浮點數型別

浮點數型別用於儲存具有可變精確度的值。浮點數型別被視為非精確型別,這意味著在儲存和讀取特定值時可能會注意到輕微的差異,因為某些值是以近似值儲存的。如果需要確保精確的計算,應使用 DECIMAL 型別。

Redshift 支援兩種浮點數型別:

  • REAL/FLOAT4:支援最多 6 位數字的精確度。
  • DOUBLE PRECISION/FLOAT8/FLOAT:支援最多 15 位數字的精確度。

當插入的值超過該型別的精確度時,值將被截斷。例如,如果插入 7876.7876 到 REAL 型別的欄位(支援最多 6 位數字精確度),它將被儲存為 7876.78。

日期時間型別的最佳實踐

日期時間型別等同於程式語言中的簡單日期、時間或時間戳記欄位。Redshift 支援以下日期時間型別:

  • DATE:儲存日期,不包含任何相關的時間。
  • TIME/TIMEZ:儲存一天中的時間,不包含任何相關的日期。TIMEZ 用於指定帶有時區的一天中的時間,預設時區為協調世界時(UTC)。時間儲存時具有最多六位小數秒的精確度。
  • TIMESTAMP/TIMESTAMPZ:是 DATE 後跟 TIME/TIMEZ 的組合。如果插入日期時沒有時間值,或只插入部分時間值,則任何缺失的值都將儲存為 00。例如,時間戳記 2021-05-23 將被儲存為 2021-05-23 00:00:00

布林型別的使用

布林型別用於儲存單位元組的文字,具有 True 或 False 狀態或 UNKNOWN。在插入資料到布林型別欄位時,True 的有效指定符號包括 {TRUE, ’t’, ’true’, ‘y’, ‘yes’, ‘1’},False 的有效指定符號包括 {FALSE ‘f’ ‘false’ ’n’ ’no’ ‘0’}。如果欄位具有 NULL 值,則被視為 UNKNOWN。無論用於插入布林型別欄位的文字字串是什麼,資料始終以 t 表示 true 和 f 表示 false 進行儲存和顯示。

HLLSKETCH 型別的高階應用

HLLSKETCH 型別是一種複雜的資料型別,用於儲存 HyperLogLog 演算法的結果。該演算法可用於非常有效地估計大型多重集合中的基數(唯一值的數量)。估計唯一值的數量是一種有用的分析功能,可用於對映時間趨勢。

例如,如果您經營一個大型社交媒體網站,每天有數億人存取,為了追蹤趨勢,您可能希望計算每天、每週或每月的唯一訪客數量。使用傳統的 SQL 進行此計算將非常不切實際,因為查詢將需要太長時間並且需要極大量的記憶體。這就是 HyperLogLog 等演算法的用武之地。用這種演算法換取了一定程度的準確性,但可以更有效地獲得基數的良好估計(通常,預期的錯誤範圍在 0.01 – 0.6% 之間)。使用此演算法意味著您可以處理極大的資料集,並在合理的時間內以最小的記憶體使用量計算估計的唯一值。

Redshift 將 HyperLogLog 演算法的結果儲存在稱為 HLLSKETCH 的資料型別中。您可以執行每日查詢來計算每天網站的大約唯一訪客,並將其儲存在 HLLSKETCH 資料型別中。然後,每週,您可以使用 Redshift 的內建聚合和純量函式對 HLLSKETCH 值進行操作,以合併多個 HLLSKETCH 值來計算每週總數。

SUPER 型別對半結構化資料的支援

為了更有效地在 Redshift 中支援半結構化資料(如陣列和 JSON 資料),Amazon 提供了 SUPER 資料型別。您可以將最多 1 MB 的資料載入到 SUPER 型別的欄位中,然後輕鬆查詢資料,而無需事先強制施加結構描述。

內容解密:

  • HyperLogLog演算法是一種用於估計大型資料集中唯一元素數量的方法,具有高效能和低記憶體佔用的特點。
  • 半結構化資料是指不遵循傳統關係資料函式庫結構化查詢語言(SQL)中嚴格架構的資料,例如JSON或XML檔案。
  • SUPER 資料型別允許在Redshift中直接儲存和查詢半結構化資料,提高了處理複雜資料結構的靈活性。

綜上所述,在 Amazon Redshift 中設計高效能的資料倉儲需要仔細選擇合適的資料型別,並遵循最佳實踐。這不僅可以提高查詢效能,還可以確保資料的準確性和一致性。透過瞭解和使用 Redshift 提供的各種資料型別,包括字串、數值、日期時間、布林、HLLSKETCHSUPER 型別,您可以更好地管理和分析您的資料,從而獲得更有價值的洞察。

高效能資料倉儲設計:資料載入與表格型別最佳化

在設計高效能的資料倉儲時,資料的載入方式和表格型別的選擇至關重要。Amazon Redshift 提供多種表格型別,以滿足不同的效能需求。本章將探討如何選擇最佳的表格型別,以及如何利用外部表格和暫存表格來最佳化資料載入和查詢效能。

選擇最佳的表格型別

Redshift 支援多種不同型別的表格。根據不同的使用場景選擇適當的表格型別,可以顯著提高查詢效能。以下是 Redshift 中常見的表格型別及其特點:

本地 Redshift 表格:耦合儲存與運算

本地 Redshift 表格是預設的表格型別,資料永久儲存在運算節點的本地磁碟上,並自動複製以實作容錯。這種設計結合了高效能的本地磁碟、高頻寬網路和大容量高速快取,能夠提供卓越的查詢效能。

Redshift 使用欄位導向的資料格式,並採用壓縮演算法來減少查詢時的磁碟查詢時間。此外,Redshift 還利用機器學習技術進行自動最佳化,包括表維護任務(如 VACUUM)、表格排序、分佈鍵和排序鍵的選擇,以及工作負載管理,從而進一步提升查詢效能。

然而,將儲存和運算耦合在一起可能會導致成本增加,尤其是在需要單獨擴充套件運算或儲存資源時。為瞭解決這個問題,Amazon 推出了 RA3 節點,結合了高效能 SSD 儲存和可獨立擴充套件的 S3 儲存,無需對工作流程進行任何更改。

使用外部表格查詢 Amazon S3 中的資料

為了充分利用資料湖(被視為單一真實資料來源),Redshift 支援外部表格的概念。外部表格是 Redshift 中的 schema 物件,指向 AWS Glue 資料目錄(或可選的 Amazon EMR Hive Metastore)中的資料函式庫物件。

一旦在 Redshift 中建立了指向 Glue 資料目錄中特定資料函式庫的外部 schema,就可以查詢屬於該資料函式庫的任何表格,Redshift Spectrum 將從底層的 Amazon S3 檔案中存取資料。雖然 Redshift Spectrum 在讀取大型資料集時表現出色,但其效能通常不如直接從 Redshift 運算節點本地磁碟讀取資料。

使用外部表格可以直接存取 S3 資料湖中的資料,避免了在多個資料倉儲叢集之間複製多份資料。然而,仍然可以利用 Redshift 的 MPP 查詢引擎來查詢資料,在無需頻繁載入和重新整理資料湖資料集的情況下獲得出色的查詢效能。

外部表格的使用場景

  • 當大部分查詢存取最近 12 個月的資料,但仍有部分查詢需要存取過去 5 年的歷史資料時,可以將最近 12 個月的資料載入 Redshift,而歷史資料則儲存在 S3 資料湖中,使用 Redshift Spectrum 查詢。
  • 需要讀取 Redshift 不原生支援的檔案格式(如 Amazon ION、Grok、RCFile 和 Sequence 檔案)中的資料時。

使用暫存表格載入資料至 Redshift

Redshift 支援暫存表格的概念,與其他資料倉儲系統類別似。暫存表格是特定於工作階段的,會在工作階段結束時自動刪除,且無法還原。

使用暫存表格可以顯著提高某些操作的效能,因為它們不像永久表格那樣需要複製,且插入資料至暫存表格不會觸發自動叢集增量備份操作。暫存表格的一個常見用途是更新和插入資料至現有表格。

在傳統的交易型資料函式庫中,支援 UPSERT 操作,用於變更資料捕捉(CDC)。UPSERT 交易會讀取新資料,並根據主鍵檢查是否存在匹配的現有記錄。如果存在現有記錄,則使用新資料更新該記錄;如果不存在,則建立新記錄。

雖然 Redshift 支援主鍵的概念,但這僅供查詢最佳化器使用,不強制執行唯一主鍵或外部索引鍵約束。因此,Redshift 不原生支援 UPSERT SQL 子句。如果直接將新資料插入現有表格中,可能會導致重複記錄的插入,從而產生多個版本的同一記錄,其中一些可能是過時的。

在Redshift中最佳化資料倉儲效能的關鍵策略

Amazon Redshift作為一個強大的資料倉儲解決方案,在處理大量資料和提供商業智慧(BI)分析方面扮演著關鍵角色。本篇文章將探討在Redshift中最佳化資料倉儲效能的關鍵策略,包括使用資料變更資料擷取(CDC)操作、資料快取、資料移動的最佳實踐,以及最佳化資料擷取的方法。

使用資料變更資料擷取(CDC)操作最佳化資料更新

在Redshift中處理資料更新時,一種替代方法是將新資料載入暫存表,然後對暫存表和現有表執行內部聯接(INNER JOIN)。這種方法可以有效地更新現有資料,而無需直接修改原始表。

程式碼範例:使用暫存表更新資料

-- 建立暫存表
CREATE TEMP TABLE temp_table (
    id INT,
    data VARCHAR(255)
);

-- 將新資料載入暫存表
COPY temp_table (id, data)
FROM 's3://your-bucket/new-data.csv'
IAM_ROLE 'your-iam-role'
CSV;

-- 更新現有表
BEGIN;
DELETE FROM existing_table
USING temp_table
WHERE existing_table.id = temp_table.id;

INSERT INTO existing_table (id, data)
SELECT id, data FROM temp_table;
COMMIT;

內容解密:

  1. 建立暫存表:首先建立一個暫存表來儲存新資料。
  2. 載入新資料:使用COPY命令將新資料從S3載入暫存表。
  3. 更新現有表:透過刪除現有表中與暫存表匹配的記錄,然後將暫存表的資料插入現有表來更新資料。

資料快取使用Redshift物化檢視

物化檢視是一種預先計算並儲存查詢結果的機制,可以大幅提升查詢效能。尤其是在BI工具查詢複雜計算和聚合結果時,物化檢視可以提供即時的結果而無需重複計算。

程式碼範例:建立物化檢視

-- 建立物化檢視
CREATE MATERIALIZED VIEW sales_by_store_daily AS
SELECT store_id, SUM(sales_amount) AS total_sales
FROM sales_data
GROUP BY store_id;

-- 重新整理物化檢視
REFRESH MATERIALIZED VIEW sales_by_store_daily;

內容解密:

  1. 建立物化檢視:定義一個物化檢視來計算每日各店舖的銷售總額。
  2. 重新整理物化檢視:在資料載入後重新整理物化檢視,以確保其包含最新的資料。

在資料湖和Redshift之間行動資料

在資料湖和Redshift之間行動資料是一個常見的需求。使用COPY命令可以高效地將資料從S3、DynamoDB、EMR等來源載入Redshift。

最佳實踐:

  • 分割檔案:將大檔案分割成多個檔案,以匹配叢集中的切片數量,從而實作平行載入。
  • 使用合適的檔案格式:支援多種檔案格式,如CSV、Parquet、Avro等。

最佳化資料擷取

  • 使用COPY命令:相較於INSERT陳述式,COPY命令可以更高效地批次載入資料。
  • 平行處理:透過匹配檔案數量和叢集切片數量來最大化平行處理能力。

將資料載入 Amazon Redshift 叢集並執行查詢

Amazon Redshift 是一種強大的資料倉儲服務,能夠處理和分析大量資料。在本章中,我們將探討如何將資料載入 Redshift 叢集,並執行查詢。

將資料載入 Redshift

有多種方法可以將資料載入 Redshift,包括使用 COPY 命令、Spark-Redshift JDBC 驅動程式和 AWS Glue。

使用 COPY 命令

COPY 命令是一種將資料從 Amazon S3 載入 Redshift 的常見方法。您可以指定資料的格式、分隔符號和其他選項,以確保資料正確載入。

使用 Spark-Redshift JDBC 驅動程式

Spark-Redshift JDBC 驅動程式允許您直接從 Spark 應用程式將資料載入 Redshift。在後台,Spark DataFrame 會被寫入臨時 S3 儲存桶,然後執行 COPY 命令將資料載入 Redshift。

// 使用 Spark-Redshift JDBC 驅動程式將資料載入 Redshift
val df = spark.read.format("jdbc")
  .option("url", "jdbc:redshift://your-cluster-url:5439/your-database")
  .option("driver", "com.amazon.redshift.jdbc42.Driver")
  .option("user", "your-username")
  .option("password", "your-password")
  .option("dbtable", "your-table-name")
  .load()

df.write.format("io.github.spark_redshift_community.spark.redshift")
  .option("url", "jdbc:redshift://your-cluster-url:5439/your-database")
  .option("tempdir", "s3://your-bucket/temp-dir")
  .option("user", "your-username")
  .option("password", "your-password")
  .option("dbtable", "your-table-name")
  .save()

內容解密:

  1. 使用 Spark-Redshift JDBC 驅動程式可以簡化資料載入流程。
  2. 需要指定 Redshift 叢集的 URL、資料函式庫名稱、使用者名稱和密碼。
  3. 資料會被寫入臨時 S3 儲存桶,然後使用 COPY 命令載入 Redshift。

從 Redshift 匯出資料到資料湖

UNLOAD 命令可以用於將資料從 Redshift 叢集匯出到 Amazon S3。您可以指定 SELECT 查詢來決定要匯出的資料。

// 使用 UNLOAD 命令將資料匯出到 S3
UNLOAD ('SELECT * FROM your-table-name')
TO 's3://your-bucket/unload-dir/'
IAM_ROLE 'your-iam-role'
FORMAT AS PARQUET;

內容解密:

  1. UNLOAD 命令可以用於將資料匯出到 S3。
  2. 需要指定 SELECT 查詢來決定要匯出的資料。
  3. 可以使用 IAM_ROLE 選項指定 IAM 身份,以授權存取 S3。

最佳實踐

  • 使用 PARTITION 選項來分割資料,以提高查詢效能。
  • 使用 CLEANPATH 選項來刪除現有的檔案,以避免資料混淆。
  • 使用 MAXFILESIZE 選項來控制匯出檔案的大小。

練習:將資料載入 Amazon Redshift 叢集並執行查詢

在本練習中,我們將建立一個新的 Redshift 叢集,並設定 Redshift Spectrum 以查詢 Amazon S3 中的外部表格。然後,我們將使用 Redshift Spectrum 將資料載入本地表格,並執行複雜查詢。

上傳範例資料到 Amazon S3

首先,我們需要下載 Inside Airbnb 資料集,並將其上傳到 Amazon S3。

// 上傳檔案到 S3
aws s3 cp jc-listings.csv s3://dataeng-landing-zone-initials/listings/city=jersey_city/jc-listings.csv
aws s3 cp ny-listings.csv s3://dataeng-landing-zone-initials/listings/city=new_york_city/ny-listings.csv

建立 IAM 身份

我們需要建立 IAM 身份,以授權 Redshift 叢集存取 EC2 網路資源。


### 建立 IAM 身份

Redshift 將自動建立 AWSServiceRoleForRedshift IAM 身份,並附加 AmazonRedshiftServiceLinkedRolePolicy 策略。

建立 Redshift 叢集

我們可以使用 AWS 管理主控台或 AWS CLI 建立 Redshift 叢集。


### 建立 Redshift 叢集

請參考 AWS 檔案以瞭解如何建立 Redshift 叢集。

透過本章的學習,您應該能夠瞭解如何將資料載入 Amazon Redshift 叢集,並執行查詢。同時,您也學到了如何使用 UNLOAD 命令將資料匯出到 Amazon S3,以及如何使用 Redshift Spectrum 查詢外部表格。