使用Databricks查詢Amazon Redshift
您可以使用Databricks從Amazon Redshift讀取和寫入表格。
Databricks Redshift數據源使用Amazon S3有效地在Redshift之間傳輸數據,並使用JDBC自動觸發適當的複製
而且卸載
紅移的命令。
請注意
在Databricks Runtime 11.2及以上版本中,Databricks Runtime包含了Redshift JDBC驅動程序紅移
關鍵字的格式選項。看到磚的運行時版本用於每個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在對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
文件係統,添加:sc.hadoopConfiguration.集(“fs.s3a.access.key”,“< your-access-key-id >”)sc.hadoopConfiguration.集(“fs.s3a.secret.key”,“< your-secret-key >”)
的遺產
s3n
文件係統,添加:sc.hadoopConfiguration.集(“fs.s3n.awsAccessKeyId”,“< your-access-key-id >”)sc.hadoopConfiguration.集(“fs.s3n.awsSecretAccessKey”,“< your-secret-key >”)
以下命令依賴於一些Spark內部組件,但應該適用於所有PySpark版本,並且在未來不太可能更改:
sc._jsc.hadoopConfiguration().集(“fs.s3a.access.key”,“< your-access-key-id >”)sc._jsc.hadoopConfiguration().集(“fs.s3a.secret.key”,“< your-secret-key >”)
通過擔任IAM角色:可以使用實例配置文件可以承擔的IAM角色。要指定角色ARN,必須將實例概要文件附加到集群,並提供以下配置鍵:
sc.hadoopConfiguration.集(“fs.s3a.credentialsType”,“AssumeRole”)sc.hadoopConfiguration.集(“fs.s3a.stsAssumeRole.arn”,<我-角色-在攻擊-來-是-假定>)//一個可選的持續時間,用數量和的單位表示//時間,如"15m"或"1h"sc.hadoopConfiguration.集(“fs.s3a.assumed.role.session.duration”,<持續時間>)
sc._jsc.hadoopConfiguration().集(“fs.s3a.credentialsType”,“AssumeRole”)sc._jsc.hadoopConfiguration().集(“fs.s3a.stsAssumeRole.arn”,<我-角色-在攻擊-來-是-假定>)可選的持續時間,用數量和單位表示#時間,如“15m”或“1h”sc._jsc.hadoopConfiguration().集(“fs.s3a.assumed.role.session.duration”,<持續時間>)
紅移到S3
期間Redshift也連接到S3複製
而且卸載
查詢。有三種驗證此連接的方法:
讓Redshift承擔IAM角色(最安全):在訪問IAM時,可授予Redshift權限
複製
orgydF4y2Ba卸載
操作,然後配置數據源來指示Redshift使用該角色:創建一個IAM角色,為你的桶授予適當的S3權限。
跟著導遊授權Amazon Redshift以您的名義訪問其他AWS服務配置該角色的信任策略,以允許Redshift承擔該角色。
的步驟通過IAM角色授權COPY和UNLOAD操作如何將該IAM角色與Redshift集群關聯。
設置數據源
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_id
,temporary_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”,“假”)
在你的DataFrameReader
orgydF4y2BaDataFrameWriter
.如果你想指定自定義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中讀取的查詢。 |
用戶 |
沒有 |
沒有一個 |
紅移的用戶名。必須與密碼選項一起使用。隻有在URL中沒有傳遞用戶和密碼的情況下才可以使用,因為同時傳遞用戶和密碼將導致錯誤。當用戶名中包含需要轉義的特殊字符時,使用此參數。 |
密碼 |
沒有 |
沒有一個 |
紅移的密碼。必須與 |
url |
是的 |
沒有一個 |
JDBC URL,格式為 jdbc: subprotocol: / / <主機>:<端口> /數據庫?用戶= <用戶名>密碼= <密碼>
|
search_path |
沒有 |
沒有一個 |
在Redshift中設置模式搜索路徑。將使用 |
aws_iam_role |
僅當使用IAM角色進行授權時。 |
沒有一個 |
的完全指定ARNIAM Redshift COPY/UNLOAD operations角色附加到Redshift集群,例如, |
forward_spark_s3_credentials |
沒有 |
|
如果 |
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 |
沒有 |
|
紅移分布的風格在創建表時使用。可以是 |
distkey |
不,除非使用 |
沒有一個 |
表中要在創建表時用作分發鍵的列的名稱。 |
sortkeyspec |
沒有 |
沒有一個 |
一個完整的紅移排序關鍵字定義。例子包括:
|
usestagingtable(棄用) |
沒有 |
|
將此已棄用選項設置為 因為設置 |
描述 |
沒有 |
沒有一個 |
表的描述。將使用SQL COMMENT命令設置,並且應該顯示在大多數查詢工具中。看到也 |
預作用 |
沒有 |
沒有一個 |
一個 請注意,如果這些命令失敗,將被視為錯誤並拋出異常。如果使用staging表,則在預操作失敗時將恢複更改並恢複備份表。 |
postactions |
沒有 |
沒有一個 |
一個 請注意,如果這些命令失敗,將被視為錯誤並拋出異常。如果使用staging表,如果後期操作失敗,則恢複更改並恢複備份表。 |
extracopyoptions |
沒有 |
沒有一個 |
附加到紅移的額外選項列表 的末尾附加了這些選項 |
tempformat(實驗) |
沒有 |
|
寫入Redshift時在S3中保存臨時文件的格式。默認為 在加載CSV文件時,Redshift比加載Avro文件要快得多,因此在寫入Redshift時,使用該tempformat可能會提供很大的性能提升。 |
csvnullstring(實驗) |
沒有 |
|
使用CSV tempformat時寫入為空的字符串值。這應該是一個沒有出現在實際數據中的值。 |
csvseparator ' '(實驗) |
沒有 |
|
在寫入tempformat設置為的臨時文件時要使用的分隔符 |
額外的配置選項
配置字符串列的最大大小
當創建紅移表時,默認的行為是創建文本
列用於字符串列。紅移的商店文本
列如VARCHAR (256)
,因此這些列的最大長度為256個字符(源).
要支持更大的列,可以使用最大長度
列元數據字段指定單個字符串列的最大長度。通過聲明最大長度小於默認值的列,這對於實現節省空間的性能優化也很有用。
請注意
由於Spark本身的限製,SQL和R語言api不支持修改列元數據。
df=...#你要寫入Redshift的數據幀#指定每個列的自定義寬度columnLengthMap={“language_code”:2,“country_code”:2,“url”:2083,}#應用每個列元數據定製為(colName,長度)在columnLengthMap.iteritems():元數據={最大長度的:長度}df=df.withColumn(colName,df[colName].別名(colName,元數據=元數據))df.寫\.格式(“com.databricks.spark.redshift”)\.選項(“url”,jdbcURL)\.選項(“tempdir”,s3TempDirectory)\.選項(“數據表”,sessionTable)\.保存()
下麵是一個使用Spark的Scala API更新多列元數據字段的例子:
進口org.apache.火花.sql.類型.MetadataBuilder//指定每個列的自定義寬度瓦爾columnLengthMap=地圖(“language_code”->2,“country_code”->2,“url”->2083)vardf=...//你想要寫入Redshift的數據幀//應用每個列元數據自定義columnLengthMap.foreach{情況下(colName,長度)= >瓦爾元數據=新MetadataBuilder()。putLong(“最大長度”,長度).構建()df=df.withColumn(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=...#你要寫入Redshift的數據幀#應用每個列元數據定製為(colName,colType)在columnTypeMap.iteritems():元數據={“redshift_type”:colType}df=df.withColumn(colName,df[colName].別名(colName,元數據=元數據))
進口org.apache.火花.sql.類型.MetadataBuilder//指定每個列的自定義類型瓦爾columnTypeMap=地圖(“language_code”->“CHAR(2)”,“country_code”->“CHAR(2)”,“url”->“BPCHAR(111)”)vardf=...//你想要寫入Redshift的數據幀//應用每個列元數據自定義columnTypeMap.foreach{情況下(colName,colType)= >瓦爾元數據=新MetadataBuilder()。putString(“redshift_type”,colType).構建()df=df.withColumn(colName,df(colName).作為(colName,元數據))}
配置列編碼
創建表時,使用編碼
列元數據字段指定每個列的壓縮編碼(參見亞馬遜文檔可用的編碼)。
查詢下推到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驅動程序。
請注意
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數據源保證
創建一個新表(SaveMode。CreateIfNotExists
)
創建新表的過程分為兩個步驟,包括創建表格
命令後接複製命令附加初始行集。兩個操作都在同一個事務中執行。
常見問題及解決方案
S3桶和Redshift集群在不同的AWS區域
S3桶和Redshift集群在不同AWS區域時,默認情況下,S3 <-> Redshift副本不生效。
當S3桶在不同的區域時,如果你試圖讀取Redshift表,你可能會看到如下錯誤:
ERROR: S3ServiceException:查詢所尋的S3桶位於與此集群不同的區域。PermanentRedirect地位301年,錯誤。
類似地,嚐試使用不同區域的S3桶寫入Redshift可能會導致以下錯誤:
錯誤:問題讀取清單文件- S3ServiceException:查詢所尋的S3桶與該集群在不同的區域。PermanentRedirect地位301年,錯誤
當您使用實例概要文件對S3進行身份驗證時,意外的S3ServiceException憑據錯誤
如果你正在使用實例配置文件向S3進行身份驗證並接收一個意外的消息S3ServiceException
錯誤,檢查AWS訪問鍵是否在tempdir
S3 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卸載
操作已完成,集群處於空閑狀態。這是由紅移和火花超時之間的聯係造成的。為了避免這種情況,請確保tcpKeepAlive
JDBC標誌已啟用,並且TCPKeepAliveMinutes
設置為較低的值(例如,1)。
有關其他信息,請參見Amazon Redshift JDBC驅動程序配置.
遷移向導
數據源現在需要顯式設置forward_spark_s3_credentials
在Spark S3證書被轉發到Redshift之前。方法時,此更改沒有影響aws_iam_role
orgydF4y2Batemporary_aws_ *
身份驗證機製。但是,如果您依賴舊的默認行為,那麼現在必須顯式地進行設置forward_spark_s3_credentials
來真正的
繼續使用之前的Redshift到S3認證機製。有關這三種身份驗證機製及其安全性權衡的討論,請參見S3和Redshift鑒權部分。