Metastore 組態 - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Metastore 組態

Hive 中繼存放區是集中位置,可存放資料表的結構資訊,包括結構描述、分割區名稱和資料類型。使用 EMR Serverless,您可以在可存取任務的中繼存放區中保留此資料表中繼資料。

Hive 中繼存放區有兩個選項:

  • AWS Glue Data Catalog

  • 外部 Apache Hive 中繼存放區

使用 AWS Glue Data Catalog 作為中繼存放區

您可以設定 Spark 和 Hive 任務使用 AWS Glue Data Catalog 作為其中繼存放區。當您需要持續的中繼存放區或不同應用程式、服務或 共用的中繼存放區時,建議您使用此組態 AWS 帳戶。如需 Data Catalog 的詳細資訊,請參閱填入 AWS Glue Data Catalog 。如需 AWS Glue 定價的相關資訊,請參閱 AWS Glue 定價。

您可以將 EMR Serverless 任務設定為在 AWS 帳戶 與應用程式相同的 或不同的 中使用 AWS Glue Data Catalog AWS 帳戶。

設定 AWS Glue Data Catalog

若要設定 Data Catalog,請選擇您要使用的無EMR伺服器應用程式類型。

Spark

當您使用 EMR Studio 搭配 EMR Serverless Spark 應用程式執行任務時, AWS Glue Data Catalog 是預設中繼存放區。

使用 SDKs或 時 AWS CLI,您可以在任務執行的sparkSubmit參數com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory中將spark.hadoop.hive.metastore.client.factory.class組態設定為 。下列範例示範如何使用 設定 Data Catalog 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 Serverless Hive 應用程式,Data Catalog 是預設中繼存放區。也就是說,當您在 EMR Serverless Hive 應用程式上執行任務時,Hive 會在 AWS 帳戶 與您應用程式相同的 Data Catalog 中記錄中繼存放區資訊。您不需要虛擬私有雲端 (VPC) 即可使用資料目錄作為中繼存放區。

若要存取 Hive 中繼存放區資料表,請新增設定 AWS Glue IAM許可 中概述的必要 AWS Glue 政策。

設定無EMR伺服器和 AWS Glue Data Catalog 的跨帳戶存取

若要設定 EMR Serverless 的跨帳戶存取權,您必須先登入下列 AWS 帳戶:

  • AccountA – 您已建立 EMR Serverless 應用程式的 AWS 帳戶 。

  • AccountB – AWS 帳戶 包含您希望 EMR Serverless 任務執行存取的 AWS Glue Data Catalog。

  1. 確定 中的管理員或其他授權身分將資源政策AccountB連接至 中的資料目錄AccountB。此政策授予AccountA特定跨帳戶許可,以對AccountB目錄中的資源執行操作。

    { "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. 將IAM政策新增至 中的 EMR Serverless 任務執行期角色,AccountA讓該角色可以存取 中的 Data Catalog 資源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. 啟動您的任務執行。根據 AccountA的 EMR Serverless 應用程式類型,此步驟略有不同。

    Spark

    hive-site分類中設定 spark.hadoop.hive.metastore.glue.catalogid 屬性,如下列範例所示。Replace (取代) AccountB -catalog-id 在 中使用 Data Catalog 的 IDAccountB

    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 (取代) AccountB -catalog-id 在 中使用 Data Catalog 的 IDAccountB

    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" } }] }'

使用 AWS Glue Data Catalog 時的考量

您可以在 Hive 指令碼JARsADD JAR中使用 新增輔助。如需其他考量,請參閱使用 AWS Glue Data Catalog 時的考量

使用外部 Hive 中繼存放區

您可以設定EMR您的 Serverless Spark 和 Hive 任務以連線至外部 Hive 中繼存放區,例如 Amazon Aurora 或 Amazon RDS for My SQL。本節說明如何設定 Amazon RDS Hive 中繼存放區、設定您的 VPC,以及設定無EMR伺服器任務以使用外部中繼存放區。

建立外部 Hive 中繼存放區

  1. 遵循建立 中的指示,使用私有子網路建立 VPCAmazon Virtual Private Cloud (Amazon VPC)。

  2. 使用新的 Amazon VPC和私有子網路建立EMR您的 Serverless 應用程式。當您使用 設定無EMR伺服器應用程式時VPC,它會先為您指定的每個子網路佈建彈性網路介面。然後,它會將您指定的安全群組連接到該網路介面。這可讓您的應用程式存取控制。如需如何設定 的詳細資訊VPC,請參閱 設定VPC存取權

  3. 在 Amazon 的私有子網路中建立 MySQL 或 Aurora PostgreSQL 資料庫VPC。如需有關如何建立 Amazon RDS 資料庫的資訊,請參閱建立 Amazon RDS 資料庫執行個體

  4. 按照修改 Amazon RDS 資料庫執行個體 中的步驟,修改 MySQL 或 Aurora 資料庫的安全群組,以允許從無EMR伺服器安全群組JDBC進行連線。從其中一個無EMR伺服器RDS安全群組將傳入流量規則新增至安全群組。

    Type 通訊協定 連接埠範圍 來源

    全部 TCP

    TCP

    3306

    emr-serverless-security-group

設定 Spark 選項

使用 JDBC

若要設定您的 EMR Serverless Spark 應用程式以根據 Amazon RDS for MySQL 或 Amazon Aurora MySQL 執行個體連線至 Hive 中繼存放區,請使用 JDBC連線。在任務執行的spark-submit參數--jars中傳遞 mariadb-connector-java.jar 與 。

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/" } } }'

下列程式碼範例是與 Amazon 上的 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()

使用 thrift 服務

您可以設定 EMR Serverless Hive 應用程式以根據 Amazon RDS for MySQL 或 Amazon Aurora MySQL 執行個體連線至 Hive 中繼存放區。若要執行此操作,請在現有 Amazon EMR叢集的主節點上執行 thrift 伺服器。如果您已經擁有具有要用來簡化 Serverless 任務組態之 thrift EMR 伺服器的 Amazon 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/" } } }'

下列程式碼範例是入門指令碼 (thriftscript.py),使用 thrift 通訊協定連線到 Hive 中繼存放區。請注意, 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 RDS MySQL 或 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" } }

使用 thrift 伺服器

您可以設定 EMR Serverless Hive 應用程式,以根據 Amazon RDS for MySQL 或 Amazon Aurora M 連線到 Hive 中繼存放區ySQLinstance。若要執行此操作,請在現有 Amazon EMR叢集的主節點上執行 thrift 伺服器。如果您已經有執行 thrift 伺服器的 Amazon EMR叢集,並且想要使用 EMR Serverless 任務組態,則此選項是理想的選擇。

hive-site分類中設定下列組態,以便 EMR Serverless 存取遠端 thrift 中繼存放區。請注意,您必須將 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 、我的 SQL和 Amazon Aurora。

  • 中繼存放區不會自動初始化。如果您的中繼存放區未使用 Hive 版本的結構描述初始化,請使用 Hive 結構描述工具

  • EMR Serverless 不支援 Kerberos 身分驗證。您無法將 thrift 中繼存放區伺服器與 Kerberos 身分驗證搭配 EMR Serverless Spark 或 Hive 任務使用。