使用AWS膠水數據目錄作為一個轉移體
您可以配置Databricks運行時使用AWS Glue數據目錄作為它的轉移庫。這可以作為Hive轉移瘤的臨時替代物。
每個AWS帳戶在AWS區域中擁有一個目錄,其目錄ID與AWS帳戶ID相同。使用Glue Catalog作為Databricks的轉移庫可以潛在地在AWS服務、應用程序或AWS帳戶之間啟用共享轉移庫。
您可以配置多個Databricks工作空間來共享相同的metastore。
本文展示了如何使用實例概要安全地訪問Databricks中的Glue Data Catalog。
需求
您必須在部署了Databricks的AWS帳戶和包含Glue Data Catalog的AWS帳戶中擁有AWS管理員訪問IAM角色和策略的權限。
如果Glue數據目錄與部署Databricks的AWS帳戶不同,則across-account訪問政策必須允許從部署Databricks的AWS帳戶訪問目錄。注意,我們隻支持使用Glue的資源策略授予跨帳戶訪問。
內置模式要求Databricks Runtime 8.4及以上版本,或Databricks Runtime 7.3 LTS。
將Glue Data Catalog配置為metastore
要啟用Glue Catalog集成,請設置火花配置spark.databricks.hive.metastore.glueCatalog.enabled真正的
.默認情況下禁用此配置。也就是說,默認是使用Databricks托管的Hive metastore,或者如果配置了其他一些外部metastore。
對於交互集群或作業集群,請在集群配置中設置配置之前集群啟動。
重要的
這種配置選項不能在運行中的集群中修改。
運行時spark-submit
方法中設置此配置選項spark-submit
參數使用——設計spark.databricks.hive.metastore.glueCatalog.enabled = true
或者在代碼中設置之前創建SparkSession
或SparkContext
.例如:
從pyspark.sql進口SparkSession#在這裏直接設置Glue的conf,而不是使用spark-submit中的——conf選項火花=SparkSession.構建器.\瀏覽器名稱(“ExamplePySparkSubmitTask”).\配置(“spark.databricks.hive.metastore.glueCatalog.enabled”,“真正的”).\enableHiveSupport().\getOrCreate()打印(火花.sparkContext.getConf().得到(“spark.databricks.hive.metastore.glueCatalog.enabled”))火花.sql(“顯示數據庫”).顯示()火花.停止()
如何配置Glue Catalog訪問取決於Databricks和Glue Catalog是在相同的AWS帳戶和區域中,還是在不同的帳戶中,還是在不同的區域中。遵循本文其餘部分的適當步驟:
相同的AWS帳戶和地區:按照步驟1,然後是步驟3-5。
Cross-account:參考步驟1-6。
區域:按照步驟1,然後是步驟3-6。
重要的
AWS Glue Data Catalog策略隻定義對元數據的訪問權限。S3策略定義對內容本身的訪問權限。這些步驟在AWS Glue Data Catalog上設置了一個策略。他們不建立相關的S3桶或對象級策略。看到使用實例配置文件安全訪問S3桶為Databricks設置S3權限。
步驟1:創建一個實例概要來訪問Glue Data Catalog
在AWS控製台中,進入IAM服務。
單擊側邊欄中的Roles選項卡。
點擊創建角色.
在“選擇信任實體類型”下,選擇AWS服務.
單擊EC2服務。
在Select your use case下,單擊EC2.
點擊下一個:權限並點擊下一個:審查.
在“角色名稱”字段中,鍵入角色名稱。
點擊創建角色.將顯示角色列表。
在角色列表中,單擊角色。
向Glue Catalog添加內聯策略。
在“權限”選項卡中,單擊.
單擊JSON選項卡。
將此策略複製並粘貼到選項卡中。
{“版本”:“2012-10-17”,“聲明”:[{“席德”:“GrantCatalogAccessToGlue”,“效應”:“允許”,“行動”:[“膠:BatchCreatePartition”,“膠:BatchDeletePartition”,“膠:BatchGetPartition”,“膠:CreateDatabase”,“膠:不知道”,“膠:CreateUserDefinedFunction”,“膠:DeleteDatabase”,“膠:DeletePartition”,“膠:DeleteTable”,“膠:DeleteUserDefinedFunction”,“膠:GetDatabase”,“膠:getdatabase”,“膠:GetPartition”,“膠:GetPartitions”,“膠:可以獲得的”,“膠:可以獲得的”,“膠:GetUserDefinedFunction”,“膠:GetUserDefinedFunctions”,“膠:UpdateDatabase”,“膠:UpdatePartition”,“膠:UpdateTable”,“膠:UpdateUserDefinedFunction”),“資源”:[“*”]}]}
有關所允許的資源(目錄、數據庫、表、userDefinedFunction)的細粒度配置,請參見指定AWS Glue資源arn.
如果上述策略中允許的操作列表不夠,請將錯誤信息與Databricks代表聯係。最簡單的解決方法是使用一個策略來提供對Glue的完全訪問:
{“版本”:“2012-10-17”,“聲明”:[{“席德”:“GrantFullAccessToGlue”,“效應”:“允許”,“行動”:[“膠:*”),“資源”:“*”}]}
步驟2:為目標Glue Catalog創建一個策略
隻有在目標Glue Catalog中,才執行此步驟不同的AWS帳戶而不是用於Databricks部署的。
登錄到目標Glue Catalog的AWS帳戶,並進入Glue控製台。
在設置中,將以下策略粘貼到“權限”框中。集
< aws-account-id-databricks >
,< iam-role-for-glue-access >
從步驟1,< aws-region-target-glue-catalog >
,< aws-account-id-target-glue-catalog >
相應地,。{“版本”:“2012-10-17”,“聲明”:[{“席德”:“許可”,“效應”:“允許”,“校長”:{“AWS”:“攻擊:aws:我::< aws-account-id-databricks >:角色/ < iam-role-for-glue-access >”},“行動”:[“膠:BatchCreatePartition”,“膠:BatchDeletePartition”,“膠:BatchGetPartition”,“膠:CreateDatabase”,“膠:不知道”,“膠:CreateUserDefinedFunction”,“膠:DeleteDatabase”,“膠:DeletePartition”,“膠:DeleteTable”,“膠:DeleteUserDefinedFunction”,“膠:GetDatabase”,“膠:getdatabase”,“膠:GetPartition”,“膠:GetPartitions”,“膠:可以獲得的”,“膠:可以獲得的”,“膠:GetUserDefinedFunction”,“膠:GetUserDefinedFunctions”,“膠:UpdateDatabase”,“膠:UpdatePartition”,“膠:UpdateTable”,“膠:UpdateUserDefinedFunction”),“資源”:“攻擊:aws:膠:< aws-region-target-glue-catalog >: < aws-account-id-target-glue-catalog >: *”}]}
步驟3:查找用於創建Databricks部署的IAM角色
此IAM角色為設置Databricks帳號時使用的角色。
帳戶的以下步驟不同E2版本平台Beplay体育安卓版本所有新的Databricks帳戶和大多數現有帳戶現在都是E2。Beplay体育安卓版本如果您不確定您擁有的帳戶類型,請與您的Databricks代表聯係。
如果你在E2帳戶:
以帳戶所有者或帳戶admin登錄賬戶控製台.
去工作區然後單擊您的工作區名稱。
在憑證框中,請注意role ARN末尾的角色名稱。
例如,在ARN角色中
攻擊:aws:我::123456789123:/ finance-prod角色
其中,finance-prod為角色名。
如果您沒有E2賬戶:
以帳戶所有者身份登錄賬戶控製台.
單擊AWS帳戶選項卡。
注意role ARN末尾的角色名testco-role.
步驟4:將Glue Catalog實例配置文件添加到EC2策略
在AWS控製台中,進入IAM服務。
單擊角色選項卡。
單擊步驟3中提到的角色。
在Permissions選項卡上,單擊策略。
點擊編輯政策.
修改策略,以允許Databricks將您在步驟1中創建的實例配置文件傳遞給Spark集群的EC2實例。下麵是一個新政策應該是什麼樣子的例子。取代
< iam-role-for-glue-access >
使用您在步驟1中創建的角色。-
{“版本”:“2012-10-17”,“聲明”:[{“席德”:“Stmt1403287045000”,“效應”:“允許”,“行動”:[“ec2: AssociateDhcpOptions”,“ec2: AssociateIamInstanceProfile”,“ec2: AssociateRouteTable”,“ec2: AttachInternetGateway”,“ec2: AttachVolume”,“ec2: AuthorizeSecurityGroupEgress”,“ec2: AuthorizeSecurityGroupIngress”,“ec2: CancelSpotInstanceRequests”,“ec2: CreateDhcpOptions”,“ec2: CreateInternetGateway”,“ec2: CreatePlacementGroup”,“ec2: CreateRoute”,“ec2: CreateSecurityGroup”,“ec2: CreateSubnet”,“ec2: CreateTags”,“ec2: CreateVolume”,“ec2: CreateVpc”,“ec2: CreateVpcPeeringConnection”,“ec2: DeleteInternetGateway”,“ec2: DeletePlacementGroup”,“ec2: DeleteRoute”,“ec2: DeleteRouteTable”,“ec2: DeleteSecurityGroup”,“ec2: DeleteSubnet”,“ec2: DeleteTags”,“ec2: DeleteVolume”,“ec2: DeleteVpc”,“ec2: DescribeAvailabilityZones”,“ec2: DescribeIamInstanceProfileAssociations”,“ec2: DescribeInstanceStatus”,“ec2: DescribeInstances”,“ec2: DescribePlacementGroups”,“ec2: DescribePrefixLists”,“ec2: DescribeReservedInstancesOfferings”,“ec2: DescribeRouteTables”,“ec2: DescribeSecurityGroups”,“ec2: DescribeSpotInstanceRequests”,“ec2: DescribeSpotPriceHistory”,“ec2: DescribeSubnets”,“ec2: DescribeVolumes”,“ec2: DescribeVpcs”,“ec2: DetachInternetGateway”,“ec2: DisassociateIamInstanceProfile”,“ec2: ModifyVpcAttribute”,“ec2: ReplaceIamInstanceProfileAssociation”,“ec2: RequestSpotInstances”,“ec2: RevokeSecurityGroupEgress”,“ec2: RevokeSecurityGroupIngress”,“ec2: RunInstances”,“ec2: TerminateInstances”),“資源”:[“*”]},{“效應”:“允許”,“行動”:“我:PassRole”,“資源”:“攻擊:aws:我::< aws-account-id-databricks >:角色/ < iam-role-for-glue-access >”}]}
對於其他版本平台上的賬戶:Beplay体育安卓版本
{“版本”:“2012-10-17”,“聲明”:[{“席德”:“Stmt1403287045000”,“效應”:“允許”,“行動”:[“ec2: AssociateDhcpOptions”,“ec2: AssociateIamInstanceProfile”,“ec2: AssociateRouteTable”,“ec2: AttachInternetGateway”,“ec2: AttachVolume”,“ec2: AuthorizeSecurityGroupEgress”,“ec2: AuthorizeSecurityGroupIngress”,“ec2: CancelSpotInstanceRequests”,“ec2: CreateDhcpOptions”,“ec2: CreateInternetGateway”,“ec2: CreateKeyPair”,“ec2: CreateRoute”,“ec2: CreateSecurityGroup”,“ec2: CreateSubnet”,“ec2: CreateTags”,“ec2: CreateVolume”,“ec2: CreateVpc”,“ec2: CreateVpcPeeringConnection”,“ec2: DeleteInternetGateway”,“ec2: DeleteKeyPair”,“ec2: DeleteRoute”,“ec2: DeleteRouteTable”,“ec2: DeleteSecurityGroup”,“ec2: DeleteSubnet”,“ec2: DeleteTags”,“ec2: DeleteVolume”,“ec2: DeleteVpc”,“ec2: DescribeAvailabilityZones”,“ec2: DescribeIamInstanceProfileAssociations”,“ec2: DescribeInstanceStatus”,“ec2: DescribeInstances”,“ec2: DescribePrefixLists”,“ec2: DescribeReservedInstancesOfferings”,“ec2: DescribeRouteTables”,“ec2: DescribeSecurityGroups”,“ec2: DescribeSpotInstanceRequests”,“ec2: DescribeSpotPriceHistory”,“ec2: DescribeSubnets”,“ec2: DescribeVolumes”,“ec2: DescribeVpcs”,“ec2: DetachInternetGateway”,“ec2: DisassociateIamInstanceProfile”,“ec2: ModifyVpcAttribute”,“ec2: ReplaceIamInstanceProfileAssociation”,“ec2: RequestSpotInstances”,“ec2: RevokeSecurityGroupEgress”,“ec2: RevokeSecurityGroupIngress”,“ec2: RunInstances”,“ec2: TerminateInstances”),“資源”:[“*”]},{“效應”:“允許”,“行動”:“我:PassRole”,“資源”:“攻擊:aws:我::< aws-account-id-databricks >:角色/ < iam-role-for-glue-access >”}]}
-
點擊審查政策.
點擊保存更改.
步驟5:將Glue Catalog實例配置文件添加到Databricks工作區
轉到管理控製台。
單擊實例配置文件選項卡。
單擊添加實例配置文件按鈕。出現一個對話框。
粘貼步驟1中的實例概要ARN。
Databricks驗證該實例概要ARN在語法和語義上都是正確的。為了驗證語義的正確性,Databricks通過使用這個實例概要啟動一個集群進行了一次演練。這個試運行中的任何失敗都會在UI中產生驗證錯誤。
請注意
如果實例配置文件包含標記強製策略,則實例配置文件的驗證可能失敗,從而阻止您添加合法的實例配置文件。如果驗證失敗,您仍然希望將實例配置文件添加到Databricks,請使用實例配置文件API並指定
skip_validation
.點擊添加.
可選地指定可以使用實例概要文件啟動集群的用戶。
步驟6:使用Glue Catalog實例概要啟動一個集群
創建一個集群。
單擊實例頁簽。
在實例配置文件下拉列表,選擇實例概要文件。
驗證您是否可以訪問Glue Catalog,在筆記本中使用以下命令:
顯示數據庫;
如果命令成功,則將這個Databricks Runtime集群配置為使用Glue。根據您的AWS帳戶和Glue區域的不同,您可能需要執行另外兩個步驟:
如果Databricks部署的AWS帳戶和Glue Data Catalog的AWS帳戶不同,則需要額外的跨帳戶設置。
集
spark.hadoop.hive.metastore.glue.catalogid< aws-account-id-for-glue-catalog >
在火花配置.如果目標Glue Catalog與Databricks部署在不同的區域,也要指定
spark.hadoop.aws.region< aws-region-for-glue-catalog >
.
提示
提醒一下,spark.databricks.hive. metastre . gluecatalog .enabled true是連接到AWS Glue的必要配置。
Spark包括對Hive的內置支持,但是否使用取決於Databricks的運行時版本。
隔離模式:關閉Hive的內置支持。Hive 1.2.1的庫。Spark2從
/磚/膠水/
.在Databricks Runtime 8.3中,隔離模式已啟用,且不能禁用。在Databricks Runtime 7.3 LTS和Databricks Runtime 8.4及以上版本中,隔離模式是默認的,但可以禁用。內置模式:開啟內置Hive支持,Hive版本以Spark版本為準。在Databricks Runtime 7.3 LTS和Databricks Runtime 8.4及以上版本中,可以通過設置啟用內置模式
spark.databricks.hive.metastore.glueCatalog.isolation.enabled假
在集群上。
若要啟用憑據傳遞,請設置
spark.databricks.passthrough.enabled真正的
.這需要Databricks Runtime 7.3 LTS或Databricks Runtime 8.4或以上版本。在Databricks Runtime 7.3 LTS和Databricks Runtime 8.4及以上版本上,此設置也會自動啟用內置模式。
限製
使用AWS Glue Data Catalog作為Databricks中的轉移存儲比默認的Hive轉移存儲具有更高的潛在延遲。有關更多信息,請參見Glue Catalog比Databricks Hive metastore有更高的延遲在故障處理部分。
創建默認數據庫時,將位置設置為URI
dbfs:
(Databricks文件係統)方案。此位置不能從Databricks以外的AWS應用程序訪問,如AWS EMR或AWS Athena。作為解決方法,請使用位置
子句來指定桶位置,例如s3: / / mybucket
,當你打電話時創建表格
.或者,在默認數據庫以外的數據庫中創建表,並設置位置
到S3位置。您不能在Glue Catalog和Hive metastore之間動態切換。新的Spark配置需要重新啟動集群才能生效。
僅在Databricks Runtime 8.4及以上版本中支持憑據傳遞。
不支持以下特性:
跨係統的交互
故障排除
在本節中:
Glue Catalog比Databricks Hive metastore有更高的延遲
使用Glue Data Catalog作為外部轉移存儲可能會比默認的Databricks托管的Hive轉移存儲產生更高的延遲。Databricks建議在Glue Catalog客戶端中啟用客戶端緩存。下麵幾節介紹如何為表和數據庫配置客戶端緩存。的客戶端緩存集群而且SQL倉庫.
請注意
客戶端緩存不能用於清單表操作
可以獲得的
.生存時間(TTL)配置是在緩存的有效性和可容忍的元數據陳舊性之間進行權衡的結果。選擇適合特定場景的TTL值。
有關更多細節,請參見為Glue Catalog啟用客戶端緩存在AWS文檔中。
沒有實例配置文件附加到Databricks Runtime集群
如果沒有實例配置文件附加到Databricks Runtime集群,那麼當您運行任何需要metastore查找的操作時,會發生以下異常:
org.apache.spark.sql.AnalysisException: Java .lang. runtimeexception: com.amazonaws.SdkClientException:無法從鏈中的任何提供者加載AWS憑證:[EnvironmentVariableCredentialsProvider:無法從環境變量(AWS_ACCESS_KEY_ID(或AWS_ACCESS_KEY)和AWS_SECRET_KEY(或AWS_SECRET_ACCESS_KEY))加載AWS憑證,SystemPropertiesCredentialsProvider:無法從Java係統屬性(AWS .lang. runtimeexception: com.amazonaws.SdkClientException:無法從鏈中的任何提供者加載AWS憑證。accessKeyId和aws.secretKey)。ProfileCredentialsProvider@2245a35d:配置文件不能為空,com.amazonaws.auth。EC2ContainerCredentialsProviderWrapper@52be6b57: The requested metadata is not found at https://169.254.169.254/latest/meta-data/iam/security-credentials/];
附加一個實例概要文件,該實例概要文件具有訪問所需Glue Catalog的足夠權限。
膠水目錄權限不足
當實例配置文件沒有授予執行metastore操作所需的權限時,會出現如下異常:
org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: MetaException(message:Unable to verify exist of default database: com.amazonaws.services.glue.model.AccessDeniedException: User: arn:aws:sts::: hypomed -role//…沒有權限執行:glue: GetDatabase on resource: arn:aws:glue:::catalog (Service: AWSGlue;狀態碼:400;錯誤代碼:AccessDeniedException;請求ID: <請求ID >);
檢查附加的實例配置文件是否指定了足夠的權限。例如,在前麵的異常中,添加膠水:GetDatabase
實例概要文件。
允許錯誤膠水:GetDatabase
當直接在文件上運行SQL時
在Databricks Runtime 8.0以下版本中,當運行SQL查詢時直接在文件例如,
選擇*從拚花.`路徑-來-數據`
您可能會遇到如下錯誤:
SQL語句錯誤:AnalysisException…:database/parquet
當IAM policy沒有授予執行權限時,會發生這種情況膠水:GetDatabase
在資源上數據庫/ < datasource-format >
,在那裏< datasource-format >
數據源格式是否為拚花
或δ
.
在IAM policy中添加允許的權限膠水:GetDatabase
在數據庫/ < datasource-format >
.
在Spark SQL分析器的實現中有一個限製,它在回落到嚐試針對文件上的SQL的注冊數據源解析之前,會嚐試針對編目解析關係。隻有當針對目錄解析的初始嚐試返回而沒有異常時,回退才會工作。
即使資源數據庫/ < datasource-format >
可能不存在,為了回退到文件上的SQL查詢成功運行,IAM policy for Glue Catalog必須允許執行膠水:GetDatabase
行動。
在Databricks Runtime 8.0及以上版本中,此問題將自動處理,不再需要此解決方法。
不匹配的膠水目錄ID
默認情況下,Databricks集群嚐試在與Databricks部署使用的AWS帳戶相同的AWS帳戶中連接到Glue Catalog。
如果目標Glue Catalog位於與Databricks部署不同的AWS帳戶或區域中,則spark.hadoop.hive.metastore.glue.catalogid
如果沒有設置Spark配置,集群將連接到Databricks部署的AWS帳戶中的Glue Catalog,而不是目標目錄。
如果spark.hadoop.hive.metastore.glue.catalogid
如果未正確執行步驟2中的配置,則任何對metastore的訪問都會導致如下異常:
org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: MetaException(message:Unable to verify exists of default database: com.amazonaws.services.glue.model.AccessDeniedException: User:攻擊:aws: sts:: < aws-account-id >:自選角色/ < role-id > /……沒有權限執行:glue: GetDatabase on resource: arn:aws:glue:::catalog (Service: AWSGlue;狀態碼:400;錯誤代碼:AccessDeniedException;請求ID: <請求ID >);
驗證配置是否與本文中的步驟2和步驟6一致。
雅典娜目錄與膠水目錄衝突
如果您在2017年8月14日前使用Amazon Athena或Amazon Redshift Spectrum創建了表,則數據庫和表將存儲在Athena管理的目錄中,該目錄與AWS Glue數據目錄是獨立的。要將Databricks運行時與這些表集成,必須升級到AWS Glue數據目錄。否則,Databricks Runtime將無法連接到Glue Catalog或無法創建和訪問某些數據庫,異常消息可能是神秘的。
例如,如果“default”數據庫存在於Athena Catalog中,但不在Glue Catalog中,則會出現一個異常,消息如下:
AWSCatalogMetastoreClient:無法驗證默認數據庫的存在accessdeniedexception:請遷移您的Catalog以啟用對該數據庫的訪問(Service: AWSGlue;狀態碼:400;錯誤代碼:AccessDeniedException;請求ID: <請求ID >)
在數據庫中創建一個空的表位置
Glue Catalog中的數據庫可以從各種來源創建。默認情況下,由Databricks Runtime創建的數據庫有一個非空的LOCATION字段。直接在Glue Console中創建或從其他來源導入的數據庫可能有一個空位置
字段。
當Databricks Runtime試圖在數據庫中創建一個空的表時位置
字段時,異常發生如下:
不能從空字符串中創建路徑
中使用有效的非空路徑在Glue Catalog中創建數據庫位置
字段中,指定位置
創建SQL表時,或指定選項(“路徑”,< some_valid_path >
)中的DataFrame API。
當您在AWS Glue Console中創建數據庫時,隻需要名稱;“描述”和“位置”都被標記為可選。然而,Hive metastore操作依賴於“Location”,所以你必須為將在Databricks運行時中使用的數據庫指定它。
訪問在其他係統中創建的表和視圖
訪問由其他係統(如AWS Athena或Presto)創建的表和視圖可能在Databricks Runtime或Spark中工作,也可能不能,這些操作不受支持。它們可能會因神秘的錯誤消息而失敗。例如,訪問由Athena、Databricks Runtime或Spark創建的視圖可能會拋出如下異常:
不能從空字符串中創建路徑
發生此異常是因為Athena和Presto以不同於Databricks Runtime和Spark所期望的格式存儲視圖元數據。