用Databricks查詢亞馬遜紅移

你可以用Databricks從Amazon Redshift讀取和寫入表。

Databricks Redshift數據源使用Amazon S3有效地在Redshift中傳輸數據,並使用JDBC自動觸發相應的複製而且卸載命令在紅移。

請注意

在Databricks Runtime 11.2及以上版本中,Databricks Runtime包含了Redshift JDBC驅動程序,可以使用紅移格式選項的關鍵字。看到Databricks運行時發布每個Databricks Runtime中包含的驅動程序版本。仍然支持用戶提供的驅動程序,並且優先於綁定的JDBC驅動程序。

在Databricks Runtime 11.1及以下版本中,需要手動安裝Redshift JDBC驅動程序,查詢應使用該驅動程序(com.databricks.spark.redshift)下載格式。看到紅移驅動器安裝

使用

下麵的示例演示如何連接紅移驅動程序。取代url參數值,如果你使用的是PostgreSQL JDBC驅動程序。

一旦你有了配置您的AWS憑證,您可以在Python、SQL、R或Scala中使用Spark數據源API:

#從表中讀取數據df火花格式“紅移”選項“數據表”table_name選項“tempdir”“s3a: / / <鬥> / <目錄路徑>”選項“url”" jdbc:紅移:/ / < database-host-url >”選項“用戶”用戶名選項“密碼”密碼選項“forward_spark_s3_credentials”真正的負載()#從查詢中讀取數據df火花格式“紅移”選項“查詢”select x, count(*)  group by x"選項“tempdir”“s3a: / / <鬥> / <目錄路徑>”選項“url”" jdbc:紅移:/ / < database-host-url >”選項“用戶”用戶名選項“密碼”密碼選項“forward_spark_s3_credentials”真正的負載()#對數據應用轉換後,您可以使用#數據源API,將數據寫回另一個表#寫回表df格式“紅移”選項“數據表”table_name選項“tempdir”“s3a: / / <鬥> / <目錄路徑>”選項“url”" jdbc:紅移:/ / < database-host-url >”選項“用戶”用戶名選項“密碼”密碼模式“錯誤”保存()使用IAM基於角色的身份驗證寫回表df格式“紅移”選項“數據表”table_name選項“tempdir”“s3a: / / <鬥> / <目錄路徑>”選項“url”" jdbc:紅移:/ / < database-host-url >”選項“用戶”用戶名選項“密碼”密碼選項“aws_iam_role”“攻擊:aws:我::123456789000:角色/ redshift_iam_role”模式“錯誤”保存()

使用SQL讀取數據:

下降表格如果存在redshift_table創建表格redshift_table使用紅移選項數據表' <表名稱>”tempdir“s3a: / / <鬥> / <目錄路徑>”url“jdbc:紅移:/ / < database-host-url >”用戶“<用戶名>”密碼' <密碼> 'forward_spark_s3_credentials“真正的”);選擇redshift_table

使用SQL寫數據:

下降表格如果存在redshift_table創建表格redshift_table_new使用紅移選項數據表' <新的表名>”tempdir“s3a: / / <鬥> / <目錄路徑>”url“jdbc:紅移:/ / < database-host-url >”用戶“<用戶名>”密碼' <密碼> 'forward_spark_s3_credentials“真正的”作為選擇table_name

SQL API隻支持創建新表,不支持覆蓋或追加。

使用R讀取數據:

df<-read.df“com.databricks.spark.redshift”tempdir“s3a: / / <你的水桶> / < your-directory-path >”數據表“< your-table-name >”url" jdbc:紅移:/ / < the-rest-of-the-connection-string >”
//從表中讀取數據瓦爾df火花格式“紅移”選項“數據表”table_name選項“tempdir”“s3a: / / <鬥> / <目錄路徑>”選項“url”" jdbc:紅移:/ / < database-host-url >”選項“用戶”用戶名選項“密碼”密碼選項“forward_spark_s3_credentials”真正的負載()//從查詢中讀取數據瓦爾df火花格式“紅移”選項“查詢”select x, count(*)  group by x"選項“tempdir”“s3a: / / <鬥> / <目錄路徑>”選項“url”" jdbc:紅移:/ / < database-host-url >”選項“用戶”用戶名選項“密碼”密碼選項“forward_spark_s3_credentials”真正的負載()//對數據應用轉換後,可以使用//數據源API,將數據寫回另一個表//寫回表df格式“紅移”選項“數據表”table_name選項“tempdir”“s3a: / / <鬥> / <目錄路徑>”選項“url”" jdbc:紅移:/ / < database-host-url >”選項“用戶”用戶名選項“密碼”密碼模式“錯誤”保存()//使用IAM基於角色的鑒權寫回表df格式“紅移”選項“數據表”table_name選項“tempdir”“s3a: / / <鬥> / <目錄路徑>”選項“url”" jdbc:紅移:/ / < database-host-url >”選項“用戶”用戶名選項“密碼”密碼選項“aws_iam_role”“攻擊:aws:我::123456789000:角色/ redshift_iam_role”模式“錯誤”保存()

使用紅移的建議

查詢執行可能會將大量數據提取到S3。如果您計劃在Redshift中對相同的數據執行多個查詢,Databricks建議使用三角洲湖

配置

驗證到S3和Redshift

數據源涉及多個網絡連接,如下圖所示:

┌───────┐┌───────────────────> S3││<─────────────────┐│我或鍵└───────┘我或鍵││^││││我或鍵v v┌──────v────┐┌────────────┐┌───────────┐│┌──────────┴┐│紅移││火花│││火花│││<──────────>司機││<────────> |執行人│└────────────┘└───────────┘└───────────┘JDBC與配置用戶名/密碼火花(默認啟用SSL)

數據源在Redshift和S3之間傳輸數據時,對S3進行讀寫操作。因此,它要求AWS憑證具有對S3桶的讀寫訪問權限(使用tempdir配置參數)。

請注意

數據源不會清理它在S3中創建的臨時文件。因此,我們建議您使用一個專用的臨時S3桶對象生命周期配置確保臨時文件在指定的過期時間後自動刪除。看到加密節中討論如何加密這些文件。

以下部分描述了每個連接的身份驗證配置選項:

火花驅動到紅移

Spark驅動程序使用用戶名和密碼通過JDBC連接到Redshift。Redshift不支持使用IAM角色來驗證此連接。默認情況下,此連接使用SSL加密;詳情請參見加密

Spark轉S3

S3在讀寫Redshift時充當存儲大量數據的中介。Spark使用Hadoop文件係統接口和直接使用Amazon Java SDK的S3客戶端連接到S3。此連接支持AWS密鑰或實例配置文件(DBFS掛載點不受支持,因此如果您不想依賴AWS密鑰,則應該使用集群實例概要文件)。提供這些憑證的方法有四種:

紅移到S3

期間,紅移也連接到S3複製而且卸載查詢。有三種方法驗證此連接:

  • 讓Redshift承擔IAM角色(最安全):允許Redshift在期間承擔IAM角色複製orgydF4y2Ba卸載操作,然後配置數據源來指示Redshift使用該角色:

    1. 創建一個IAM角色,授予您的桶適當的S3權限。

    2. 跟著指南走授權Amazon Redshift代表您訪問其他AWS服務配置此角色的信任策略,以允許Redshift承擔此角色。

    3. 操作步驟通過IAM角色授權COPY和UNLOAD操作將IAM角色與您的紅移集群關聯的指南。

    4. 設置數據源的aws_iam_role角色的ARN選項。

  • 將Spark的S3憑證轉發給Redshift:如果forward_spark_s3_credentials選項設置為真正的然後數據源自動發現Spark用於連接到S3的憑據,並通過JDBC將這些憑據轉發給Redshift。如果Spark使用實例配置文件對S3進行身份驗證,則將一組臨時STS憑據轉發給Redshift;否則,轉發AWS密鑰。JDBC查詢嵌入了這些憑據,因此Databricks強烈建議在使用這種身份驗證方法時啟用JDBC連接的SSL加密。

  • 使用安全令牌服務(STS)憑證:可以配置temporary_aws_access_key_idtemporary_aws_secret_access_key,temporary_aws_session_token配置屬性指向通過AWS創建的臨時密鑰安全令牌服務.JDBC查詢嵌入了這些憑證,因此是這樣強烈推薦在使用此身份驗證方法時啟用JDBC連接的SSL加密。如果選擇此選項,那麼要注意憑證在讀/寫操作成功之前過期的風險。

這三個選項是互斥的,您必須明確地選擇使用哪一個。

加密

  • 確保JDBC:除非JDBC URL中存在任何與SSL相關的設置,否則數據源默認啟用SSL加密,並驗證Redshift服務器是否可信(即:sslmode = verify-full).為此,在第一次需要服務器證書時,會自動從Amazon服務器下載服務器證書。如果失敗,則使用預綁定的證書文件作為備用。這對Redshift和PostgreSQL JDBC驅動程序都適用。中介紹了自動SSL配置_;早期版本不會自動配置SSL,而是使用默認的JDBC驅動程序配置(禁用SSL)。

    如果這個特性有任何問題,或者您隻是想禁用SSL,您可以調用.option(“autoenablessl”,“假”)在你的DataFrameReaderorgydF4y2BaDataFrameWriter

    如果你想指定自定義ssl相關的設置,你可以按照Redshift文檔中的說明:在Java中使用SSL和服務器證書而且JDBC驅動程序配置選項JDBC中出現的任何與ssl相關的選項url與數據源一起使用優先級(即自動配置不會觸發)。

  • 加密存儲在S3中的UNLOAD數據(從Redshift讀取時存儲的數據):根據Redshift文檔卸載數據到S3,“UNLOAD使用Amazon S3服務器端加密(SSE-S3)自動加密數據文件。”

    Redshift還支持客戶端加密與自定義密鑰(見:卸載加密數據文件),但數據源缺乏指定所需對稱密鑰的能力。

  • 加密存儲在S3中的COPY數據(寫入Redshift時存儲的數據):根據Redshift文檔從Amazon S3加載加密數據文件

您可以使用複製命令加載使用aws管理的加密密鑰(SSE-S3或SSE-KMS)的服務器端加密、客戶端加密或兩者都上傳到Amazon S3的數據文件。COPY不支持使用客戶提供的密鑰(SSE-C)進行Amazon S3服務器端加密。

參數

Spark SQL中提供的參數map或OPTIONS支持以下設置:

參數

要求

默認的

描述

數據表

是的,除非指定了query。

沒有一個

要在紅移中創建或讀取的表。當數據回存為Redshift時,需要設置此參數。

查詢

是的,除非指定了dbtable。

沒有一個

要從紅移中讀取的查詢。

用戶

沒有

沒有一個

Redshift用戶名。必須與密碼選項一起使用。隻有在URL中沒有傳遞用戶和密碼時才可以使用,傳遞兩者將導致錯誤。當用戶名中包含特殊字符需要轉義時,使用此參數。

密碼

沒有

沒有一個

紅移密碼。必須配合使用嗎用戶選擇。隻有在URL中沒有傳遞用戶和密碼時才可以使用;同時傳遞兩者將導致錯誤。當密碼中包含特殊字符需要轉義時,使用此參數。

url

是的

沒有一個

格式的JDBC URL

jdbc: subprotocol: / / <主機>:<端口> /數據庫?用戶= <用戶名>密碼= <密碼>

subprotocol可以postgresqlorgydF4y2Ba紅移,這取決於您加載的JDBC驅動程序。類路徑中必須有一個兼容redshift的驅動程序,並與此URL匹配。宿主而且港口應該指向Redshift主節點,因此安全組和/或VPC必須配置為允許從您的驅動程序應用程序訪問。數據庫標識紅移數據庫名稱用戶而且密碼是訪問數據庫的憑據,必須嵌入到JDBC的URL中,並且您的用戶帳戶應該對引用的表具有必要的特權。

search_path

沒有

沒有一個

在Redshift中設置模式搜索路徑。將使用search_path命令。應該是一個以逗號分隔的模式名列表,用於在其中搜索表。看到search_path的紅移文檔

aws_iam_role

僅當使用IAM角色進行授權時。

沒有一個

的完全指定的ARNIAM Redshift COPY/UNLOAD operations角色依附於紅移星團,例如,攻擊:aws:我::123456789000:角色/ < redshift-iam-role >

forward_spark_s3_credentials

沒有

如果真正的,數據源自動發現Spark用於連接到S3的憑據,並通過JDBC將這些憑據轉發給Redshift。這些憑證作為JDBC查詢的一部分發送,因此強烈建議在使用此選項時啟用JDBC連接的SSL加密。

temporary_aws_access_key_id

沒有

沒有一個

AWS訪問密鑰,必須對S3桶有寫權限。

temporary_aws_secret_access_key

沒有

沒有一個

AWS秘密訪問密鑰對應於所提供的訪問密鑰。

temporary_aws_session_token

沒有

沒有一個

與所提供的訪問密鑰對應的AWS會話令牌。

tempdir

是的

沒有一個

在Amazon S3中的一個可寫位置,用於讀取時卸載的數據和寫入時加載到Redshift的Avro數據。如果您正在使用Spark的紅移數據源作為常規ETL管道的一部分,那麼設置一個生命周期策略並將其用作此數據的臨時位置。

jdbcdriver

沒有

由JDBC URL的子協議決定。

要使用的JDBC驅動程序的類名。這個類必須在類路徑上。在大多數情況下,應該沒有必要指定這個選項,因為適當的驅動程序類名稱應該由JDBC URL的子協議自動確定。

diststyle

沒有

甚至

紅移分布的風格在創建表時使用。可以是其中之一甚至關鍵orgydF4y2Ba所有(參見紅移文檔)。當使用關鍵,您還必須使用distkey選項設置分布鍵。

distkey

不,除非使用DISTSTYLE關鍵

沒有一個

在創建表時用作分布鍵的表中的列的名稱。

sortkeyspec

沒有

沒有一個

完全紅移排序關鍵字定義。例子包括:

  • SORTKEY (my_sort_column)

  • 複合SORTKEY (sort_col_1sort_col_2)

  • 交叉SORTKEY (sort_col_1sort_col_2)

usestagingtable(棄用)

沒有

真正的

將此已棄用選項設置為導致覆蓋操作的目標表在寫入開始時立即被刪除,使覆蓋操作成為非原子操作並降低目標表的可用性。這可能會減少覆蓋的臨時磁盤空間需求。

因為設置usestagingtable = false由於操作存在數據丟失或不可用的風險,因此不建議使用此操作,而是要求您手動刪除目標表。

描述

沒有

沒有一個

表的描述。將使用SQL COMMENT命令進行設置,並且應該在大多數查詢工具中顯示。另請參閱描述元數據,用於在各個列上設置描述。

預作用

沒有

沒有一個

一個在加載之前要執行的SQL命令的分離列表複製命令。有一些可能是有用的刪除在加載新數據之前,在此運行命令或類似命令。如果命令包含% s,表名在執行前被格式化(以防您正在使用staging表)。

請注意,如果這些命令失敗,將被視為錯誤並拋出異常。如果使用staging表,則在預操作失敗時恢複更改並恢複備份表。

postactions

沒有

沒有一個

一個成功執行後要執行的SQL命令的分離列表複製加載數據時。有一些可能是有用的格蘭特在加載新數據時,此處會運行命令或類似命令。如果命令包含% s,表名在執行前被格式化(以防您正在使用staging表)。

請注意,如果這些命令失敗,將被視為錯誤並拋出異常。如果使用staging表,則在後期操作失敗時恢複更改並恢複備份表。

extracopyoptions

沒有

沒有一個

附加到紅移的額外選項列表複製命令,例如:TRUNCATECOLUMNSorgydF4y2BaMAXERRORn(見紅移文檔其他選項)。

方法的末尾附加了這些選項複製命令時,隻能使用命令末尾有意義的選項,但這應該涵蓋大多數可能的用例。

tempformat

沒有

AVRO

寫入Redshift時在S3中保存臨時文件的格式。默認為AVRO;其他允許的值為CSV而且CSVGZIP分別為CSV和gzipped CSV。

當加載CSV文件時,Redshift比加載Avro文件時要快得多,因此使用該tempformat可以在寫入Redshift時提供很大的性能提升。

csvnullstring

沒有

@NULL@

使用CSV tempformat時為null寫入的String值。這應該是一個不會出現在實際數據中的值。

csvseparator

沒有

寫入tempformat設置為的臨時文件時使用的分隔符CSVorgydF4y2BaCSVGZIP.這必須是一個有效的ASCII字符,例如,“或"|”。

csvignoreleadingwhitespace

沒有

真正的

當設置為true時,在寫入時從值中刪除前導空白tempformat設置為CSVorgydF4y2BaCSVGZIP.否則,將保留空白。

csvignoretrailingwhitespace

沒有

真正的

當設置為true時,在寫入時從值中刪除尾隨空格tempformat設置為CSVorgydF4y2BaCSVGZIP.否則,將保留空白。

infer_timestamp_ntz_type

沒有

如果真正的,類型為Redshift的值時間戳被解釋為TimestampNTZType(時間戳,不帶時區)。否則,所有時間戳都被解釋為TimestampType不管底層紅移表中的類型是什麼。

其他配置選項

配置字符串列的最大大小

創建紅移表時,默認行為是創建文本字符串列的列。紅移的商店文本列如VARCHAR (256),因此這些列的最大長度為256個字符().

要支持更大的列,可以使用最大長度列元數據字段指定單個字符串列的最大長度。通過聲明最大長度小於默認值的列,這對於實現節省空間的性能優化也很有用。

請注意

由於Spark的限製,SQL和R語言api不支持列元數據修改。

df...#你要寫入紅移的數據幀#指定每個列的自定義寬度columnLengthMap“language_code”2“country_code”2“url”2083#應用每個列元數據定製colName長度columnLengthMapiteritems():元數據最大長度的長度dfdfwithColumncolNamedfcolName別名colName元數據元數據))df格式“com.databricks.spark.redshift”選項“url”jdbcURL選項“tempdir”s3TempDirectory選項“數據表”sessionTable保存()

下麵是一個使用Spark的Scala API更新多列元數據字段的例子:

進口orgapache火花sql類型MetadataBuilder//指定每個列的自定義寬度瓦爾columnLengthMap地圖“language_code”->2“country_code”->2“url”->2083vardf...//你要寫入的數據幀//應用每個列元數據定製columnLengthMapforeach情況下colName長度= >瓦爾元數據MetadataBuilder().putLong“最大長度”長度).構建()dfdfwithColumncolNamedfcolName).作為colName元數據))df格式“com.databricks.spark.redshift”選項“url”jdbcURL選項“tempdir”s3TempDirectory選項“數據表”sessionTable保存()

設置自定義列類型

如果需要手動設置列類型,可以使用redshift_type列元數據。屬性,例如,如果您希望重寫火花SQL模式->紅移SQL類型匹配器來分配用戶定義的列類型,您可以執行以下操作:

#指定每個列的自定義類型columnTypeMap“language_code”“CHAR(2)”“country_code”“CHAR(2)”“url”“BPCHAR(111)”df...#你要寫入紅移的數據幀#應用每個列元數據定製colNamecolTypecolumnTypeMapiteritems():元數據“redshift_type”colTypedfdfwithColumncolNamedfcolName別名colName元數據元數據))
進口orgapache火花sql類型MetadataBuilder//指定每個列的自定義類型瓦爾columnTypeMap地圖“language_code”->“CHAR(2)”“country_code”->“CHAR(2)”“url”->“BPCHAR(111)”vardf...//你要寫入的數據幀//應用每個列元數據定製columnTypeMapforeach情況下colNamecolType= >瓦爾元數據MetadataBuilder().putString“redshift_type”colType).構建()dfdfwithColumncolNamedfcolName).作為colName元數據))

配置列編碼

創建表時,使用編碼列元數據字段指定每個列的壓縮編碼(請參閱亞馬遜文檔對於可用的編碼)。

在列上設置描述

Redshift允許列附加應該在大多數查詢工具中顯示的描述(使用評論命令)。您可以設置描述列元數據字段,為各個列指定描述。

查詢下推到紅移

Spark優化器將以下操作符推入紅移:

  • 過濾器

  • 項目

  • 排序

  • 限製

  • 聚合

  • 加入

項目而且過濾器,它支持以下表達式:

  • 大多數布爾邏輯運算符

  • 比較

  • 基本算術運算

  • 數字和字符串類型轉換

  • 大多數字符串函數

  • 標量子查詢,如果它們可以完全下推到紅移。

請注意

此下拉不支持操作日期和時間戳的表達式。

聚合,支持以下聚合功能:

  • AVG

  • 馬克斯

  • 最小值

  • 總和

  • STDDEV_SAMP

  • STDDEV_POP

  • VAR_SAMP

  • VAR_POP

結合截然不同的條款,如適用。

加入,它支持以下類型的連接:

  • 內心的加入

  • 加入

  • 正確的加入

  • 加入

  • 加入

  • 被重寫的子查詢加入通過優化器。在哪裏存在在哪裏存在

請注意

不支持加入下推完整的加入

下推在使用的查詢中可能最有用限製.查詢如下選擇large_redshift_table限製10可能會花費很長時間,因為作為中間結果,整個表將首先被卸載到S3。通過下推,限製在紅移中執行。在使用聚合的查詢中,將聚合向下推到紅移也有助於減少需要傳輸的數據量。

查詢下推到紅移默認啟用。可以通過設置禁用spark.databricks.redshift.pushdown.即使在禁用時,Spark仍然下推過濾器並執行列消除到Redshift。

紅移驅動器安裝

紅移數據源還需要與紅移兼容的JDBC驅動程序。因為Redshift是基於PostgreSQL數據庫係統的,所以你可以使用Databricks Runtime自帶的PostgreSQL JDBC驅動或者Amazon推薦的Redshift JDBC驅動。使用PostgreSQL JDBC驅動程序不需要安裝。每個Databricks Runtime版本中包含的PostgreSQL JDBC驅動程序的版本在Databricks Runtime中列出發布說明

手動安裝Redshift JDBC驅動程序。

  1. 下載亞馬遜的司機。

  2. 上傳驅動程序到你的Databricks工作空間。

  3. 安裝集群上的庫。

請注意

Databricks建議使用最新版本的Redshift JDBC驅動程序。1.2.41以下版本的Redshift JDBC驅動程序有以下限製:

  • 驅動程序版本1.2.16在使用對象時返回空數據在哪裏子句。

  • 1.2.41以下版本的驅動程序可能會返回無效結果,因為一個列的可空性被錯誤地報告為“Not Nullable”而不是“Unknown”。

事務擔保

介紹Spark中Redshift數據源的事務保證。

關於紅移和S3屬性的一般背景

有關紅移事務保證的一般信息,請參見並發寫操作管理Redshift文檔中的章節。簡而言之,紅移提供了可序列化的隔離根據紅移的文檔開始命令:

[盡管]您可以使用四個事務隔離級別中的任何一個,但Amazon Redshift將所有隔離級別處理為可序列化的。

根據紅移的文檔

Amazon Redshift支持默認值自動提交每個單獨執行的SQL命令單獨提交的行為。

因此,單獨的命令像複製而且卸載是原子的和事務性的,而顯式的開始而且結束應該隻在強製多個命令或查詢的原子性時才有必要。

數據源在對Redshift進行讀寫時,對S3中的數據進行讀寫。Spark和Redshift都生成分區輸出,並將其存儲在S3中的多個文件中。根據Amazon S3數據一致性模型文檔,S3桶列表操作最終是一致的,所以文件必須有特殊的長度,以避免由於最終一致性的來源而丟失或不完整的數據。

Spark的紅移數據源保證

添加到現有表

將行插入到Redshift時,數據源使用複製命令,並指定體現以防止某些最終一致的S3操作。結果,spark-redshift附加到現有表具有與常規紅移相同的原子和事務屬性複製命令。

創建一個新表(SaveMode。CreateIfNotExists

創建新表是一個兩步過程,包括創建表格命令後接複製命令追加初始行集。兩個操作都在同一個事務中執行。

覆蓋現有表

默認情況下,數據源使用事務執行覆蓋,通過刪除目標表、創建新的空表並向其追加行來實現。

如果已棄用usestagingtable設置設置為時,數據源提交刪除表格命令,然後將行追加到新表,犧牲了覆蓋操作的原子性,但減少了Redshift在覆蓋期間所需的staging空間量。

查詢紅移表

查詢使用紅移卸載命令來執行查詢並將查詢結果保存到S3並使用體現以防止某些最終一致的S3操作。因此,來自Spark的紅移數據源的查詢應該具有與常規紅移查詢相同的一致性屬性。

常見問題及解決方案

S3桶和Redshift集群位於不同的AWS區域

默認情況下,S3 <->當S3桶和紅移集群在不同的AWS區域時,紅移副本不生效。

如果你試圖讀取一個紅移表時,S3桶在不同的區域,你可能會看到一個錯誤,如:

ERROR: S3ServiceException:該查詢所尋址的S3桶與該集群不在同一區域。,狀態301,錯誤PermanentRedirect。

類似地,嚐試使用不同區域的S3桶寫入Redshift可能會導致以下錯誤:

—S3ServiceException:查詢所尋址的S3桶與此集群不在同一區域。,狀態301,錯誤PermanentRedirect
  • 寫道:紅移複製命令支持顯式指定S3桶區域,因此您可以在這些情況下通過添加地區“the-region-name”extracopyoptions設置。例如,對於美國東部(弗吉尼亞州)地區的桶和Scala API,使用:

    選項“extracopyoptions”“地區us-east-1”

    您也可以選擇使用awsregion設置:

    選項“awsregion”“us-east-1”
  • 寫著:紅移卸載命令還支持顯式指定S3桶區域。屬性中添加區域,可以使讀取工作正常進行awsregion設置:

    選項“awsregion”“us-east-1”

使用實例概要文件對S3進行身份驗證時出現意外的S3ServiceException憑據錯誤

如果你正在使用實例配置文件驗證到S3並接收一個意外的消息S3ServiceException錯誤時,檢查AWS訪問密鑰是否在tempdir方法檢查的任何源中DefaultAWSCredentialsProviderChain:這些源優先於實例概要憑證。

下麵是一個示例錯誤消息,可能是密鑰意外優先於實例配置文件的症狀:

com.amazonaws.services.s3.model。一個mazonS3Exception: The AWS Access Key Id you provided does not exist in our records. (Service: Amazon S3; Status Code: 403; Error Code: InvalidAccessKeyId;

在JDBC url中使用帶有特殊字符的密碼時出現身份驗證錯誤

如果您將用戶名和密碼作為JDBC url的一部分提供,並且密碼包含特殊字符,例如?,或,您可能會看到以下異常:

java.sql.SQLException: [Amazon](500310)無效操作:用戶'xyz'密碼驗證失敗

這是由於JDBC驅動程序沒有正確轉義用戶名或密碼中的特殊字符造成的。確保使用相應的DataFrame選項指定用戶名和密碼用戶而且密碼.有關更多信息,請參見參數

即使完成了相應的紅移操作,長時間運行的Spark查詢也會無限期掛起

如果您正在對Redshift讀寫大量數據,您的Spark查詢可能無限期掛起,即使AWS紅移監控頁麵顯示相應的負載orgydF4y2Ba卸載操作已完成,且集群處於空閑狀態。這是由於紅移和火花超時之間的連接造成的。為了避免這種情況,請確保tcpKeepAliveJDBC標誌已啟用,並且TCPKeepAliveMinutes設置為一個較低的值(例如,1)。

有關其他信息,請參見Amazon Redshift JDBC驅動程序配置

帶有時區語義的時間戳

讀取數據時,均紅移時間戳而且TIMESTAMPTZ數據類型映射到SparkTimestampType,值轉換為UTC (Coordinated Universal Time)時間戳,存儲為UTC時間戳。對於紅移時間戳,則假設該值不包含任何時區信息,即為本地時區。當向Redshift表寫入數據時,SparkTimestampType映射到紅移上時間戳數據類型。

遷移向導

數據源現在需要您顯式地進行設置forward_spark_s3_credentials在Spark S3證書被轉發到Redshift之前。方法,則此更改沒有影響aws_iam_roleorgydF4y2Batemporary_aws_ *身份驗證機製。但是,如果您依賴於舊的默認行為,現在必須顯式設置forward_spark_s3_credentials真正的繼續使用之前的Redshift到S3的身份驗證機製。有關這三種身份驗證機製及其安全性權衡的討論,請參見驗證到S3和Redshift本文檔的一部分。