本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
元数据仓配置
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无服务器应用程序类型。
为EMR无服务器和 G AWS lue 数据目录配置跨账户访问权限
要为 EMR Serverless 设置跨账户访问权限,您必须先登录以下网站: AWS 账户
-
AccountA
— 这是您创建EMR无服务器应用程序 AWS 账户 的地方。 -
AccountB
— 包 AWS 账户 含 AWS Glue 数据目录,你想让你的EMR无服务器作业运行访问该目录。
-
确保中的管理员或其他授权身份将资源策略
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"] } ] } -
向中的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"] } ] } -
开始运行作业。根据EMR无服务器应用程序
AccountA
的类型,此步骤略有不同。
使用 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 元数据仓
-
按照创建中的说明创建带有私有子网的 Amazon Virtual Priv at e Cloud (AmazonVPC)。VPC
-
使用您的新 Amazon VPC 和私有子网创建您的EMR无服务器应用程序。当您使用 EMR Serverless 应用程序配置时VPC,它会首先为您指定的每个子网配置一个弹性网络接口。然后,它会将您指定的安全组附加到该网络接口。这为您的应用程序提供了访问控制。有关如何设置的更多详细信息VPC,请参阅配置VPC访问权限。
-
在亚马逊VPC的私有子网中创建 My SQL 或 Aurora Postgre SQL 数据库。有关如何创建亚马逊RDS数据库的信息,请参阅创建亚马逊RDS数据库实例。
-
按照修改 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.jar
的spark-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
" } }
使用外部元数据仓时的注意事项
-
您可以将与 MariaDB 兼容的数据库配置JDBC为元数据仓。这些数据库的示例有 RDS MariaDB、My 和 Amazon A SQL urora。
-
元存储不会自动初始化。如果您的元数据仓未使用 Hive 版本的架构进行初始化,请使用 Hive 架构工具。
-
EMR无服务器不支持 Kerberos 身份验证。你不能将具有 Kerberos 身份验证的旧版元数据仓服务器与 Serverl EMR ess Spark 或 Hive 作业一起使用。