Redshift 連線 - AWS Glue

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Redshift 連線

您可以使用 Spark 的 AWS Glue 從 Amazon Redshift 資料庫中讀取和寫入資料表。連接到亞馬遜 Redshift 資料庫時, AWS Glue 會使用 Amazon Redshift SQL COPYUNLOAD命令,透過 Amazon S3 移動資料以達到最大輸送量。在 AWS Glue 4.0 及更新版本中,您可以使用適用於 Apache Spark 的 Amazon Redshift 整合來讀取和寫入,並使用 Amazon Redshift 特有的最佳化和功能,而不是透過舊版連線時可用的功能。

了解 AWS Glue 如何讓 Amazon Redshift 使用者更輕鬆地遷移到 AWS Glue 進行無伺服器資料整合,以及. ETL

設定 Redshift 連線

若要在 AWS Glue 中使用 Amazon Redshift 叢集,您需要一些先決條件:

  • 從資料庫讀取和寫入資料庫時用於暫存空間的 Amazon S3 目錄。

  • 一個 Amazon,VPC可以在您的 Amazon Redshift 集群、您的 AWS Glue 任務和 Amazon S3 目錄之間進行通信。

  • AWS Glue 任務和 Amazon Redshift 叢集上的適當IAM許可。

配置IAM角色

設定 Amazon Redshift 叢集的角色

您的 Amazon Redshift 叢集必須能夠讀取和寫入 Amazon S3,才能與 AWS Glue 任務整合。為了允許這樣做,您可以將IAM角色與要連接到的 Amazon Redshift 叢集建立關聯。您的角色應具有允許從 Amazon S3 臨時目錄讀取和寫入該目錄的政策。您的角色應具有允許 redshift.amazonaws.com 服務 AssumeRole 的信任關係。

將IAM角色與 Amazon Redshift 相關聯
  1. 先決條件:用於檔案暫存空間的 Amazon S3 儲存貯體或目錄。

  2. 確定您的 Amazon Redshift 叢集需要哪些 Amazon S3 許可。在 Amazon 紅移叢集之間移動資料時, AWS Glue 任務會針對 Amazon Redshift 發出COPY和UNLOAD陳述。如果您的任務修改了 Amazon Redshift 中的資料表, AWS Glue 也會發出CREATELIBRARY陳述式。如需 Amazon Redshift 執行這些陳述式所需的特定 Amazon S3 許可的相關資訊,請參閱 Amazon Redshift 文件:存取其他資源的許可。 AWS

  3. 在IAM主控台中,建立具有必要權限的IAM策略。如需有關建立原則建立IAM原則的詳細資訊。

  4. 在IAM主控台中,建立可讓 Amazon Redshift 擔任該角色的角色和信任關係。依照說明IAM文件中的指示建立 AWS 服務的角色 (主控台)

    • 當系統要求選擇 AWS 服務使用案例時,請選擇「Redshift-可自訂」。

    • 當系統要求您附加政策時,請選擇您先前定義的政策。

    注意

    如需有關為 Amazon Redshift 設定角色的詳細資訊,請參閱 Amazon Redshift 文件中的授權亞馬遜紅移代表您存取其他 AWS 服務

  5. 在 Amazon Redshift 主控台中,將角色與您的 Amazon Redshift 叢集建立關聯。請按照 Amazon Redshift 文件中的說明進行操作。

    在 Amazon Redshift 主控台中選取反白顯示的選項,以進行此設定:

    在 Amazon Redshift 主控台中管理IAM許可的位置範例。
注意

根據預設, AWS Glue 任務會傳遞使用您指定用來執行任務的角色建立的 Amazon Redshift 臨時登入資料。我們不建議使用這些憑證。基於安全考量,這些憑證會在 1 小時後過期。

設定 AWS Glue 工作的角色

AWS Glue 任務需要角色才能存取 Amazon S3 儲存貯體。您不需要 Amazon Redshift 叢集的IAM許可,您的存取由 Amazon 中的連線VPC和您的資料庫登入資料控制。

設置 Amazon VPC

設定 Amazon Redshift 資料存放區存取
  1. 登入 AWS Management Console 並開啟 Amazon Redshift 主控台,https://console.aws.amazon.com/redshiftv2/網址為。

  2. 在左側導覽窗格中選擇 Clusters (叢集)。

  3. 選擇您想要從 AWS Glue 存取的叢集名稱。

  4. 在「叢集特性」段落中,選擇安全群組中要允許AWS Glue使用的VPC安全群組。記錄所選的安全群組名稱,供日後參考。選擇安全群組會開啟 Amazon EC2 主控台安全群組清單。

  5. 選擇要修改的安全群組並導覽至 Inbound (傳入) 索引標籤。

  6. 新增自我參考規則,以允許 AWS Glue 元件進行通訊。具體來說,新增或確認有類型 All TCP通訊協定TCP連接埠範圍包含所有連接埠,且其來源群組 ID 為相同安全群組名稱的規則。

    傳入規則類似如下:

    Type 通訊協定 連接埠範圍 來源

    所有 TCP

    TCP

    0–65535

    database-security-group

    例如:

    自我參考的傳入規則範例。
  7. 同時新增一個規則,以用於傳出流量。您可以開啟傳出流量到所有連接埠,例如:

    Type 通訊協定 連接埠範圍 目的地

    所有流量

    ALL

    ALL

    0.0.0.0/0

    或建立 Type (類型) All TCPProtocol (通訊協定) 為 TCPPort Range (連接埠範圍) 包含所有連接埠,且其 Destination (目的地) 與 Group ID (群組 ID) 為相同安全群組名稱的自我參考規則。如果使用 Amazon S3 VPC 端點,請同時為 Amazon S3 存取新增HTTPS規則。所以此 s3-prefix-list-id 在安全群組規則中需要,才能允許從 Amazon S3 VPC 端點傳輸流量。VPC

    例如:

    Type 通訊協定 連接埠範圍 目的地

    所有 TCP

    TCP

    0–65535

    security-group

    HTTPS

    TCP

    443

    s3-prefix-list-id

設置 AWS Glue

您必須建立可提供 Amazon 連線資訊的 AWS Glue 資料型錄VPC連線。

在主控台中將 Amazon Redshift Amazon VPC 連線設定為 AWS Glue
  1. 依照下列步驟建立資料型錄連線:新增 AWS Glue 連線。創建連接後,保留連接名稱,connectionName,進行下一個步驟。

    • 選取連線類型時,請選取 Amazon Redshift

    • 選取 Redshift 叢集時,請依名稱選取您的叢集。

    • 為叢集上的 Amazon Redshift 使用者提供預設連線資訊。

    • 您的 Amazon VPC 設置將被自動配置。

    注意

    通過創建 Amazon Redshift 連接VPC時,您將需要手動PhysicalConnectionRequirements為您的亞馬遜提供。 AWS SDK

  2. 在您的 AWS Glue 工作組態中,提供 connectionName 作為附加網絡連接

範例:從 Amazon Redshift 資料表讀取

您可以從 Amazon Redshift 叢集和 Amazon Redshift Serverless 環境讀取。

先決條件:您想要讀取的 Amazon Redshift 資料表。請按照上一節中的步驟進行操作,設定 Redshift 連線之後您應該將 Amazon S3 URI 用於臨時目錄,temp-s3-dir 和一個IAM角色,rs-role-name,(在帳戶中 role-account-id).

Using the Data Catalog

其他先決條件:您想要讀取的 Amazon Redshift 資料表的資料型錄資料庫和資料表。如需有關資料型錄的詳細資訊,請參閱 數據發現和編目 AWS Glue。為您的 Amazon Redshift 表創建條目後,您將識別您的連接 redshift-dc-database-name 以及 redshift-table-name.

組態:在函數選項中,您需使用 databasetable_name 參數識別資料型錄資料表。您需使用 redshift_tmp_dir 識別 Amazon S3 臨時目錄。您還將提供 rs-role-name 使用additional_options參數中的aws_iam_role鍵。

glueContext.create_dynamic_frame.from_catalog( database = "redshift-dc-database-name", table_name = "redshift-table-name", redshift_tmp_dir = args["temp-s3-dir"], additional_options = {"aws_iam_role": "arn:aws:iam::role-account-id:role/rs-role-name"})
Connecting directly

其他先決條件:您將需要您的 Amazon Redshift 表的名稱 (redshift-table-name。 您將需要儲存該表格之 Amazon Redshift 叢集的JDBC連線資訊。您將提供您的連線資訊 host, port, redshift-database-name, username 以及 password.

使用 Amazon Redshift 叢集時,您可以從 Amazon Redshift 主控台擷取連線資訊。使用 Amazon Redshift Serverless 時,請參閱 Amazon Redshift 文件中的 Connecting to Amazon Redshift Serverless

組態:在函數選項中,您需使用 urldbtableuserpassword 識別連線參數。您需使用 redshift_tmp_dir 識別 Amazon S3 臨時目錄。您可以在使用aws_iam_role時使用來指定您的IAM角色from_options。語法與透過資料型錄連線類似,但您可以將參數放入 connection_options 地圖中。

將密碼硬編碼為 AWS Glue 腳本是不好的做法。考慮將密碼存儲在中, AWS Secrets Manager 並使用 Python(Boto3)在腳SDK本中檢索它們。

my_conn_options = { "url": "jdbc:redshift://host:port/redshift-database-name", "dbtable": "redshift-table-name", "user": "username", "password": "password", "redshiftTmpDir": args["temp-s3-dir"], "aws_iam_role": "arn:aws:iam::account id:role/rs-role-name" } df = glueContext.create_dynamic_frame.from_options("redshift", my_conn_options)

範例:寫入 Amazon Redshift 資料表

您可以寫入 Amazon Redshift 叢集和 Amazon Redshift Serverless 環境。

先決條件:一個 Amazon Redshift 叢集,並按照上一節中的步驟進行操作,設定 Redshift 連線之後您應該有一個臨時目錄URI的 Amazon S3,temp-s3-dir 和一個IAM角色,rs-role-name,(在帳戶中 role-account-id). 您還需要一DynamicFrame個您想要寫入數據庫的內容。

Using the Data Catalog

其他先決條件:您想要寫入的 Amazon Redshift 叢集和資料表的資料型錄資料庫。如需有關資料型錄的詳細資訊,請參閱 數據發現和編目 AWS Glue。您將識別您的連接 redshift-dc-database-name 和目標表 redshift-table-name.

組態:在函數選項中,您需使用 database 參數識別資料型錄資料庫,然後為資料表提供 table_name。您需使用 redshift_tmp_dir 識別 Amazon S3 臨時目錄。您還將提供 rs-role-name 使用additional_options參數中的aws_iam_role鍵。

glueContext.write_dynamic_frame.from_catalog( frame = input dynamic frame, database = "redshift-dc-database-name", table_name = "redshift-table-name", redshift_tmp_dir = args["temp-s3-dir"], additional_options = {"aws_iam_role": "arn:aws:iam::account-id:role/rs-role-name"})
Connecting through a AWS Glue connection

您可以使用 write_dynamic_frame.from_options 方法直接連線到 Amazon Redshift。但是,您可以使用 from_jdbc_conf 方法參考存放在資料型錄連線中的連線詳細資訊,而不是直接將連線詳細資訊插入指令碼。您無需為資料庫進行網路爬取或建立資料型錄資料表即可執行此操作。如需有關資料型錄連線的詳細資訊,請參閱 連線至資料

其他先決條件:資料庫的資料型錄連線、您想要讀取的 Amazon Redshift 資料表

組態:您將識別您的「資料目錄」連線 dc-connection-name。 您將識別您的 Amazon Redshift 數據庫和表 redshift-table-name 以及 redshift-database-name。 您將提供您的資料目錄連線資訊,catalog_connection並使用和提供您的 Amazon Redshift 資訊。dbtable database語法與透過資料型錄連線類似,但您可以將參數放入 connection_options 地圖中。

my_conn_options = { "dbtable": "redshift-table-name", "database": "redshift-database-name", "aws_iam_role": "arn:aws:iam::role-account-id:role/rs-role-name" } glueContext.write_dynamic_frame.from_jdbc_conf( frame = input dynamic frame, catalog_connection = "dc-connection-name", connection_options = my_conn_options, redshift_tmp_dir = args["temp-s3-dir"])

Amazon Redshift 連線選項參考

用於所有 AWS Glue JDBC 連接的基本連接選項,用於設置信息url,例如,user並且在所有JDBC類型中都password是一致的。如需標準JDBC參數的更多資訊,請參閱〈〉JDBC 連線選項參考

Amazon Redshift 連線類型需要一些額外的連接選項:

  • "redshiftTmpDir":(必要) 從資料庫複製時,可用來暫存臨時資料的 Amazon S3 路徑。

  • "aws_iam_role":(可選)ARN用於IAM角色。 AWS Glue 任務會將此角色傳遞給 Amazon Redshift 叢集,以授與完成任務指示所需的叢集許可。

AWS Glue 4.0+ 提供其他連接選項

您也可以透過 Glue 連線選項,傳遞新的 Amazon Redshift 連 AWS 接器的選項。如需支援的連接器選項的完整清單,請SQL參Amazon Redshift 整合中的星火參數一節。

為方便起見,我們在此重申某些新選項:

名稱 必要 預設 描述

autopushdown

TRUE

擷取和分析作業的 Spark 邏輯計劃,以套用述詞和查詢下推。SQL這些操作會轉譯成SQL查詢,然後在 Amazon Redshift 中執行以提升效能。

autopushdown.s3_result_cache

FALSE

快取SQL查詢以卸載記憶體中 Amazon S3 路徑對應的資料,以便相同的查詢不需要在相同的 Spark 工作階段中再次執行。僅在啟用 autopushdown 時提供支援。

unload_s3_format

PARQUET

PARQUET-以鑲木地板格式卸載查詢結果。

TEXT-以管道分隔文字格式卸載查詢結果。

sse_kms_key

N/A

UNLOAD作業期間用於加密的 AWS SSE-KMS 金鑰,而不是的預設加密 AWS。

extracopyoptions

N/A

載入資料時要附加至 Amazon Redshift COPY 命令的額外選項清單,例如TRUNCATECOLUMNSMAXERROR n (如需其他選項,請參閱 COPY:可選參數)。

請注意,由於這些選項會附加到 COPY 命令的結尾,因此只能使用在命令結尾上具有意義的選項。這應該涵蓋大多數可能的使用案例。

csvnullstring (實驗性)

NULL

使用時要為空值寫入的字串值。CSV tempformat這應該是不會出現在實際資料中的值。

這些新參數可以透過以下方式使用。

提升效能的全新選項

新的連接器引入了一些新的效能提升選項:

  • autopushdown:預設為啟用。

  • autopushdown.s3_result_cache:預設為停用。

  • unload_s3_format:預設為 PARQUET

如需有關使用這些選項的資訊,請參閱 Apache Spark 的 Amazon Redshift 整合。建議您在混合讀取和寫入操作時不要開啟 autopushdown.s3_result_cache,因為快取的結果可能包含過時的資訊。依預設,UNLOAD 命令的選項 unload_s3_format 會設定為 PARQUET,以提高效能並降低儲存成本。若要使用 UNLOAD 命令預設行為,請將選項重設為 TEXT

新的讀取加密選項

預設情況下,從 Amazon Redshift 資料表讀取資料時,由 AWS Glue 使用之臨時資料夾中的資料會使用 SSE-S3 加密來加密。若要使用客戶管理金鑰 AWS Key Management Service (AWS KMS) 來加密您的資料,您可("sse_kms_key" → kmsKey)以設定金鑰 ID 的來源 AWS KMS,而不 ksmKey 是 3.0 AWS Glue 版("extraunloadoptions" → s"ENCRYPTED KMS_KEY_ID '$kmsKey'")中的舊版設定選項。

datasource0 = glueContext.create_dynamic_frame.from_catalog( database = "database-name", table_name = "table-name", redshift_tmp_dir = args["TempDir"], additional_options = {"sse_kms_key":"<KMS_KEY_ID>"}, transformation_ctx = "datasource0" )
IAM基於 Support JDBC URL

新的連接器支持IAM基於,JDBCURL因此您不需要傳遞用戶/密碼或密碼。使用IAM基於連接器時 JDBCURL,連接器會使用任務執行階段角色來存取 Amazon Redshift 資料來源。

步驟 1:將下列最小必要政策附加至您的 AWS Glue 任務執行時間角色。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "redshift:GetClusterCredentials", "Resource": [ "arn:aws:redshift:<region>:<account>:dbgroup:<cluster name>/*", "arn:aws:redshift:*:<account>:dbuser:*/*", "arn:aws:redshift:<region>:<account>:dbname:<cluster name>/<database name>" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "redshift:DescribeClusters", "Resource": "*" } ] }

第 2 步:使用IAM基於JDBCURL如下。使用您要連線的 Amazon Redshift 使用者名稱指定新選項 DbUser

conn_options = { // IAM-based JDBC URL "url": "jdbc:redshift:iam://<cluster name>:<region>/<database name>", "dbtable": dbtable, "redshiftTmpDir": redshiftTmpDir, "aws_iam_role": aws_iam_role, "DbUser": "<Redshift User name>" // required for IAM-based JDBC URL } redshift_write = glueContext.write_dynamic_frame.from_options( frame=dyf, connection_type="redshift", connection_options=conn_options ) redshift_read = glueContext.create_dynamic_frame.from_options( connection_type="redshift", connection_options=conn_options )
注意

DynamicFrame目前只支援以GlueContext.create_dynamic_frame.from_options工作流程IAM為基礎 DbUser的JDBCURL具有。

從 AWS Glue 3.0 版本遷移至第 4.0 版

在 AWS Glue 4.0 中,任ETL務可以存取新的 Amazon Redshift Spark 連接器,以及具有不同選項和組態的新JDBC驅動程式。新 Amazon Redshift 連接器和驅動程式在寫入時考量效能,並維持資料的交易一致性。這些產品會記錄在 Amazon Redshift 文件中。如需詳細資訊,請參閱:

資料表/欄名稱和識別符限制

新的 Amazon Redshift Spark 連接器和驅動程式對 Redshift 資料表名稱的要求更加嚴格。如需詳細資訊,請參閱 Names and identifiers (名稱和識別符) 以定義您的 Amazon Redshift 資料表名稱。任務書籤工作流程可能無法使用不符合規則和具有特定字元 (例如空格) 的資料表名稱。

如果舊版資料表名稱不符合名稱和識別符規則,並且看到書籤問題 (任務會重新處理舊版 Amazon Redshift 資料表資料),建議您重新命名資料表名稱。如需詳細資訊,請參閱ALTERTABLE範例

Dataframe 中的預設 tempformat 變更

3.0 AWS Glue 版本的星火連接器tempformat默認為,CSV而寫入 Amazon Redshift。為了保持一致,在 AWS Glue 3.0 版本中, DynamicFrame 仍然將 tempformat 預設為使用 CSV。如果您之前已將星火資料框APIs直接與 Amazon Redshift Spark 連接器搭配使用,您可以在/選項CSV中明確設定tempformat為。DataframeReader Writer否則,tempformat 會在新 Spark 連接器中預設為 AVRO

行為更改:將 Amazon Redshift 數據類型映射REAL到 Spark 數據類型FLOAT而不是 DOUBLE

在 AWS Glue 3.0 版本中,Amazon Redshift REAL 會轉換為 Spark DOUBLE 類型。新的 Amazon Redshift Spark 連接器已經更新行為,以便 Amazon Redshift REAL 類型轉換為 Spark FLOAT 類型,並轉換回來。如果您仍有希望將 Amazon Redshift REAL 類型映射至 Spark DOUBLE 類型的舊版使用案例,則可以使用下列因應措施:

  • 對於 DynamicFrame,將 Float 類型映射至具有 DynamicFrame.ApplyMappingDouble 類型。對於 Dataframe,您需要使用 cast

程式碼範例:

dyf_cast = dyf.apply_mapping([('a', 'long', 'a', 'long'), ('b', 'float', 'b', 'double')])