使用AWS胶水数据目录作为metastore(遗留)

您可以配置数据砖运行时使用AWS胶数据目录metastore。这可以作为一个蜂巢metastore的替代。

每个AWS帐户拥有一个一个AWS地区目录的目录ID是一样的AWS帐户ID。使用胶水目录作为metastore砖可以启用共享metastore在AWS服务,应用程序,或AWS帐户。

您可以配置多个砖工作区metastore分享相同的。

本文展示了如何安全地访问胶砖使用实例配置文件的目录的数据。

请注意

使用外部metastores遗留数据治理模型。砖建议你升级到统一的目录。统一目录简化了数据的安全性和治理提供一个中心位置管理和审计数据访问跨多个工作空间在您的帐户。看到联合目录是什么?

需求

  • 你必须AWS管理员访问我角色和策略在砖的AWS帐户中部署和AWS帐户包含胶水数据目录。

  • 如果胶数据目录是在一个不同的AWS帐户从砖在哪里部署,across-account访问政策必须允许访问目录从砖的AWS帐户中部署。注意,我们只支持给予cross-account访问使用资源策略的胶水。

  • 内置模式需要砖运行时的8.4或以上,或运行时7.3 LTS砖。

配置胶metastore数据目录

使胶目录集成设置火花配置spark.databricks.hive.metastore.glueCatalog.enabled真正的。这个配置默认情况下是禁用的。即默认是使用砖蜂巢metastore主办,或其他外部metastore如果配置。

集群互动或工作,设置配置集群中配置之前集群启动。

重要的

这种配置选项不能在集群运行修改。

运行时spark-submit无论是在工作,设置此配置选项spark-submit参数使用——设计spark.databricks.hive.metastore.glueCatalog.enabled = true或设置它的代码之前创建SparkSessionSparkContext。例如:

pyspark.sql进口SparkSession#设置胶直接参看这里而不是使用spark-submit——配置选项火花=SparkSession构建器\浏览器名称(“ExamplePySparkSubmitTask”)\配置(“spark.databricks.hive.metastore.glueCatalog.enabled”,“真正的”)\enableHiveSupport()\getOrCreate()打印(火花sparkContextgetConf()得到(“spark.databricks.hive.metastore.glueCatalog.enabled”))火花sql(“显示数据库”)显示()火花停止()

如何配置胶目录访问取决于砖和胶水的目录在同一个AWS帐户和地区,在不同的账户,或在不同的地区。遵循适当的步骤在本文的其余部分:

  • 相同的AWS帐户和地区:按照步骤1,然后步骤3 - 5。

  • Cross-account1 - 6:遵循步骤。

  • 区域:按照步骤1,然后3 - 6的步骤。

重要的

AWS胶数据编目政策只定义元数据的访问权限。S3政策定义访问权限内容本身。这些步骤建立一个政策AWS胶水数据目录。他们建立相关的S3 bucket或对象级策略。看到S3访问配置实例配置文件设置S3权限数据砖。

有关更多信息,请参见限制你的AWS胶水数据目录资源级别我权限和资源政策

步骤1:创建一个实例配置文件访问胶水数据目录

  1. 在AWS控制台中,去我的服务。

  2. 在侧边栏单击角色选项卡。

  3. 点击创建角色

    1. 在选择信任的实体类型,选择AWS服务

    2. 单击EC2服务。

    3. 在选择你的用例,点击EC2

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

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

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

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

  5. 添加一个内联政策胶目录。

    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资源是胶水

如果允许操作的列表在上面的政策不足,请联系您的砖代表的错误信息。最简单的方法是使用政策,给出了完全访问胶:

{“版本”:“2012-10-17”,“声明”:({“席德”:“GrantFullAccessToGlue”,“效应”:“允许”,“行动”:(“胶:*”),“资源”:“*”}]}

步骤2:创建一个政策目标胶目录

遵循这个步骤只有在目标胶目录不同的AWS帐户比用于砖部署。

  1. 登录到目标的AWS帐户胶目录和去胶控制台。

  2. 在设置中,在以下政策粘贴到盒子的权限。集< 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:查找我的角色用于创建数据砖部署

这我的角色是角色设置砖时使用帐户。

下面的步骤是不同的账户E2版本的平台bob体育客户端下载比账户在另一个版本的所有新砖砖平台账户和大多数现有的账户现在E2。bob体育客户端下载如果你不确定该帐户类型,请联系您的砖的代表。

如果你是在一个E2帐户:

  1. 作为计算帐户所有者或管理员,登录到账户控制台

  2. 工作区并点击您的工作区名称。

  3. 凭证框,注意角色名在攻击的作用。

    例如,在攻击的角色攻击:aws:我::123456789123:/ finance-prod角色,finance-prod角色的名字。

如果你不是E2帐户:

  1. 作为帐户所有者,登录到账户控制台

  2. 单击AWS帐户选项卡。

  3. 注意角色名称的最后攻击的角色,在这里testco-role

    我的角色

步骤4:添加胶水目录实例配置EC2政策

  1. 在AWS控制台中,去我的服务。

  2. 单击角色在侧边栏选项卡。

  3. 在步骤3中单击你提到的角色。

  4. 在权限选项卡上,单击政策。

  5. 点击编辑政策

  6. 修改政策允许砖通过实例配置文件您在步骤1中创建的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. 点击保存更改

第五步:添加胶砖工作区目录实例配置文件

  1. 去管理设置页面。

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

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

  4. 粘贴在实例配置文件从步骤1攻击。

    实例配置文件是

    砖确认了这个实例配置文件是在语法上和语义上都是正确的。验证语义正确性,砖干由启动集群实例配置文件。任何失败在这个干燥的运行在UI中产生一个验证错误。

    请注意

    实例的验证配置文件可能会失败,如果它包含tag-enforcement政策,防止合法实例添加一个概要文件。如果验证失败,你还想添加实例配置文件数据砖,使用API和指定的实例文件skip_validation

  5. 点击添加

  6. 选择指定的用户可以启动集群实例配置文件。

    添加用户

第六步:启动集群与胶水目录实例配置文件

  1. 创建一个集群。

  2. 单击实例选项卡在集群上创建页面。

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

    选择实例配置文件
  4. 验证您可以访问胶目录,在笔记本上使用下面的命令:

    显示数据库;

    如果命令成功,这砖集群运行时配置为使用胶水。根据您的AWS帐户和胶水,您可能需要执行两个额外的步骤:

    • 如果砖的AWS帐户部署和胶水的AWS帐户数据目录是不同的,额外cross-account设置是必要的。

      spark.hadoop.hive.metastore.glue.catalogid< aws-account-id-for-glue-catalog >火花配置

    • 如果目标目录胶比砖部署在不同的地区,也指定spark.hadoop.aws.region< aws-region-for-glue-catalog >

    提示

    提醒人们,spark.databricks.hive.metastore.glueCatalog。实在是需要启用配置连接到AWS胶水。

  5. 引发包括对蜂巢的内置支持,但这是否取决于砖使用运行时版本。

    • 隔离模式:内置支持蜂巢是禁用的。图书馆为蜂巢1.2.1。spark2加载从/砖/胶水/。在砖8.3运行时,隔离模式,不能启用被禁用。在砖运行时7.3 LTS和砖运行时8.4及以上,隔离模式是默认的,但可以被禁用。

    • 内置模式启用:对蜂巢的内置支持,以及版本取决于引发的蜂巢。在砖运行时7.3 LTS和砖运行时8.4及以上,您可以启用内置模式通过设置spark.databricks.hive.metastore.glueCatalog.isolation.enabled在集群上。

  6. 要启用凭据透传,集spark.databricks.passthrough.enabled真正的。这需要砖运行时7.3 LTS或砖运行时8.4或以上。砖上运行时7.3 LTS和砖运行时8.4及以上,这个设置会自动使内置模式。

限制

  • 使用AWS胶数据目录的metastore砖有可能比默认的蜂巢metastore更高的延迟。有关更多信息,请参见经历比砖蜂巢metastore更高的延迟与胶水目录在故障排除部分。

  • 默认的数据库创建一个位置设置为一个URI使用dbfs:文件系统(砖)计划。这个位置不是从AWS访问应用程序外砖如AWS EMR或AWS雅典娜。作为一个解决方案,使用位置子句指定一桶位置,等s3: / / mybucket,当你调用创建。另外,一个数据库中创建表除了默认的数据库和设置位置数据库的一个S3的位置。

  • 你不能动态地胶目录和一个蜂巢metastore之间切换。你必须重新启动新火花的集群配置生效。

  • 凭据支持透传只在砖运行时8.4及以上。

  • 不支持以下特性:

    • 砖连接

    • 跨系统的交互,你共享相同的元数据目录或实际表数据跨多个系统。

故障排除

较高的延迟胶比砖蜂巢metastore目录

使用胶水数据目录作为外部metastore可能导致延迟高于默认砖蜂巢metastore托管。砖推荐胶水目录中启用客户端缓存客户端。以下小节将展示如何配置客户端缓存表和数据库。您可以配置客户端缓存集群SQL仓库

请注意

  • 没有客户端缓存清单表的操作可以获得的

  • time - to - live (TTL)配置之间权衡缓存的有效性和可容忍的过时的元数据。选择一个特定场景TTL值是有意义的。

更多细节,请参阅为胶启用客户端缓存目录在AWS文档。

spark.hadoop.aws.glue.cache.table。实现真正的spark.hadoop.aws.glue.cache.table。大小1000spark.hadoop.aws.glue.cache.table。ttl-mins 30

数据库

spark.hadoop.aws.glue.cache.db。实现真正的spark.hadoop.aws.glue.cache.db。大小1000spark.hadoop.aws.glue.cache.db。ttl-mins 30

没有实例配置文件附加到砖集群运行时

如果没有实例配置文件是附加到砖运行时的集群,然后发生下列异常运行任何操作时,需要metastore查找:

org.apache.spark.sql。AnalysisException: . lang。RuntimeException: com.amazonaws。SdkClientException:无法加载AWS凭证链中的任何提供者:[EnvironmentVariableCredentialsProvider:无法加载AWS凭证从环境变量(AWS_ACCESS_KEY_ID(或AWS_ACCESS_KEY)和AWS_SECRET_KEY(或AWS_SECRET_ACCESS_KEY)), SystemPropertiesCredentialsProvider:无法加载从Java系统属性(AWS AWS凭据。com.amazonaws.auth.profile 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/];

附加一个实例配置文件有足够权限访问所需的胶目录。

胶水目录权限不足

当实例配置文件不授予权限执行metastore所需操作,发生异常如下:

org.apache.spark.sql。AnalysisException: . lang。RuntimeException: MetaException(信息:无法验证存在违约数据库:com.amazonaws.services.glue.model。AccessDeniedException:用户:在攻击:aws: sts:: < aws-account-id >:自选角色/ < role-id > /……未被授权执行:胶:GetDatabase资源:在攻击:aws:胶:< aws-region-for-glue-catalog >: < aws-account-id-for-glue-catalog >:目录(服务:AWSGlue;状态码:400;错误代码:AccessDeniedException;请求ID: <请求ID >));

检查连接实例配置文件指定了足够的权限。例如,在前面的例外,添加胶水:GetDatabase实例配置文件。

允许错误胶水:GetDatabase当直接运行SQL文件

在砖运行时版本低于8.0,当运行一个SQL查询直接在文件例如,

选择*拼花路径- - - - - -- - - - - -数据

你可能会遇到一个错误如下:

错误的SQL语句:AnalysisException…未被授权执行:胶:GetDatabase资源:< glue-account >:数据库/拼花吗

这发生在当我不予许可执行政策胶水:GetDatabase在资源上数据库/ < datasource-format >,在那里< datasource-format >是一种数据源格式如拼花δ

我政策允许添加权限胶水:GetDatabase数据库/ < datasource-format >

有限制的实施引发SQL分析仪,它试图解决关系攻击目录回落之前尝试解决注册数据源为SQL文件。回退只能当最初试图解决对目录返回没有一个例外。

尽管资源数据库/ < datasource-format >可能不存在,后备文件成功运行SQL查询,我政策胶目录必须允许执行胶水:GetDatabase行动。

在砖运行时8.0及以上的,这个问题是这个解决方案不再需要自动处理。

不匹配的胶水目录ID

默认情况下,砖集群试图连接到胶目录在同一个AWS帐户用于砖的部署。

如果目标胶目录是在一个不同的砖的AWS帐户或地区部署,和spark.hadoop.hive.metastore.glue.catalogid火花配置没有设置,集群将连接到砖的胶水在AWS帐户目录部署的目标目录。

如果spark.hadoop.hive.metastore.glue.catalogid配置设置,但在步骤2中配置不正确,任何访问metastore异常原因如下:

org.apache.spark.sql。AnalysisException: . lang。RuntimeException: MetaException(信息:无法验证存在违约数据库:com.amazonaws.services.glue.model。AccessDeniedException:用户:攻击:aws: sts:: < aws-account-id >:自选角色/ < role-id > /……未被授权执行:胶:GetDatabase资源:在攻击:aws:胶:< aws-region-for-glue-catalog >: < aws-account-id-for-glue-catalog >:目录(服务:AWSGlue;状态码:400;错误代码:AccessDeniedException;请求ID: <请求ID >));

验证配置与步骤2和6。

雅典娜目录与胶水目录冲突

如果您使用亚马逊雅典娜创建表或亚马逊光谱红移在8月14日,2017年,存储在一个数据库和表Athena-managed目录,这是独立于AWS胶水数据目录。集成数据砖与这些表运行时,您必须升级到AWS胶数据目录。否则,砖运行时无法连接到胶目录或未能创建和访问一些数据库,和异常消息可能是神秘的。

例如,如果数据库中存在“默认”雅典娜目录而不是胶水目录,将产生一个异常,这样的消息:

AWSCatalogMetastoreClient:无法验证默认数据库的存在:com.amazonaws.services.glue.model。AccessDeniedException:请迁移您的目录来启用访问这个数据库(服务:AWSGlue;状态码:400;错误代码:AccessDeniedException;请求ID: <请求ID >)

按照说明在升级到AWS胶数据目录在亚马逊雅典娜用户指南

与空数据库中创建表位置

数据库在胶目录可能从各种来源创建。数据库由砖默认运行时具有一个非空的位置字段。数据库中创建胶控制台直接或从其他渠道进口,可能一个空位置字段。

当砖运行时试图与一个空数据库中创建一个表位置场,发生异常如下::

IllegalArgumentException:不能创建一个路径从一个空字符串

创建数据库在胶与一个有效的非空目录路径位置字段中,指定位置当创建表的SQL,或者指定选项(“路径”,< some-valid-path >)DataFrame API。

当你创建一个数据库在AWS胶控制台中,只有名称是必需的;“描述”和“位置”被标记为可选的。然而,蜂巢metastore操作取决于“位置”,所以你必须指定数据库将用于砖运行时。

从共享访问表之间数据砖工作区胶水目录

位置关键字可以设置在数据库级别(所有表控制默认位置)的一部分创建声明。如果指定的路径位置装桶,您必须使用相同的山名的所有共享胶砖工作区目录。因为胶水目录存储引用数据使用指定的路径位置值,使用相同的挂载点的名称确保每个工作区可以访问数据库对象存储在S3 bucket中。

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

访问其他系统创建的表和视图,如AWS雅典娜还是很快,可能会或可能不会在砖工作运行或火花,不支持这些操作。他们用神秘的错误消息可能会失败。例如,访问视图由雅典娜,砖运行时,或火花可能会抛出一个异常:

IllegalArgumentException:不能创建一个路径从一个空字符串

这个异常是因为雅典娜和迅速的将元数据存储在一个格式不同于砖运行时和火花的期待什么。