Configurazione Metastore - Amazon EMR

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configurazione Metastore

Un metastore Hive è una posizione centralizzata che memorizza le informazioni strutturali sulle tabelle, inclusi schemi, nomi delle partizioni e tipi di dati. Con EMR Serverless, puoi mantenere i metadati di questa tabella in un metastore che ha accesso ai tuoi lavori.

Hai due opzioni per un metastore Hive:

  • Il AWS Catalogo dati Glue

  • Un metastore Apache Hive esterno

Utilizzo di AWS Glue Data Catalog come metastore

Puoi configurare i job Spark e Hive per utilizzare il AWS Glue Data Catalog come metastore. Consigliamo questa configurazione quando è necessario un metastore persistente o un metastore condiviso da diverse applicazioni, servizi o Account AWS. Per ulteriori informazioni sul Data Catalog, vedere Population the AWS Catalogo dati Glue. Per informazioni su AWS Prezzi di Glue, vedi AWS Prezzi della colla.

Puoi configurare il tuo job EMR Serverless per utilizzare il AWS Glue Data Catalog nello stesso Account AWS come applicazione o in un'altra Account AWS.

Configura il AWS Catalogo dati Glue

Per configurare il Data Catalog, scegli il tipo di applicazione EMR Serverless che desideri utilizzare.

Spark

Quando utilizzi EMR Studio per eseguire i tuoi lavori con le applicazioni EMR Serverless Spark, AWS Glue Data Catalog è il metastore predefinito.

Quando si utilizza o SDKs AWS CLI, è possibile impostare la spark.hadoop.hive.metastore.client.factory.class configurazione su com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory nei sparkSubmit parametri dell'esecuzione del processo. L'esempio seguente mostra come configurare il Data Catalog con AWS CLI.

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://DOC-EXAMPLE-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" } }'

In alternativa, puoi impostare questa configurazione quando ne crei una nuova SparkSession nel codice Spark.

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

Per le applicazioni EMR Serverless Hive, il Data Catalog è il metastore predefinito. Cioè, quando si eseguono lavori su un'applicazione EMR Serverless Hive, Hive registra le informazioni sui metastore nel Data Catalog nella stessa Account AWS come applicazione. Non è necessario un cloud privato virtuale (VPC) per utilizzare Data Catalog come metastore.

Per accedere alle tabelle dei metastore di Hive, aggiungi il file richiesto AWS Le politiche di Glue descritte in Configurazione delle IAM autorizzazioni per AWS Glue.

Configura l'accesso tra più account per EMR Serverless e AWS Catalogo dati Glue

Per configurare l'accesso tra più account per EMR Serverless, devi prima accedere a quanto segue Account AWS:

  • AccountA— Un Account AWS dove è stata creata un'applicazione EMR serverless.

  • AccountB— Un Account AWS che contiene un AWS Glue Data Catalog a cui desideri che EMR acceda il tuo job Serverless.

  1. Assicurati che un amministratore o un'altra identità autorizzata AccountB alleghi una politica delle risorse al Data Catalog in. AccountB Questa politica concede autorizzazioni AccountA specifiche per diversi account per eseguire operazioni sulle risorse del catalogo. 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. Aggiungi una IAM policy al ruolo EMR Serverless Job Runtime in AccountA modo che tale ruolo possa accedere alle risorse del Data Catalog in. 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. Inizia il tuo job run. Questo passaggio è leggermente diverso a seconda AccountA del tipo di applicazione EMR Serverless.

    Spark

    Impostate la spark.hadoop.hive.metastore.glue.catalogid proprietà nella hive-site classificazione come illustrato nell'esempio seguente. Replace (Sostituisci) Account-catalog-ID con l'ID del catalogo dati in. AccountB

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

    Imposta la hive.metastore.glue.catalogid proprietà nella hive-site classificazione come illustrato nell'esempio seguente. Replace (Sostituisci) Account-catalog-ID con l'ID del catalogo dati in. AccountB

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

Considerazioni sull'utilizzo di AWS Catalogo dati Glue

Puoi aggiungere elementi ausiliari ADD JAR negli JARs script di Hive. Per ulteriori considerazioni, vedi Considerazioni sull'uso AWS Catalogo dati Glue.

Utilizzo di un metastore Hive esterno

Puoi configurare i job EMR Serverless Spark e Hive per connetterti a un metastore Hive esterno, come Amazon Aurora o Amazon for My. RDS SQL Questa sezione descrive come configurare un metastore Amazon RDS Hive, configurare e configurare i VPC job EMR Serverless per utilizzare un metastore esterno.

Crea un metastore Hive esterno

  1. Crea un Amazon Virtual Private Cloud (AmazonVPC) con sottoreti private seguendo le istruzioni in Crea un. VPC

  2. Crea la tua applicazione EMR Serverless con le tue nuove sottoreti Amazon VPC e private. Quando configuri un'applicazione EMR Serverless con aVPC, effettua innanzitutto il provisioning di un'interfaccia di rete elastica per ogni sottorete specificata. Quindi collega il gruppo di sicurezza specificato a quell'interfaccia di rete. Ciò consente il controllo dell'accesso all'applicazione. Per ulteriori dettagli su come configurare il tuoVPC, consultaConfigurazione dell'accesso VPC.

  3. Crea un SQL database My SQL o Aurora Postgre in una sottorete privata in Amazon. VPC Per informazioni su come creare un RDS database Amazon, consulta Creazione di un'istanza Amazon RDS DB.

  4. Modifica il gruppo di sicurezza del tuo database My SQL o Aurora per consentire JDBC le connessioni dal tuo gruppo di sicurezza EMR Serverless seguendo i passaggi descritti in Modificare un'istanza Amazon RDS DB. Aggiungi una regola per il traffico in entrata al gruppo di RDS sicurezza da uno dei tuoi EMR gruppi di sicurezza Serverless.

    Tipo Protocollo Intervallo porte Origine

    Tutti TCP

    TCP

    3306

    emr-serverless-security-group

Configura le opzioni Spark

Usando JDBC

Per configurare la tua applicazione EMR Serverless Spark per connettersi a un metastore Hive basato su un'istanza Amazon for My RDS o Amazon SQL Aurora My, usa una connessione. SQL JDBC Inserisci i parametri del mariadb-connector-java.jar --jars job run. spark-submit

aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://DOC-EXAMPLE-BUCKET/scripts/spark-jdbc.py", "sparkSubmitParameters": "--jars s3://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET/spark/logs/" } } }'

Il seguente esempio di codice è uno script entrypoint Spark che interagisce con un metastore Hive su Amazon. 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()

Utilizzo del servizio Thrift

Puoi configurare la tua applicazione EMR Serverless Hive per connettersi a un metastore Hive basato su un'istanza Amazon for My RDS o Amazon SQL Aurora My. SQL A tale scopo, esegui un server Thrift sul nodo master di un EMR cluster Amazon esistente. Questa opzione è ideale se disponi già di un EMR cluster Amazon con un server Thrift che desideri utilizzare per semplificare le configurazioni dei processi EMR Serverless.

aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://DOC-EXAMPLE-BUCKET/thriftscript.py", "sparkSubmitParameters": "--jars s3://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET/spark/logs/" } } }'

Il seguente esempio di codice è uno script entrypoint (thriftscript.py) che utilizza il protocollo thrift per connettersi a un metastore Hive. Nota che la hive.metastore.uris proprietà deve essere impostata per la lettura da un metastore Hive esterno.

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()

Configura le opzioni Hive

Usando JDBC

Se desideri specificare una posizione di database Hive esterna su un'istanza Amazon RDS My SQL o Amazon Aurora, puoi sovrascrivere la configurazione predefinita del metastore.

Nota

In Hive, puoi eseguire più scritture su tabelle metastore contemporaneamente. Se condividete le informazioni sui metastore tra due job, assicuratevi di non scrivere contemporaneamente sulla stessa tabella di metastore a meno che non scriviate su partizioni diverse della stessa tabella di metastore.

Imposta le seguenti configurazioni nella classificazione per attivare il metastore Hive esternohive-site.

{ "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" } }

Utilizzo di un server parsimonioso

Puoi configurare la tua applicazione EMR Serverless Hive per connettersi a un metastore Hive basato su Amazon for My RDS o Amazon Aurora M. SQL ySQLinstance A tale scopo, esegui un server Thrift sul nodo principale di un EMR cluster Amazon esistente. Questa opzione è ideale se disponi già di un EMR cluster Amazon che esegue un server Thrift e desideri utilizzare le configurazioni di lavoro EMR Serverless.

Imposta le seguenti configurazioni nella hive-site classificazione in modo che EMR Serverless possa accedere al thrift metastore remoto. Si noti che è necessario impostare la hive.metastore.uris proprietà per la lettura da un metastore Hive esterno.

{ "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" } }

Considerazioni sull'utilizzo di un metastore esterno