元数据仓配置 - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

元数据仓配置

Hive 元数据仓是一个集中位置,用于存储有关表的结构信息,包括架构、分区名称和数据类型。使用 EMR Serverless,您可以将此表元数据保存在可以访问您的作业的元数据存储中。

Hive 元数据仓有两种选择:

  • AWS Glue 数据目录

  • 外部 Apache Hive 元存储库

使用 AWS Glue 数据目录作为元数据库

你可以将 Spark 和 Hive 作业配置为使用 Glue AWS 数据目录作为其元数据库。当您需要永久元数据仓或由不同应用程序、服务或共享的元数据仓时,我们建议您使用此配置。 AWS 账户有关数据目录的更多信息,请参阅填充 AWS Glue 数据目录。有关 AWS Glue 定价的信息,请参阅 AWS Glue 定价

您可以将您的EMR无服务器作业配置为使用与您的应用程序相同 AWS 账户 的 AWS Glue 数据目录,也可以在不同的 AWS 账户应用程序中使用 Glue 数据目录。

配置 AWS Glue 数据目录

要配置数据目录,请选择要使用的EMR无服务器应用程序类型。

Spark

当你使用 EMR Studio 通过EMR无服务器 Spark 应用程序运行作业时,Glu AWS e 数据目录是默认的元数据库。

使用SDKs或时 AWS CLI,可以在作业运行的sparkSubmit参数com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory中将spark.hadoop.hive.metastore.client.factory.class配置设置为。以下示例说明如何使用配置数据目录 AWS CLI。

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://amzn-s3-demo-bucket/code/pyspark/extreme_weather.py", "sparkSubmitParameters": "--conf spark.hadoop.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory --conf spark.driver.cores=1 --conf spark.driver.memory=3g --conf spark.executor.cores=4 --conf spark.executor.memory=3g" } }'

或者,你可以在你的 Spark 代码SparkSession中创建新配置时设置此配置。

from pyspark.sql import SparkSession spark = ( SparkSession.builder.appName("SparkSQL") .config( "spark.hadoop.hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory", ) .enableHiveSupport() .getOrCreate() ) # we can query tables with SparkSQL spark.sql("SHOW TABLES").show() # we can also them with native Spark print(spark.catalog.listTables())
Hive

对于EMR无服务器 Hive 应用程序,数据目录是默认的元数据库。也就是说,当你在 EMR Serverless Hive 应用程序上运行作业时,Hive 在数据目录中以与应用程序相同的 AWS 账户 形式记录元存储信息。您不需要虚拟私有云 (VPC) 即可将数据目录用作元数据仓。

要访问 Hive 元数据仓表,请添加设置 G AWS lue IAM 权限中概述的必需 G AWS lu e 策略。

为EMR无服务器和 G AWS lue 数据目录配置跨账户访问权限

要为 EMR Serverless 设置跨账户访问权限,您必须先登录以下网站: AWS 账户

  • AccountA— 这是您创建EMR无服务器应用程序 AWS 账户 的地方。

  • AccountB— 包 AWS 账户 含 AWS Glue 数据目录,你想让你的EMR无服务器作业运行访问该目录。

  1. 确保中的管理员或其他授权身份将资源策略AccountB附加到中的数据目录AccountB。此策略授予对AccountB目录中的资源执行操作的AccountA特定跨账户权限。

    { "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal": { "AWS": [ "arn:aws:iam::accountA:role/job-runtime-role-A" ]}, "Action" : [ "glue:GetDatabase", "glue:CreateDatabase", "glue:GetDataBases", "glue:CreateTable", "glue:GetTable", "glue:UpdateTable", "glue:DeleteTable", "glue:GetTables", "glue:GetPartition", "glue:GetPartitions", "glue:CreatePartition", "glue:BatchCreatePartition", "glue:GetUserDefinedFunctions" ], "Resource": ["arn:aws:glue:region:AccountB:catalog"] } ] }
  2. 向中的EMR无服务器作业运行时角色添加IAM策略,AccountA以便该角色可以访问中的AccountB数据目录资源。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase", "glue:GetDataBases", "glue:CreateTable", "glue:GetTable", "glue:UpdateTable", "glue:DeleteTable", "glue:GetTables", "glue:GetPartition", "glue:GetPartitions", "glue:CreatePartition", "glue:BatchCreatePartition", "glue:GetUserDefinedFunctions" ], "Resource": ["arn:aws:glue:region:AccountB:catalog"] } ] }
  3. 开始运行作业。根据EMR无服务器应用程序AccountA的类型,此步骤略有不同。

    Spark

    hive-site分类中设置该spark.hadoop.hive.metastore.glue.catalogid属性,如以下示例所示。Replace(替换) 账户 b-catalog-ID 其中包含数据目录的 ID AccountB

    aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "sparkSubmit": { "query": "s3://amzn-s3-demo-bucket/hive/scripts/create_table.sql", "parameters": "--hiveconf hive.exec.scratchdir=s3://amzn-s3-demo-bucket/hive/scratch --hiveconf hive.metastore.warehouse.dir=s3://amzn-s3-demo-bucket/hive/warehouse" } }' \ --configuration-overrides '{ "applicationConfiguration": [{ "classification": "hive-site", "properties": { "spark.hadoop.hive.metastore.glue.catalogid": "AccountB-catalog-id" } }] }'
    Hive

    hive-site分类中设置该hive.metastore.glue.catalogid属性,如以下示例所示。Replace(替换) 账户 b-catalog-ID 其中包含数据目录的 ID AccountB

    aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "hive": { "query": "s3://amzn-s3-demo-bucket/hive/scripts/create_table.sql", "parameters": "--hiveconf hive.exec.scratchdir=s3://amzn-s3-demo-bucket/hive/scratch --hiveconf hive.metastore.warehouse.dir=s3://amzn-s3-demo-bucket/hive/warehouse" } }' \ --configuration-overrides '{ "applicationConfiguration": [{ "classification": "hive-site", "properties": { "hive.metastore.glue.catalogid": "AccountB-catalog-id" } }] }'

使用 Glue 数据 AWS 目录时的注意事项

您可以在 Hive 脚本ADD JAR中JARs使用添加辅助工具。有关其他注意事项,请参阅使用 AWS Glue 数据目录时的注意事项

使用外部 Hive 元数据仓

您可以将EMR无服务器 Spark 和 Hive 任务配置为连接到外部 Hive 元存储库,例如亚马逊 Aurora 或 Amazon for My。RDS SQL本节介绍如何设置 Amazon RDS Hive 元数据仓、配置您的VPC以及如何配置您的EMR无服务器任务以使用外部元数据仓。

创建外部 Hive 元数据仓

  1. 按照创建中的说明创建带有私有子网的 Amazon Virtual Priv at e Cloud (AmazonVPC)。VPC

  2. 使用您的新 Amazon VPC 和私有子网创建您的EMR无服务器应用程序。当您使用 EMR Serverless 应用程序配置时VPC,它会首先为您指定的每个子网配置一个弹性网络接口。然后,它会将您指定的安全组附加到该网络接口。这为您的应用程序提供了访问控制。有关如何设置的更多详细信息VPC,请参阅配置VPC访问权限

  3. 在亚马逊VPC的私有子网中创建 My SQL 或 Aurora Postgre SQL 数据库。有关如何创建亚马逊RDS数据库的信息,请参阅创建亚马逊RDS数据库实例

  4. 按照修改 A mazon RDS 数据库实例中的步骤,修改 My SQL 或 Aurora 数据库的安全组以允许来自您的EMR无服务器安全组的JDBC连接。为从您的一个EMR无服务器RDS安全组进入安全组的入站流量添加规则。

    类型 协议 端口范围 来源

    全部 TCP

    TCP

    3306

    emr-serverless-security-group

配置 Spark 选项

使用 JDBC

要将您的EMR无服务器 Spark 应用程序配置为连接到基于 Amazon for My 或 Ama RDS zon A SQL urora My SQL 实例的 Hive 元数据仓,请使用连接。JDBC在作业运行mariadb-connector-java.jarspark-submit参数--jars中传递 with。

aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://amzn-s3-demo-bucket/scripts/spark-jdbc.py", "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar --conf spark.hadoop.javax.jdo.option.ConnectionDriverName=org.mariadb.jdbc.Driver --conf spark.hadoop.javax.jdo.option.ConnectionUserName=<connection-user-name> --conf spark.hadoop.javax.jdo.option.ConnectionPassword=<connection-password> --conf spark.hadoop.javax.jdo.option.ConnectionURL=<JDBC-Connection-string> --conf spark.driver.cores=2 --conf spark.executor.memory=10G --conf spark.driver.memory=6G --conf spark.executor.cores=4" } }' \ --configuration-overrides '{ "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-bucket/spark/logs/" } } }'

以下代码示例是与亚马逊上的 Hive 元数据仓交互的 Spark 入口点脚本。RDS

from os.path import expanduser, join, abspath from pyspark.sql import SparkSession from pyspark.sql import Row # warehouse_location points to the default location for managed databases and tables warehouse_location = abspath('spark-warehouse') spark = SparkSession \ .builder \ .config("spark.sql.warehouse.dir", warehouse_location) \ .enableHiveSupport() \ .getOrCreate() spark.sql("SHOW DATABASES").show() spark.sql("CREATE EXTERNAL TABLE `sampledb`.`sparknyctaxi`(`dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'") spark.sql("SELECT count(*) FROM sampledb.sparknyctaxi").show() spark.stop()

使用旧货服务

您可以将EMR无服务器 Hive 应用程序配置为连接基于 Amazon for My 或 Ama RDS zon A SQL urora My 实例的 Hive 元数据仓。SQL为此,请在现有 Amazon EMR 集群的主节点上运行节俭服务器。如果您已经有一个带有节俭服务器的 Amazon EMR 集群,想要使用该集群来简化EMR无服务器任务配置,则此选项非常理想。

aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://amzn-s3-demo-bucket/thriftscript.py", "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar --conf spark.driver.cores=2 --conf spark.executor.memory=10G --conf spark.driver.memory=6G --conf spark.executor.cores=4" } }' \ --configuration-overrides '{ "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-bucket/spark/logs/" } } }'

以下代码示例是一个使用节俭协议连接到 Hive 元数据仓的入口点脚本 (thriftscript.py)。请注意,需要将该hive.metastore.uris属性设置为从外部 Hive 元数据仓读取。

from os.path import expanduser, join, abspath from pyspark.sql import SparkSession from pyspark.sql import Row # warehouse_location points to the default location for managed databases and tables warehouse_location = abspath('spark-warehouse') spark = SparkSession \ .builder \ .config("spark.sql.warehouse.dir", warehouse_location) \ .config("hive.metastore.uris","thrift://thrift-server-host:thift-server-port") \ .enableHiveSupport() \ .getOrCreate() spark.sql("SHOW DATABASES").show() spark.sql("CREATE EXTERNAL TABLE sampledb.`sparknyctaxi`( `dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'") spark.sql("SELECT * FROM sampledb.sparknyctaxi").show() spark.stop()

配置 Hive 选项

使用 JDBC

如果您想在 Amazon M RDS y SQL 或 Amazon Aurora 实例上指定外部 Hive 数据库位置,则可以覆盖默认的元数据仓配置。

注意

在 Hive 中,您可以同时对元数据仓表执行多次写入。如果您在两个作业之间共享元数据仓信息,请确保不要同时写入同一个元数据仓表,除非您写入同一个元数据仓表的不同分区。

hive-site分类中设置以下配置以激活外部 Hive 元数据仓。

{ "classification": "hive-site", "properties": { "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory", "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver", "javax.jdo.option.ConnectionURL": "jdbc:mysql://db-host:db-port/db-name", "javax.jdo.option.ConnectionUserName": "username", "javax.jdo.option.ConnectionPassword": "password" } }

使用旧货服务器

您可以将EMR无服务器 Hive 应用程序配置为连接到基于 Amazon for My 或 Ama RDS zon A SQL urora M 的 Hive 元数据仓。ySQLinstance为此,请在现有 Amazon EMR 集群的主节点上运行节俭服务器。如果您已经拥有运行旧服务器的 Amazon EMR 集群,并且想要使用您的EMR无服务器任务配置,则此选项非常理想。

hive-site分类中设置以下配置,以便 EMR Serverless 可以访问远程旧货元数据仓。请注意,必须将该hive.metastore.uris属性设置为从外部 Hive 元数据仓读取。

{ "classification": "hive-site", "properties": { "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory", "hive.metastore.uris": "thrift://thrift-server-host:thirft-server-port" } }

使用外部元数据仓时的注意事项