使用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或者在代码中设置之前创建SparkSessionSparkContext.例如:

pyspark.sql进口SparkSession#直接在这里设置Glue conf,而不是使用spark-submit中的——conf选项火花SparkSession构建器浏览器名称“ExamplePySparkSubmitTask”配置“spark.databricks.hive.metastore.glueCatalog.enabled”“真正的”enableHiveSupport()getOrCreate()打印火花sparkContextgetConf()得到“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

  1. 在AWS控制台中,进入IAM服务。

  2. 单击侧边栏中的Roles选项卡。

  3. 点击创建角色

    1. 在“选择受信任实体类型”下,选择AWS服务

    2. 单击EC2服务。

    3. 在“选择您的用例”下,单击EC2

      选择服务
    4. 点击下一个:权限并点击下一个:审查

    5. 在角色名字段中,键入角色名。

    6. 点击创建角色.将显示角色列表。

  4. 在角色列表中,单击角色。

  5. 向Glue Catalog添加内联策略。

    1. 在“权限”页签中,单击内联政策

    2. 单击JSON选项卡。

    3. 将此策略复制并粘贴到选项卡中。

      “版本”“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部署的。

  1. 登录目标Glue Catalog的AWS帐户,并转到Glue控制台。

  2. 在“设置”中,将以下策略粘贴到“权限”框。集< 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帐户

  1. 以帐户所有者或admin帐户登录账户控制台

  2. 工作区然后单击您的工作区名称。

  3. 凭证时,请注意角色ARN末尾的角色名称。

    例如,在角色ARN中攻击:aws:我::123456789123:/ finance-prod角色其中,financial -prod为角色名。

如果您不是E2帐户:

  1. 以帐户所有者登录账户控制台

  2. 单击AWS帐户选项卡。

  3. 请注意role ARN末尾的角色名称testco-role

    我的角色

步骤4:将Glue Catalog实例概要文件添加到EC2策略

  1. 在AWS控制台中,进入IAM服务。

  2. 单击角色选项卡。

  3. 单击步骤3中记录的角色。

  4. 在Permissions选项卡上,单击策略。

  5. 点击编辑政策

  6. 修改策略,允许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 >”
  7. 点击审查政策

  8. 点击保存更改

步骤5:将Glue Catalog实例概要文件添加到Databricks工作区

  1. 进入管理控制台。

  2. 单击实例配置文件选项卡。

  3. 单击添加实例配置文件按钮。出现一个对话框。

  4. 粘贴步骤1中的实例配置文件ARN。

    实例配置文件ARN

    Databricks验证该实例概要ARN在语法和语义上都是正确的。为了验证语义的正确性,Databricks通过使用这个实例概要启动一个集群来进行演练。这个演练中的任何失败都会在UI中产生验证错误。

    请注意

    如果实例概要文件包含标记强制策略,则实例概要文件的验证可能失败,从而阻止您添加合法的实例概要文件。如果验证失败,您仍然希望将实例概要文件添加到Databricks,请使用实例概要文件API并指定skip_validation

  5. 点击添加

  6. 可选地指定可以使用实例概要启动集群的用户。

    添加用户

步骤6:使用Glue Catalog实例概要启动集群

  1. 创建集群。

  2. 单击实例页签。

  3. 实例配置文件下拉列表,选择实例配置文件。

    选择实例概要
  4. 在笔记本中使用以下命令,验证您可以访问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的必需配置。

  5. 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集群上。

  6. 若要启用凭据传递,请设置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更高的延迟请参阅故障排除部分。

  • 属性创建的默认数据库的位置设置为URIdbfs:(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文档中。

spark.hadoop.aws.glue.cache.table.enable真实spark.hadoop.aws.glue.cache.table.size 1000spark.hadoop.aws.glue.cache.table。ttl-mins 30

数据库

spark.hadoop.aws.glue.cache.db.enable真实spark.hadoop.aws.glue.cache.db.size 1000spark.hadoop.aws.glue.cache.db。ttl-mins 30

没有实例概要文件附加到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 >)

请按照升级到Amazon Athena用户指南中的AWS胶水数据目录

在数据库中创建一个空表位置

Glue Catalog中的数据库可以从各种来源创建。由Databricks Runtime创建的数据库默认有一个非空的LOCATION字段。在Glue Console中直接创建或从其他来源导入的数据库可以有一个空位置字段。

当Databricks运行时试图在数据库中创建一个空的表时位置字段时,出现如下异常:

不能从空字符串创建路径

类中的有效非空路径在Glue Catalog中创建数据库位置字段,指定位置在SQL中创建表时,或指定选项(“路径”,< some_valid_path >)的DataFrame API。

当您在AWS Glue控制台中创建数据库时,只需要名称;“描述”和“位置”都被标记为可选。然而,Hive metastore操作依赖于“Location”,所以你必须为Databricks Runtime中使用的数据库指定它。

从共享的Glue目录访问Databricks工作区之间的表

位置关键字可以在数据库级别(控制所有表的默认位置)设置,也可以作为创建表格声明。指定的路径位置是一个挂载桶,您必须在共享Glue Catalog的所有Databricks工作区中使用相同的挂载名称。类指定的路径来存储对数据的引用位置值,使用相同的挂载点名称可以确保每个工作区都可以访问存储在S3桶中的数据库对象。

访问在其他系统中创建的表和视图

访问由其他系统(如AWS Athena或Presto)创建的表和视图,在Databricks Runtime或Spark中可能工作,也可能不工作,这些操作不受支持。它们可能会失败,并发出神秘的错误消息。例如,访问由Athena、Databricks Runtime或Spark创建的视图可能会抛出如下异常:

不能从空字符串创建路径

出现此异常是因为Athena和Presto以不同于Databricks Runtime和Spark期望的格式存储视图元数据。