亞馬遜紅移

您可以使用亞馬遜紅移數據源數據加載到Apache火花SQL DataFrames紅移和寫回紅移表。紅移數據源使用Amazon S3來有效地傳輸數據的紅移,使用JDBC來自動觸發適當的複製卸載紅移的命令。

紅移等批處理工作負載的數據來源是更好的ETL處理而不是交互式查詢因為每個查詢執行可能提取大量數據S3。如果你計劃執行多個查詢相同的數據在紅移,磚建議提取的數據保存在一個優化的格式等Apache拚花

請注意

你不應該創建一個紅移集群內部磚VPC,因為它會導致管理權限的問題由於磚VPC的安全模型。您應該創建自己的VPC,然後執行VPC凝視連接數據磚紅移的實例。

安裝

磚運行時包括亞馬遜紅移的數據源。不需要額外的安裝。紅移的版本數據源包含在每個磚磚中列出的運行時版本的運行時發布說明

紅移的數據源也需要Redshift-compatible JDBC驅動程序。因為紅移是基於PostgreSQL數據庫係統,您可以使用PostgreSQL JDBC驅動程序附帶磚運行時或亞馬遜推薦紅移的JDBC驅動程序。無需安裝使用PostgreSQL JDBC驅動程序。PostgreSQL JDBC驅動程序的版本包含在每個磚磚中列出的運行時版本的運行時發布說明

在磚運行時的11.2及以上,磚運行時包含了紅移的JDBC驅動程序。看到_驅動程序版本包含在每個磚運行時。用戶提供的司機仍然支持,優先於捆綁JDBC驅動程序。

在磚運行時的11.1和下麵,手動安裝紅移的JDBC驅動程序是必需的。

手動安裝紅移JDBC驅動程序:

  1. 下載司機從亞馬遜。

  2. 上傳司機磚工作區。

  3. 安裝圖書館在你的集群。

請注意

磚推薦使用最新版本的紅移的JDBC驅動程序。下麵的紅移JDBC驅動程序版本1.2.41有以下限製:

  • 驅動程序的版本1.2.16返回空數據時使用在哪裏條款一個SQL查詢。

  • 驅動程序的版本低於1.2.41可能返回無效的結果,因為一個列的nullability錯誤報告為“不空”而不是“未知”。

使用

配置紅移的JDBC URL連接基於司機:

  • 捆綁PostgreSQL JDBC驅動程序:jdbc: postgresql: / /…

  • 紅移JDBC驅動程序:jdbc:紅移:/ /…

下麵的例子演示結合紅移的司機。取代url參數值,如果你使用PostgreSQL JDBC驅動程序。

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

#從一個表讀取數據df=火花\格式(“com.databricks.spark.redshift”)\選項(“url”," jdbc:紅移:/ / < the-rest-of-the-connection-string >”)\選項(“數據表”,“< your-table-name >”)\選項(“tempdir”,“s3a: / / <你的水桶> / < your-directory-path >”)\負載()#讀取數據的查詢df=火花\格式(“com.databricks.spark.redshift”)\選項(“url”," jdbc:紅移:/ / < the-rest-of-the-connection-string >”)\選項(“查詢”,“選擇x, count (*) < your-table-name > group by x”)\選項(“tempdir”,“s3a: / / <你的水桶> / < your-directory-path >”)\負載()#應用轉換到數據之後,您可以使用#數據源API來編寫回到另一個表的數據#寫回到一個表df\格式(“com.databricks.spark.redshift”)\選項(“url”," jdbc:紅移:/ / < the-rest-of-the-connection-string >”)\選項(“數據表”,“< your-table-name >”)\選項(“tempdir”,“s3a: / / <你的水桶> / < your-directory-path >”)\模式(“錯誤”)\保存()#使用我編寫回表基於角色的驗證df\格式(“com.databricks.spark.redshift”)\選項(“url”," jdbc:紅移:/ / < the-rest-of-the-connection-string >”)\選項(“數據表”,“< your-table-name >”)\選項(“tempdir”,“s3a: / / <你的水桶> / < your-directory-path >”)\選項(“aws_iam_role”,“攻擊:aws:我::123456789000:角色/ redshift_iam_role”)\模式(“錯誤”)\保存()

使用SQL讀取數據:

創建example_table使用com火花紅移選項(數據表“< your-table-name >”,tempdir“s3a: / / <你的水桶> / < your-directory-path >”,url“jdbc:紅移:/ / < the-rest-of-the-connection-string >”);

使用SQL編寫數據:

——創建一個新表,拋出錯誤如果表具有相同名稱已經存在創建example_table使用com火花紅移選項(數據表“< your-table-name >”,tempdir“s3a: / / <你的水桶> / < your-directory-path >”url“jdbc:紅移:/ / < the-rest-of-the-connection-string >”)作為選擇*table_to_save;

SQL API隻支持創建新表,而不是覆蓋或附加;這對應於其他語言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:DataFrame=火花格式(“com.databricks.spark.redshift”)選項(“url”," jdbc:紅移:/ / < the-rest-of-the-connection-string >”)選項(“數據表”,“< your-table-name >”)選項(“tempdir”,“s3a: / / <你的水桶> / < your-directory-path >”)負載()/ /加載數據從一個紅移的查詢瓦爾df:DataFrame=火花格式(“com.databricks.spark.redshift”)選項(“url”," jdbc:紅移:/ / < the-rest-of-the-connection-string >”)選項(“查詢”,“選擇x, count (*) < your-table-name > group by x”)選項(“tempdir”,“s3a: / / <你的水桶> / < your-directory-path >”)負載()/ /轉換應用到數據之後,您可以使用/ /數據源API來編寫回到另一個表的數據/ /寫一個表df格式(“com.databricks.spark.redshift”)選項(“url”," jdbc:紅移:/ / < the-rest-of-the-connection-string >”)選項(“數據表”,“< your-table-name >”)選項(“tempdir”,“s3a: / / <你的水桶> / < your-directory-path >”)模式(“錯誤”)保存()/ /寫回表使用我基於角色的驗證df格式(“com.databricks.spark.redshift”)選項(“url”," jdbc:紅移:/ / < the-rest-of-the-connection-string >”)選項(“數據表”,“< your-table-name >”)選項(“aws_iam_role”,“攻擊:aws:我::123456789000:角色/ redshift_iam_role”)選項(“tempdir”,“s3a: / / <你的水桶> / < your-directory-path >”)模式(“錯誤”)保存()

配置

驗證S3和紅移

數據源包括多個網絡連接,見下圖:

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

數據源讀取和寫入數據傳輸數據時S3 /紅移。因此,它需要AWS憑證與讀和寫訪問一個S3 bucket(指定使用tempdir配置參數)。

請注意

數據源不清理臨時文件創建在S3中。因此,我們建議你使用一個專門的臨時用一個S3 bucket對象生命周期配置以確保臨時文件後自動刪除指定的保質期。看到加密部分的本文檔討論如何加密這些文件。

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

火花司機紅移

火花司機通過JDBC連接到紅移使用用戶名和密碼。紅移不支持我角色的使用這個連接進行身份驗證。默認情況下,此連接使用SSL加密;更多細節,請參閱加密

火花S3

充當中介S3存儲大量數據讀取或寫入紅移。火花連接到S3使用Hadoop文件係統接口和直接使用Amazon S3 Java SDK的客戶端。這個連接支持AWS鍵或實例配置文件不支持(DBFS掛載點,所以如果你不想依靠AWS鑰匙你應該使用集群實例配置文件)。有四個方法提供這些證書:

  • 默認憑據提供程序鏈(最好的選擇對於大多數用戶):自動檢索通過AWS憑證DefaultAWSCredentialsProviderChain。如果你使用實例配置文件驗證S3,那麼你應該使用這種方法。

    以下提供憑證優先於這個默認的方法。

  • 在Hadoop設置鍵配置:您可以指定使用AWS鍵Hadoop配置屬性。如果你的tempdir配置指向一個s3a: / /文件係統,您可以設置fs.s3a.access.keyfs.s3a.secret.key屬性在Hadoop XML配置文件或電話sc.hadoopConfiguration.set ()配置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 >”)

    下麵的命令依靠一些火花內部,但應與所有PySpark版本和將來不太可能改變:

    sc_jschadoopConfiguration()(“fs.s3a.access.key”,“< your-access-key-id >”)sc_jschadoopConfiguration()(“fs.s3a.secret.key”,“< your-secret-key >”)
  • 通過假設一個我的角色:你可以用一個實例配置文件可以假設我的角色。指定角色的攻擊,你必須實例配置文件附加到集群,並提供以下配置密鑰:

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

紅移到S3

紅移也連接到S3複製卸載查詢。這個連接進行身份驗證的方法有三種:

  • 有紅移假設一個我的角色(最安全):你可以授予紅移許可期間承擔了我的角色複製orgydF4y2Ba卸載操作,然後配置數據源指示紅移使用這些角色:

    1. 創建一個給予你適當的S3權限鬥我的角色。

    2. 跟著導遊授權亞馬遜紅移來訪問其他AWS服務代表你配置這個角色的信任策略為了讓紅移承擔這個角色。

    3. 遵循的步驟使用我的角色授權複製和卸載操作指導助理,我的角色和你的紅移集群。

    4. 設置數據源aws_iam_role選擇角色的攻擊。

  • 火花的S3憑證紅移:如果forward_spark_s3_credentials選項設置為真正的然後數據源自動發現火花的憑證是用來連接到S3和轉發這些憑證在JDBC紅移。如果火花驗證S3使用實例配置文件然後一組臨時STS證書轉發給紅移;否則,AWS密鑰轉發。JDBC查詢嵌入這些憑據因此磚強烈建議您啟用SSL加密的JDBC連接時使用此身份驗證方法。

  • 使用安全令牌服務(STS)憑證:你可以配置temporary_aws_access_key_id,temporary_aws_secret_access_key,temporary_aws_session_token配置屬性指向臨時密鑰通過AWS創建的安全令牌服務。因此JDBC查詢嵌入這些憑證強烈推薦啟用SSL加密的JDBC連接時使用此身份驗證方法。如果您選擇這個選項然後意識到這種風險,證書到期前讀/寫操作成功。

這三個選項是相互排斥的,您必須顯式地選擇使用哪一個。

加密

  • 確保JDBC:除非存在任何SSL-related設置JDBC URL,也默認數據源支持SSL加密和驗證紅移服務器是值得信賴的(也就是說,sslmode = verify-full)。,從亞馬遜服務器自動下載服務器證書第一次。如果失敗,預捆綁的證書文件作為後備。這適用於紅移和PostgreSQL JDBC驅動程序。介紹了自動SSL配置2.1.1-db4集群形象(不支持);之前的版本並不自動配置SSL和使用默認的JDBC驅動程序的配置(SSL禁用)。

    這個功能有問題,或者你隻是想禁用SSL,您可以調用.option (“autoenablessl”,“假”)在你的DataFrameReaderorgydF4y2BaDataFrameWriter

    如果你想指定自定義SSL-related設置,您可以按照紅移的說明文檔:在Java中使用SSL和服務器證書JDBC驅動程序的配置選項任何SSL-related選項出現在JDBCurl優先考慮使用數據源(即自動配置不會觸發)。

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

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

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

您可以使用複製命令加載數據文件上傳與AWS-managed Amazon S3使用服務器端加密加密密鑰(SSE-S3或SSE-KMS),客戶端加密,或兩者兼而有之。複製不支持Amazon S3與客供服務器端加密密鑰(SSE-C)。

使用此功能,配置您的Hadoop文件係統使用S3Amazon S3加密。這將不加密清單寫文件,其中包含所有文件的列表。

參數

火花中提供的參數映射或選擇SQL支持以下設置:

參數

要求

默認的

描述

數據表

是的,除非指定查詢。

沒有一個

表創建或從紅移。這個參數時需要保存數據回紅移。

查詢

是的,除非指定數據表。

沒有一個

查詢閱讀從紅移。

用戶

沒有

沒有一個

紅移的用戶名。必須配合使用密碼選項。可以使用隻有在用戶和密碼不通過在URL中,都將導致一個錯誤。用戶名包含特殊字符時使用這個參數需要轉義。

密碼

沒有

沒有一個

紅移的密碼。必須配合使用用戶選擇。可以使用隻有在用戶名和密碼並不是通過在URL中;通過將導致一個錯誤。使用這個參數時,密碼包含特殊字符需要轉義。

url

是的

沒有一個

JDBC URL的格式

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

subprotocol可以postgresqlorgydF4y2Ba紅移,這取決於你加載JDBC驅動程序。一個Redshift-compatible司機必須在類路徑中,匹配這個URL。主機港口應該指出,紅移主節點,所以安全組和/或VPC必須配置為允許訪問從你的驅動程序。數據庫標識一個紅移數據庫名稱用戶密碼憑據來訪問數據庫,必須嵌入在這對JDBC URL,和您的用戶賬戶應該有必要的權限表被引用。

search_path

沒有

沒有一個

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

aws_iam_role

隻有在使用我的角色授權。

沒有一個

完全指定的攻擊我紅移複製/卸載操作的角色例如,集群與紅移攻擊:aws:我::123456789000:角色/ < redshift-iam-role >

forward_spark_s3_credentials

沒有

如果真正的,數據源自動發現火花的憑證是用來連接到S3和轉發這些憑證在JDBC紅移。這些憑據發送作為JDBC查詢的一部分,因此強烈建議啟用SSL加密的JDBC連接時使用此選項。

temporary_aws_access_key_id

沒有

沒有一個

AWS訪問密鑰,必須寫權限S3 bucket。

temporary_aws_secret_access_key

沒有

沒有一個

AWS秘密訪問密鑰對應提供訪問密鑰。

temporary_aws_session_token

沒有

沒有一個

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

tempdir

是的

沒有一個

可寫的位置在Amazon S3,用於卸載數據閱讀和Avro數據加載到寫作時紅移。如果你使用紅移數據源火花作為常規的ETL管道的一部分,它可以有用的設置生命周期策略一桶和使用它作為一個臨時的位置數據。

jdbcdriver

沒有

由JDBC URL的subprotocol決定。

要使用JDBC驅動程序的類名。這個類必須在類路徑中。在大多數情況下,它應該不需要指定這個選項,作為適當的驅動程序類名應該自動由JDBC URL的subprotocol。

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命令發表評論,而且應該出現在大多數的查詢工具。看到也描述元數據描述單個列上。

預作用

沒有

沒有一個

一個;分離在裝貨前執行的SQL命令列表複製命令。它有可能是有用的刪除命令或類似的運行在加載新數據。如果命令包含% s在執行前,表名是格式化的(如果你使用staging表)。

被警告說,如果這些命令失敗,它被視為一個錯誤,拋出異常。如果使用一個臨時表,更改恢複和備份表恢複以前如果行動失敗。

postactions

沒有

沒有一個

一個;分離的SQL命令列表成功後執行複製當加載數據。它有可能是有用的格蘭特命令或類似的運行時加載新數據。如果命令包含% s在執行前,表名是格式化的(如果你使用staging表)。

被警告說,如果這些命令失敗,它被視為一個錯誤,拋出異常。如果使用一個臨時表,更改恢複和備份表恢複如果行動失敗。

extracopyoptions

沒有

沒有一個

額外的選項列表添加到紅移複製例如,命令加載數據時TRUNCATECOLUMNSorgydF4y2BaMAXERRORn(見紅移文檔其他選項)。

因為這些選項添加到年底複製命令,隻選擇有意義的最後命令可以使用,但是這應該覆蓋最可能的用例。

tempformat(實驗)

沒有

AVRO

在S3中保存臨時文件的格式寫作時紅移。默認為AVRO;其他允許的值CSVCSVGZIP分別為CSV和gzip CSV。

紅移明顯比裝船時Avro裝船時更快的CSV文件,所以使用tempformat可能提供了一個巨大的性能提升寫作時紅移。

csvnullstring(實驗)

沒有

@NULL@

的字符串值為null當使用CSV tempformat寫。這應該是一個值,不出現在你的實際數據。

csvseparator ' '(實驗)

沒有

,

分隔符用在編寫與tempformat設置為臨時文件CSVorgydF4y2BaCSVGZIP。這一定是一個有效的ASCII字符,例如,“,”或“|”。

額外的配置選項

配置字符串列的最大大小

在創建紅移表時,默認行為是創建文本列字符串列。紅移的商店文本列如VARCHAR (256),所以這些列的最大大小是256字符()。

支持更大的列,可以使用最大長度列元數據字段指定單個字符串的最大長度列。這也是有用的實現節省空間的性能優化,宣布與最大長度小於默認列。

請注意

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

df=# dataframe你會想寫紅移#指定自定義每一列的寬度columnLengthMap={“language_code”:2,“country_code”:2,“url”:2083年,}#每一列元數據應用定製(colName,長度)columnLengthMapiteritems():元數據={最大長度的:長度}df=dfwithColumn(colName,df(colName]別名(colName,元數據=元數據))df\格式(“com.databricks.spark.redshift”)\選項(“url”,jdbcURL)\選項(“tempdir”,s3TempDirectory)\選項(“數據表”,sessionTable)\保存()

這裏有一個例子更新多個列的元數據字段使用火花的Scala API:

進口orgapache火花sql類型MetadataBuilder/ /指定自定義每一列的寬度瓦爾columnLengthMap=地圖(“language_code”- >2,“country_code”- >2,“url”- >2083年)vardf=/ / dataframe你會想寫紅移/ /每一列元數據應用定製columnLengthMapforeach{情況下(colName,長度)= >瓦爾元數據=MetadataBuilder()。putLong(“最大長度”,長度)。構建()df=dfwithColumn(colName,df(colName)。作為(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=# dataframe你會想寫紅移#每一列元數據應用定製(colName,colType)columnTypeMapiteritems():元數據={“redshift_type”:colType}df=dfwithColumn(colName,df(colName]別名(colName,元數據=元數據))
進口orgapache火花sql類型MetadataBuilder/ /指定自定義類型的每一列瓦爾columnTypeMap=地圖(“language_code”- >“CHAR (2)”,“country_code”- >“CHAR (2)”,“url”- >“BPCHAR (111)”)vardf=/ / dataframe你會想寫紅移/ /每一列元數據應用定製columnTypeMapforeach{情況下(colName,colType)= >瓦爾元數據=MetadataBuilder()。putString(“redshift_type”,colType)。構建()df=dfwithColumn(colName,df(colName)。作為(colName,元數據))}

配置列編碼

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

設置列上的描述

紅移列可以有附加的描述,應該出現在大多數查詢(使用工具評論命令)。你可以設置描述列元數據字段指定一個描述單個列。

查詢下推到紅移

火花優化器將以下運營商分成紅移:

  • 過濾器

  • 項目

  • 排序

  • 限製

  • 聚合

  • 加入

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

  • 大多數布爾邏輯運算符

  • 比較

  • 基本的算術運算

  • 數字和字符串類型轉換

  • 多數字符串函數

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

請注意

這個疊加不支持表達式操作日期和時間戳。

聚合它支持以下聚合函數:

  • AVG

  • 馬克斯

  • 最小值

  • 總和

  • STDDEV_SAMP

  • STDDEV_POP

  • VAR_SAMP

  • VAR_POP

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

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

  • 內心的加入

  • 加入

  • 正確的加入

  • 加入

  • 加入

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

請注意

加入疊加不支持完整的加入

查詢的疊加可能最有益限製。一個查詢等選擇*large_redshift_table限製10可能需要很長時間,因為整個表將首先被卸載S3作為中間結果。疊加,限製執行在紅移。與聚合查詢,將聚合分解成紅移也有助於減少需要傳輸的數據量。

查詢下推到紅移是默認啟用。它可以通過設置禁用spark.databricks.redshift.pushdown。即使殘疾,火花仍然推過濾器和執行列消除分成紅移。

事務擔保

本節描述紅移的事務保證數據源的火花。

一般背景紅移和S3屬性

紅移事務擔保一般信息,請參閱管理並發寫操作章的紅移的文檔。簡而言之,紅移可序列化的隔離根據文檔的紅移開始命令:

(雖然)您可以使用任何的四個事務隔離級別,亞馬遜紅移處理所有隔離級別是可序列化的。

根據紅移的文檔:

亞馬遜支持一個默認的紅移自動提交行為,每個separately-executed SQL命令單獨提交。

因此,個人的命令複製卸載原子和事務,而顯式開始結束應該隻需要執行多個命令或查詢的原子性。

當讀取或寫入紅移,在S3中讀取和寫入數據的數據源。火花和紅移產生分區的輸出並將其存儲在S3的多個文件。根據Amazon S3數據一致性模型文檔,S3 bucket清單操作最終一致性的,所以必須去特別的文件長度,避免丟失或不完整的數據由於最終一致性的來源。

保證紅移數據源的火花

附加到一個現有表

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

創建一個新表(SaveMode.CreateIfNotExists)

創建一個新表是一個兩步的過程,組成的創建命令之後複製命令來添加初始設置的行。操作都是在同一事務中執行。

覆蓋現有的表

默認情況下,數據源使用事務進行覆蓋,實現刪除目標表,創建一個新的空表,添加行。

如果棄用usestagingtable設置被設置為提交,數據來源刪除命令行添加新表之前,犧牲覆蓋操作的原子性但減少紅移的暫存空間需要覆蓋。

查詢紅移表

查詢使用紅移卸載命令執行一個查詢和結果保存到S3和使用體現防止某些最終一致性的S3操作。因此,從紅移數據源查詢火花應該有相同的一致性屬性作為普通紅移的查詢。

常見問題和解決方案

S3 bucket和紅移集群不同的AWS區域

默認情況下,S3 < - >紅移副本不工作如果S3 bucket和紅移在AWS不同區域集群。

如果你嚐試讀一個紅移表S3 bucket時在不同的地區,你會看到一個錯誤,如:

錯誤:S3ServiceException: S3 bucket解決不同地區的查詢從這個集群。PermanentRedirect地位301年,錯誤。

同樣,試圖編寫使用S3 bucket紅移在不同的地區可能會導致以下錯誤:

錯誤:問題閱讀清單文件——S3ServiceException: S3 bucket解決不同地區的查詢從這個集群。PermanentRedirect地位301年,錯誤
  • 寫道:紅移複製命令支持的明確規範S3 bucket地區,所以你可以寫在這些情況下通過添加紅移正常工作地區“the-region-name”extracopyoptions設置。例如,一桶在美國東部(弗吉尼亞州)地區和Scala API,使用:

    選項(“extracopyoptions”,“地區us-east-1”)

    或者可以使用awsregion設置:

    選項(“awsregion”,“us-east-1”)
  • 寫著:紅移卸載命令還支持S3 bucket地區的明確規範。你可以讀通過增加該地區的正常工作awsregion設置:

    選項(“awsregion”,“us-east-1”)

意想不到的S3ServiceException憑證錯誤當你使用S3實例配置文件進行身份驗證

如果您使用的是實例配置文件驗證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) Invalid operation: password authentication failed for user 'xyz'

這是由於特殊字符的用戶名或密碼不正確逃脫的JDBC驅動程序。一定要使用相應的DataFrame指定用戶名和密碼的選項用戶密碼。有關更多信息,請參見參數

長時間運行的火花查詢掛下去即使相應的紅移操作就完成了

如果你是讀或寫大量的數據從紅移,火花查詢可能無限期掛,即使AWS紅移監測頁麵顯示相應的負載orgydF4y2Ba卸載操作已完成,集群是空閑的。這是由於紅移之間的聯係和引發超時。為了避免這種情況,確保tcpKeepAlive啟用JDBC國旗TCPKeepAliveMinutes被設置為一個較低的值(例如,1)。

有關更多信息,請參見亞馬遜紅移JDBC驅動程序的配置

時間戳和時區的語義

在讀取數據時,兩個紅移時間戳TIMESTAMPTZ數據類型映射到火花TimestampType,和一個值轉化為協調世界時(UTC)和存儲為UTC時間戳。對於一個紅移時間戳假設,當地時區值沒有任何時區信息。寫數據到一個紅移表時,火花TimestampType映射到紅移時間戳數據類型。

遷移向導

現在需要您顯式地設置的數據源forward_spark_s3_credentials火花S3憑證之前轉發給紅移。如果你使用這種變化沒有影響aws_iam_roleorgydF4y2Batemporary_aws_ *身份驗證機製。然而,如果你依賴於舊的默認行為你現在必須顯式地設置forward_spark_s3_credentials真正的繼續使用以前的紅移S3身份驗證機製。為三個身份驗證機製的討論及其安全的權衡,看到驗證S3和紅移本文的部分。