使用Databricks查詢Amazon Redshift

您可以使用Databricks從Amazon Redshift讀取和寫入表格。

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

請注意

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

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

使用

下麵的例子演示了與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建議使用三角洲湖

請注意

不建議在Databricks管理的VPC內創建Redshift集群,因為Databricks VPC的安全模型會導致權限問題。先創建自己的VPC,然後再執行VPC凝視連接Databricks到您的Redshift實例。

配置

S3和Redshift鑒權

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

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

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

請注意

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

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

火花驅動到紅移

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

Spark到S3

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

  • 默認憑據提供程序鏈(大多數用戶的最佳選擇):方法自動檢索AWS憑據DefaultAWSCredentialsProviderChain.如果你使用實例配置文件要驗證到S3,那麼您可能應該使用這個方法。

    以下提供憑據的方法優先於此默認值。

  • 在Hadoop conf中設置鍵:可以使用指定AWS密鑰Hadoop配置屬性.如果你的tempdir配置指向s3a: / /文件係統,您可以設置fs.s3a.access.key而且fs.s3a.secret.key屬性在Hadoop XML配置文件或調用sc.hadoopConfiguration.set ()配置Spark的全局Hadoop配置。如果您使用s3n: / /文件係統中,您可以提供遺留配置鍵,如下麵的示例所示。

    例如,如果您正在使用s3a文件係統,添加:

    schadoopConfiguration“fs.s3a.access.key”“< your-access-key-id >”schadoopConfiguration“fs.s3a.secret.key”“< your-secret-key >”

    為了遺產s3n文件係統,添加:

    schadoopConfiguration“fs.s3n.awsAccessKeyId”“< your-access-key-id >”schadoopConfiguration“fs.s3n.awsSecretAccessKey”“< your-secret-key >”

    以下命令依賴於一些Spark內部組件,但應該適用於所有PySpark版本,並且在未來不太可能更改:

    sc_jschadoopConfiguration()“fs.s3a.access.key”“< your-access-key-id >”sc_jschadoopConfiguration()“fs.s3a.secret.key”“< your-secret-key >”
  • 通過擔任IAM角色:可以使用實例配置文件可以承擔的IAM角色。要指定角色ARN,必須將實例概要文件附加到集群,並提供以下配置鍵:

    schadoopConfiguration“fs.s3a.credentialsType”“AssumeRole”schadoopConfiguration“fs.s3a.stsAssumeRole.arn”<-角色-在攻擊---假定>//一個可選的持續時間,用數量和的單位表示//時間,如"15m"或"1h"schadoopConfiguration“fs.s3a.assumed.role.session.duration”<持續時間>
    sc_jschadoopConfiguration()“fs.s3a.credentialsType”“AssumeRole”sc_jschadoopConfiguration()“fs.s3a.stsAssumeRole.arn”<-角色-在攻擊---假定>可選的持續時間,用數量和單位表示#時間,如“15m”或“1h”sc_jschadoopConfiguration()“fs.s3a.assumed.role.session.duration”<持續時間>

紅移到S3

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

  • 讓Redshift承擔IAM角色(最安全):在訪問IAM時,可授予Redshift權限複製orgydF4y2Ba卸載操作,然後配置數據源來指示Redshift使用該角色:

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

    2. 遵循指南授權Amazon Redshift以您的名義訪問其他AWS服務配置該角色的信任策略,以允許Redshift承擔該角色。

    3. 的步驟通過IAM角色授權COPY和UNLOAD操作如何將該IAM角色與Redshift集群關聯。

    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配置2.1.1-db4集群映像(不支持);早期版本不自動配置SSL,並使用默認的JDBC驅動程序配置(禁用SSL)。

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

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

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

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

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

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

要使用此功能,請配置要使用的Hadoop S3文件係統Amazon S3加密.這將不會加密清單包含寫入的所有文件列表的文件。

參數

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

參數

要求

默認的

描述

數據表

是,除非指定查詢。

沒有一個

要在Redshift中創建或讀取的表。當數據回退到Redshift時,需要設置該參數。

查詢

是的,除非指定了dbtable。

沒有一個

要從Redshift中讀取的查詢。

用戶

沒有

沒有一個

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

密碼

沒有

沒有一個

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

url

是的

沒有一個

JDBC URL,格式為

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

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

search_path

沒有

沒有一個

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

aws_iam_role

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

沒有一個

的完全指定ARNIAM Redshift COPY/UNLOAD operations角色附加到Redshift集群,例如,攻擊: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的Redshift數據源作為常規ETL管道的一部分,那麼設置一個生命周期策略並將其用作數據的臨時位置。

jdbcdriver

沒有

由JDBC URL的子協議決定。

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

diststyle

沒有

甚至

紅移分布的風格在創建表時使用。可以是甚至關鍵orgydF4y2Ba所有(參見Redshift文檔)。當使用關鍵,您還必須使用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和gzip格式的CSV。

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

csvnullstring(實驗)

沒有

@NULL@

使用CSV tempformat時寫入為空的字符串值。這應該是一個沒有出現在實際數據中的值。

csvseparator ' '(實驗)

沒有

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

其他配置選項

配置字符串列的最大大小

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

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

請注意

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

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

配置列編碼

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

在列上設置描述

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

查詢下推到Redshift

Spark優化器將以下操作符下推到Redshift:

  • 過濾器

  • 項目

  • 排序

  • 限製

  • 聚合

  • 加入

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

  • 大多數布爾邏輯運算符

  • 比較

  • 基本算術運算

  • 數值類型轉換和字符串類型轉換

  • 大多數字符串函數

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

請注意

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

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

  • AVG

  • 馬克斯

  • 最小值

  • 總和

  • STDDEV_SAMP

  • STDDEV_POP

  • VAR_SAMP

  • VAR_POP

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

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

  • 內心的加入

  • 加入

  • 正確的加入

  • 加入

  • 加入

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

請注意

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

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

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

紅移驅動器安裝

Redshift數據源還需要一個與Redshift兼容的JDBC驅動程序。由於Redshift基於PostgreSQL數據庫係統,您可以使用Databricks Runtime自帶的PostgreSQL JDBC驅動程序,也可以使用Amazon推薦的Redshift JDBC驅動程序。使用PostgreSQL JDBC驅動程序不需要安裝。每個Databricks運行時版本中包含的PostgreSQL JDBC驅動程序的版本在Databricks運行時中列出發布說明

手動安裝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數據源的事務保證。

關於Redshift和S3屬性的一般背景知識

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

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

根據紅移的文檔

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

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

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

Spark的Redshift數據源保證

附加到現有表

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

創建一個新表(SaveMode。CreateIfNotExists

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

覆蓋現有表

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

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

查詢紅移表

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

常見問題及解決方案

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

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

當S3桶在不同的區域時,如果你試圖讀取Redshift表,你可能會看到如下錯誤:

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訪問鍵是否在tempdirS3 URI,在Hadoop配置中,或在任何由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操作已經完成

如果你正在從Redshift和向Redshift讀寫大量數據,你的Spark查詢可能會無限期掛起,即使AWS Redshift監控頁麵顯示相應的負載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鑒權部分。