使用AWS胶水数据目录作为一个亚矿
您可以将Databricks Runtime配置为使用AWS Glue Data Catalog作为其metastore。这可以作为Hive亚metastore的临时替代品。
每个AWS帐户在AWS区域中拥有一个目录,其目录ID与AWS帐户ID相同。使用Glue Catalog作为Databricks的metastore可以潜在地在AWS服务、应用程序或AWS帐户之间启用共享metastore。
您可以配置多个Databricks工作区来共享同一个metastore。
本文展示了如何使用实例概要安全地访问Databricks中的Glue数据目录。
需求
在部署Databricks的AWS帐户和包含Glue Data Catalog的AWS帐户中,您必须具有AWS管理员访问IAM角色和策略的权限。
如果胶水数据目录位于与Databricks部署位置不同的AWS帐户中,则a跨帐户访问策略必须允许从部署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胶水数据目录上设置策略。他们不设置相关的S3桶或对象级策略。看到使用实例概要配置S3访问为Databricks设置S3权限。
有关更多信息,请参见使用资源级IAM权限和基于资源的策略限制对AWS Glue数据目录的访问.
步骤1:创建一个实例概要文件以访问Glue Data Catalog
在AWS控制台中,进入IAM服务。
单击侧边栏中的Roles选项卡。
点击创建角色.
在“选择受信任实体类型”下,选择AWS服务.
单击EC2服务。
在“选择您的用例”下,单击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胶水资源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 >
从第一步开始,< 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版平台bob体育客户端下载所有新的Databricks帐户和大多数现有帐户现在都是E2。bob体育客户端下载如果您不确定您拥有哪种帐户类型,请与Databricks代表联系。
如果你在E2帐户:
以帐户所有者或admin帐户登录账户控制台.
去工作区然后单击您的工作区名称。
在凭证时,请注意角色ARN末尾的角色名称。
例如,在角色ARN中
攻击:aws:我::123456789123:/ finance-prod角色
其中,financial -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中创建的角色。的帐户E2版平台bob体育客户端下载:
{“版本”:“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 >”}]}
对于平台其他版本的账户:bob体育客户端下载
{“版本”:“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. databicks .hive.metastore. gluecatalog .enabled true是连接到AWS Glue的必需配置。
Spark包含对Hive的内置支持,但是否使用它取决于Databricks Runtime版本。
隔离模式:关闭对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及以上版本上,此设置也会自动启用内置模式。
限制
在Databricks中使用AWS Glue Data Catalog作为metastore,可能比默认的Hive metastore有更高的延迟。有关更多信息,请参见体验胶水目录比Databricks Hive metastore更高的延迟请参阅故障排除部分。
属性创建的默认数据库的位置设置为URI
dbfs:
(Databricks文件系统)方案。不能从Databricks以外的AWS应用程序(如AWS EMR或AWS Athena)访问此位置。作为一种变通方法,使用位置
子句来指定bucket位置,例如s3: / / mybucket
,当你打电话时创建表格
.或者,在默认数据库以外的数据库中创建表,并设置位置
将该数据库转移到S3位置。您不能在Glue Catalog和Hive metastore之间动态切换。新的Spark配置需要重新启动集群才能生效。
只有Databricks Runtime 8.4及以上版本支持凭据传递。
不支持以下特性:
跨系统交互,跨多个系统共享相同的元数据目录或实际表数据。
故障排除
本节:
与Databricks Hive metastore相比,Glue Catalog的延迟更高
使用Glue Data Catalog作为外部metastore可能会导致比默认Databricks托管的Hive metastore更高的延迟。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凭据:[EnvironmentVariableCredentialsProvider:无法从环境变量(AWS_ACCESS_KEY_ID(或AWS_ACCESS_KEY)和AWS_SECRET_ACCESS_KEY)加载AWS凭据。accessKeyId和aws.secretKey), com.amazonaws.auth.profile。ProfileCredentialsProvider@2245a35d: profile文件不能为空,com.amazonaws.auth. profile文件不能为空。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::: authenticated -role//…没有权限在资源:arn:aws:glue:::catalog(服务:AWSGlue;状态代码:400;错误码:AccessDeniedException;请求ID: < Request - ID >));
检查附加的实例概要文件是否指定了足够的权限。例如,在前面的异常中,添加胶水:GetDatabase
到实例概要文件。
权限错误胶水:GetDatabase
当直接在文件上运行SQL时
在8.0以下的Databricks Runtime版本中,当运行SQL查询时直接在文件上,例如,
选择*从拼花.`路径-来-数据`
您可能会遇到如下错误:
SQL语句错误:AnalysisException…没有权限执行:glue:GetDatabase on resource: :database/parquet
当IAM policy没有授予执行权限时,就会发生这种情况胶水:GetDatabase
关于资源数据库/ < datasource-format >
,在那里< datasource-format >
数据源格式是否为拼花
或δ
.
为IAM策略添加允许的权限胶水:GetDatabase
在数据库/ < datasource-format >
.
在Spark SQL分析器的实现中有一个限制,在返回到试图解析文件上SQL的注册数据源之前,它会尝试根据目录解析关系。只有当针对目录进行解析的初始尝试没有异常返回时,回退才有效。
尽管资源数据库/ < datasource-format >
可能不存在,为了让回退到文件上的SQL查询成功运行,Glue Catalog的IAM策略必须允许执行胶水:GetDatabase
行动起来吧。
在Databricks Runtime 8.0及以上版本中,此问题将自动处理,不再需要此解决方法。
不匹配的胶水目录ID
默认情况下,Databricks集群尝试连接到与Databricks部署使用的AWS帐户相同的Glue Catalog。
如果目标胶水目录位于与Databricks部署不同的AWS帐户或区域中,则spark.hadoop.hive.metastore.glue.catalogid
如果没有设置Spark配置,集群将连接到Databricks部署的AWS帐户中的Glue Catalog,而不是目标Catalog。
如果spark.hadoop.hive.metastore.glue.catalogid
配置是设置的,但是步骤2中的配置没有正确完成,任何对metastore的访问都会导致如下异常:
org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: MetaException(消息:无法验证默认数据库的存在:com.amazonaws.services.glue.model.AccessDeniedException: User:攻击:aws: sts:: < aws-account-id >:自选角色/ < role-id > /……没有权限在资源:arn:aws:glue:::catalog(服务:AWSGlue;状态代码:400;错误码:AccessDeniedException;请求ID: < Request - ID >));
验证配置是否与本文中的步骤2和步骤6一致。
雅典娜目录与胶水目录冲突
如果您在2017年8月14日之前使用Amazon Athena或Amazon Redshift Spectrum创建了表,则数据库和表将存储在一个Athena管理的目录中,该目录与AWS Glue数据目录分离。要将Databricks Runtime与这些表集成,必须升级到AWS Glue Data Catalog。否则,Databricks Runtime将无法连接到Glue Catalog或无法创建和访问某些数据库,并且异常消息可能是神秘的。
例如,如果“默认”数据库存在于Athena Catalog中,但不在Glue Catalog中,则会出现如下消息的异常:
无法验证默认数据库的存在:accessdeniedexception:请迁移您的Catalog以启用对该数据库的访问(Service: AWSGlue;状态代码:400;错误码:AccessDeniedException;请求ID: < Request - ID >)
在数据库中创建一个空表位置
Glue Catalog中的数据库可以从各种来源创建。由Databricks Runtime创建的数据库默认有一个非空的LOCATION字段。在Glue Console中直接创建或从其他来源导入的数据库可以有一个空位置
字段。
当Databricks运行时试图在数据库中创建一个空的表时位置
字段时,出现如下异常:
不能从空字符串创建路径
类中的有效非空路径在Glue Catalog中创建数据库位置
字段,指定位置
在SQL中创建表时,或指定选项(“路径”,< some_valid_path >
)的DataFrame API。
当您在AWS Glue控制台中创建数据库时,只需要名称;“描述”和“位置”都被标记为可选。然而,Hive metastore操作依赖于“Location”,所以你必须为Databricks Runtime中使用的数据库指定它。
访问在其他系统中创建的表和视图
访问由其他系统(如AWS Athena或Presto)创建的表和视图,在Databricks Runtime或Spark中可能工作,也可能不工作,这些操作不受支持。它们可能会失败,并发出神秘的错误消息。例如,访问由Athena、Databricks Runtime或Spark创建的视图可能会抛出如下异常:
不能从空字符串创建路径
出现此异常是因为Athena和Presto以不同于Databricks Runtime和Spark期望的格式存储视图元数据。