Configuration du métastore - Amazon EMR

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Configuration du métastore

Un métastore Hive est un emplacement centralisé qui stocke les informations structurelles relatives à vos tables, notamment les schémas, les noms de partitions et les types de données. Avec EMR Serverless, vous pouvez conserver les métadonnées de cette table dans un métastore ayant accès à vos tâches.

Deux options s'offrent à vous pour créer un métastore Hive :

  • Le catalogue AWS de données Glue

  • Un métastore Apache Hive externe

Utiliser le catalogue AWS de données Glue comme métastore

Vous pouvez configurer vos tâches Spark et Hive pour utiliser le catalogue de données AWS Glue comme métastore. Nous recommandons cette configuration lorsque vous avez besoin d'un métastore persistant ou d'un métastore partagé par différentes applications, services ou. Comptes AWS Pour plus d'informations sur le catalogue de données, consultez la section Remplissage du catalogue de données AWS Glue. Pour plus d'informations sur AWS la tarification de Glue, consultez AWS la section Tarification de Glue.

Vous pouvez configurer votre tâche EMR sans serveur pour utiliser le catalogue de données AWS Glue de la même manière Compte AWS que votre application ou dans une autre Compte AWS.

Configuration du catalogue AWS de données Glue

Pour configurer le catalogue de données, choisissez le type d'application EMR sans serveur que vous souhaitez utiliser.

Spark

Lorsque vous utilisez EMR Studio pour exécuter vos tâches avec des applications Spark EMR sans serveur, le catalogue de données AWS Glue est le métastore par défaut.

Lorsque vous utilisez SDKs ou AWS CLI, vous pouvez définir la spark.hadoop.hive.metastore.client.factory.class configuration sur com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory dans les sparkSubmit paramètres de l'exécution de votre tâche. L'exemple suivant montre comment configurer le catalogue de données avec 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" } }'

Vous pouvez également définir cette configuration lorsque vous créez une nouvelle configuration SparkSession dans votre code 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

Pour les applications Hive EMR sans serveur, le catalogue de données est le métastore par défaut. En d'autres termes, lorsque vous exécutez des tâches sur une application Hive EMR sans serveur, Hive enregistre les informations du métastore dans le catalogue de données, au même titre que votre application. Compte AWS Vous n'avez pas besoin d'un cloud privé virtuel (VPC) pour utiliser le catalogue de données comme métastore.

Pour accéder aux tables du métastore Hive, ajoutez les politiques AWS Glue requises décrites dans la section Configuration des autorisations IAM pour Glue. AWS

Configurer l'accès entre comptes pour EMR Serverless et AWS Glue Data Catalog

Pour configurer l'accès entre comptes pour EMR Serverless, vous devez d'abord vous connecter à l'adresse suivante : Comptes AWS

  • AccountA— Et Compte AWS où vous avez créé une application EMR sans serveur.

  • AccountB— Et Compte AWS qui contient un catalogue de données AWS Glue auquel vous souhaitez que votre tâche EMR sans serveur puisse accéder.

  1. Assurez-vous qu'un administrateur ou une autre identité autorisée AccountB attache une politique de ressources au catalogue de données dansAccountB. Cette politique accorde AccountA des autorisations spécifiques entre comptes pour effectuer des opérations sur les ressources du AccountB catalogue.

    { "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. Ajoutez une IAM politique au rôle d'exécution des tâches EMR sans serveur AccountA afin que ce rôle puisse accéder aux ressources du catalogue de données dansAccountB.

    { "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. Commencez à exécuter votre tâche. Cette étape est légèrement différente selon le type AccountA d'application EMR Serverless.

    Spark

    Définissez la spark.hadoop.hive.metastore.glue.catalogid propriété dans la hive-site classification comme indiqué dans l'exemple suivant. Remplacez ID du compte B-Catalog-ID avec l'ID du catalogue de données dansAccountB.

    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

    Définissez la hive.metastore.glue.catalogid propriété dans la hive-site classification comme indiqué dans l'exemple suivant. Remplacez ID du compte B-Catalog-ID avec l'ID du catalogue de données dansAccountB.

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

Considérations relatives à l'utilisation du catalogue AWS de données Glue

Vous pouvez ajouter JARs un auxiliaire ADD JAR dans vos scripts Hive. Pour plus d'informations, consultez la section Considérations relatives à l'utilisation de AWS Glue Data Catalog.

Utilisation d'un métastore Hive externe

Vous pouvez configurer vos tâches Spark et Hive EMR sans serveur pour qu'elles se connectent à un métastore Hive externe, tel qu'Amazon Aurora ou Amazon for My. RDS SQL Cette section explique comment configurer un métastore Amazon RDS Hive, configurer votre et configurer vos VPC tâches EMR sans serveur pour utiliser un métastore externe.

Création d'un métastore Hive externe

  1. Créez un Amazon Virtual Private Cloud (AmazonVPC) avec des sous-réseaux privés en suivant les instructions de la section Create a VPC.

  2. Créez votre application EMR Serverless avec vos nouveaux sous-réseaux Amazon VPC et privés. Lorsque vous configurez votre application EMR Serverless avec unVPC, elle fournit d'abord une interface elastic network pour chaque sous-réseau que vous spécifiez. Il attache ensuite le groupe de sécurité que vous avez spécifié à cette interface réseau. Cela permet à votre application de contrôler l'accès. Pour plus de détails sur la configuration de votreVPC, consultezConfiguration de VPC l'accès.

  3. Créez une SQL base de données My SQL ou Aurora Postgre dans un sous-réseau privé de votre Amazon. VPC Pour plus d'informations sur la création d'une RDS base de données Amazon, consultez Création d'une RDS instance de base de données Amazon.

  4. Modifiez le groupe de sécurité de votre base de données My SQL ou Aurora pour autoriser JDBC les connexions depuis votre groupe de sécurité EMR Serverless en suivant les étapes de la section Modification d'une RDS instance de base de données Amazon. Ajoutez une règle pour le trafic entrant au groupe de RDS sécurité depuis l'un de vos groupes de sécurité EMR Serverless.

    Type Protocole Plage de ports Source

    Tout TCP

    TCP

    3306

    emr-serverless-security-group

Configuration des options Spark

En utilisant JDBC

Pour configurer votre application Spark EMR sans serveur afin qu'elle se connecte à un métastore Hive basé sur une SQL instance Amazon RDS for My ou Amazon SQL Aurora My, utilisez une connexion. JDBC Transmettez le mariadb-connector-java.jar with --jars dans les spark-submit paramètres de votre exécution de tâche.

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

L'exemple de code suivant est un script Spark entrypoint qui interagit avec un métastore Hive sur 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()

Utiliser le service d'épargne

Vous pouvez configurer votre application EMR Serverless Hive pour qu'elle se connecte à un métastore Hive basé sur une instance Amazon for My RDS ou Amazon SQL Aurora My. SQL Pour ce faire, exécutez un serveur d'épargne sur le nœud principal d'un EMR cluster Amazon existant. Cette option est idéale si vous possédez déjà un EMR cluster Amazon avec un serveur d'épargne que vous souhaitez utiliser pour simplifier vos configurations de tâches EMR sans serveur.

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

L'exemple de code suivant est un script entrypoint (thriftscript.py) qui utilise le protocole Thrift pour se connecter à un métastore Hive. Notez que la hive.metastore.uris propriété doit être définie pour être lue depuis un métastore Hive externe.

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

Configurer les options Hive

En utilisant JDBC

Si vous souhaitez spécifier un emplacement de base de données Hive externe sur une instance Amazon RDS My SQL ou Amazon Aurora, vous pouvez remplacer la configuration de métastore par défaut.

Note

Dans Hive, vous pouvez effectuer plusieurs écritures dans des tables de métastore en même temps. Si vous partagez des informations de métastore entre deux jobs, assurez-vous de ne pas écrire simultanément dans la même table de métastore, sauf si vous écrivez sur des partitions différentes de la même table de métastore.

Définissez les configurations suivantes dans la hive-site classification pour activer le métastore Hive externe.

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

Utilisation d'un serveur d'épargne

Vous pouvez configurer votre application EMR Serverless Hive pour qu'elle se connecte à un métastore Hive basé sur Amazon for My RDS ou Amazon Aurora M. SQL ySQLinstance Pour ce faire, exécutez un serveur d'épargne sur le nœud principal d'un EMR cluster Amazon existant. Cette option est idéale si vous possédez déjà un EMR cluster Amazon qui exécute un serveur d'épargne et que vous souhaitez utiliser vos configurations de tâches EMR sans serveur.

Définissez les configurations suivantes dans la hive-site classification afin que EMR Serverless puisse accéder à la métastore d'épargne distante. Notez que vous devez définir la hive.metastore.uris propriété pour qu'elle puisse être lue depuis un métastore Hive externe.

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

Considérations relatives à l'utilisation d'un métastore externe