Metastore-Konfiguration - Amazon EMR

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Metastore-Konfiguration

Ein Hive-Metastore ist ein zentraler Ort, an dem Strukturinformationen zu Ihren Tabellen gespeichert werden, einschließlich Schemas, Partitionsnamen und Datentypen. Mit EMR Serverless können Sie diese Tabellenmetadaten in einem Metastore speichern, der Zugriff auf Ihre Jobs hat.

Sie haben zwei Optionen für einen Hive-Metastore:

  • Der AWS Glue-Datenkatalog

  • Ein externer Apache Hive-Metastore

Den AWS Glue-Datenkatalog als Metastore verwenden

Sie können Ihre Spark- und Hive-Jobs so konfigurieren, dass sie den AWS Glue-Datenkatalog als Metastore verwenden. Wir empfehlen diese Konfiguration, wenn Sie einen persistenten Metastore oder einen Metastore benötigen, der von verschiedenen Anwendungen, Diensten oder gemeinsam genutzt wird. AWS-Konten Weitere Informationen zum Datenkatalog finden Sie unter Füllen des AWS Glue-Datenkatalogs. Informationen zu den Preisen von AWS Glue finden Sie unter Preise für AWS Glue.

Sie können Ihren EMR Serverless-Job so konfigurieren, dass er den AWS Glue-Datenkatalog entweder in derselben AWS-Konto Anwendung oder in einer anderen AWS-Konto verwendet.

Den AWS Glue-Datenkatalog konfigurieren

Um den Datenkatalog zu konfigurieren, wählen Sie aus, welche Art von EMR serverloser Anwendung Sie verwenden möchten.

Spark

Wenn Sie EMR Studio verwenden, um Ihre Jobs mit EMR serverlosen Spark-Anwendungen auszuführen, ist der AWS Glue-Datenkatalog der Standard-Metastore.

Wenn Sie SDKs oder verwenden AWS CLI, können Sie die spark.hadoop.hive.metastore.client.factory.class Konfiguration com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory in den sparkSubmit Parametern Ihrer Jobausführung auf einstellen. Das folgende Beispiel zeigt, wie Sie den Datenkatalog mit dem konfigurieren 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" } }'

Alternativ können Sie diese Konfiguration festlegen, wenn Sie SparkSession in Ihrem Spark-Code einen neuen erstellen.

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

Für EMR serverlose Hive-Anwendungen ist der Datenkatalog der Standard-Metastore. Das heißt, wenn Sie Jobs auf einer EMR Serverless Hive-Anwendung ausführen, zeichnet Hive Metastore-Informationen im Datenkatalog genauso auf wie Ihre Anwendung. AWS-Konto Sie benötigen keine virtuelle private Cloud (VPC), um den Datenkatalog als Metastore zu verwenden.

Um auf die Hive-Metastore-Tabellen zuzugreifen, fügen Sie die erforderlichen AWS Glue-Richtlinien hinzu, die unter IAMBerechtigungen für AWS Glue einrichten beschrieben sind.

Kontoübergreifenden Zugriff für EMR Serverless und AWS Glue Data Catalog konfigurieren

Um den kontenübergreifenden Zugriff für EMR Serverless einzurichten, müssen Sie sich zunächst mit den folgenden Konten anmelden: AWS-Konten

  • AccountA— Ein AWS-Konto Ort, an dem Sie eine EMR serverlose Anwendung erstellt haben.

  • AccountB— Ein AWS-Konto , der einen AWS Glue-Datenkatalog enthält, auf den Ihre EMR serverlosen Jobläufe zugreifen sollen.

  1. Stellen Sie sicher, dass ein Administrator oder eine andere autorisierte Person eine AccountB Ressourcenrichtlinie an den Datenkatalog in anhängt. AccountB Diese Richtlinie gewährt AccountA spezifische kontoübergreifende Berechtigungen zur Ausführung von Vorgängen mit Ressourcen im AccountB Katalog.

    { "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. Fügen Sie der Runtime-Rolle für EMR serverlose Jobs eine IAM Richtlinie hinzu, AccountA sodass diese Rolle auf Datenkatalogressourcen in zugreifen kann. 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. Starten Sie Ihren Job Run. Dieser Schritt unterscheidet sich je AccountA nach EMR serverlosem Anwendungstyp geringfügig.

    Spark

    Legen Sie die spark.hadoop.hive.metastore.glue.catalogid Eigenschaft in der hive-site Klassifizierung fest, wie im folgenden Beispiel gezeigt. Ersetzen Konto B-Katalog-ID mit der ID des Datenkatalogs in. 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

    Stellen Sie die hive.metastore.glue.catalogid Eigenschaft in der hive-site Klassifizierung ein, wie im folgenden Beispiel gezeigt. Ersetzen Konto B-Katalog-ID mit der ID des Datenkatalogs in. 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" } }] }'

Überlegungen zur Verwendung des AWS Glue-Datenkatalogs

Sie können Ihren JARs ADD JAR Hive-Skripten Hilfsmittel hinzufügen. Weitere Überlegungen finden Sie unter Überlegungen zur Verwendung des AWS Glue-Datenkatalogs.

Verwenden eines externen Hive-Metastores

Sie können Ihre EMR serverlosen Spark- und Hive-Jobs so konfigurieren, dass sie eine Verbindung zu einem externen Hive-Metastore wie Amazon Aurora oder Amazon for My herstellen. RDS SQL In diesem Abschnitt wird beschrieben, wie Sie einen Amazon RDS Hive-Metastore einrichten, Ihre EMR serverlosen Jobs konfigurieren und so konfigurierenVPC, dass sie einen externen Metastore verwenden.

Erstellen Sie einen externen Hive-Metastore

  1. Erstellen Sie eine Amazon Virtual Private Cloud (AmazonVPC) mit privaten Subnetzen, indem Sie den Anweisungen unter Erstellen einer VPC folgen.

  2. Erstellen Sie Ihre EMR serverlose Anwendung mit Ihren neuen Amazon VPC - und privaten Subnetzen. Wenn Sie Ihre EMR Serverless-Anwendung mit a konfigurierenVPC, stellt sie zunächst eine elastic network interface für jedes von Ihnen angegebene Subnetz bereit. Anschließend wird Ihre angegebene Sicherheitsgruppe an diese Netzwerkschnittstelle angehängt. Dadurch erhält Ihre Anwendung die Zugriffskontrolle. Weitere Informationen zur Einrichtung Ihres finden Sie VPC unterZugriff konfigurieren VPC.

  3. Erstellen Sie eine My SQL - oder Aurora SQL Postgre-Datenbank in einem privaten Subnetz in Ihrem Amazon. VPC Informationen zum Erstellen einer RDS Amazon-Datenbank finden Sie unter RDSAmazon-DB-Instance erstellen.

  4. Ändern Sie die Sicherheitsgruppe Ihrer My SQL - oder Aurora-Datenbank, um JDBC Verbindungen von Ihrer EMR Serverless-Sicherheitsgruppe aus zuzulassen, indem Sie die Schritte unter Ändern einer RDS Amazon-DB-Instance befolgen. Fügen Sie der RDS Sicherheitsgruppe eine Regel für eingehenden Datenverkehr aus einer Ihrer EMR serverlosen Sicherheitsgruppen hinzu.

    Typ Protocol (Protokoll) Port-Bereich Quelle

    Alle TCP

    TCP

    3306

    emr-serverless-security-group

Spark-Optionen konfigurieren

Verwenden JDBC

Verwenden Sie eine Verbindung, um Ihre EMR serverlose Spark-Anwendung so zu konfigurieren, dass sie eine Verbindung zu einem Hive-Metastore herstellt, der auf einer Amazon RDS for My SQL - oder Amazon Aurora SQL My-Instance basiert. JDBC Übergeben Sie das mariadb-connector-java.jar mit --jars in den spark-submit Parametern Ihres Joblaufs.

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

Das folgende Codebeispiel ist ein Spark-Einstiegspunktskript, das mit einem Hive-Metastore auf Amazon interagiert. 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()

Den Thrift-Service nutzen

Sie können Ihre EMR Serverless Hive-Anwendung so konfigurieren, dass sie eine Verbindung zu einem Hive-Metastore herstellt, der auf einer Amazon RDS for My SQL - oder Amazon Aurora My-Instance basiert. SQL Führen Sie dazu einen Thrift-Server auf dem Master-Knoten eines vorhandenen EMR Amazon-Clusters aus. Diese Option ist ideal, wenn Sie bereits über einen EMR Amazon-Cluster mit einem Thrift-Server verfügen, den Sie verwenden möchten, um Ihre EMR serverlosen Jobkonfigurationen zu vereinfachen.

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

Das folgende Codebeispiel ist ein Entrypoint-Skript (thriftscript.py), das das Thrift-Protokoll verwendet, um eine Verbindung zu einem Hive-Metastore herzustellen. Beachten Sie, dass die hive.metastore.uris Eigenschaft so eingestellt sein muss, dass sie aus einem externen Hive-Metastore liest.

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

Konfigurieren Sie die Hive-Optionen

Verwenden JDBC

Wenn Sie einen externen Hive-Datenbankspeicherort auf einer Amazon RDS My SQL - oder Amazon Aurora Aurora-Instance angeben möchten, können Sie die Standard-Metastore-Konfiguration überschreiben.

Anmerkung

In Hive können Sie mehrere Schreibvorgänge in Metastore-Tabellen gleichzeitig ausführen. Wenn Sie Metastore-Informationen zwischen zwei Jobs gemeinsam nutzen, stellen Sie sicher, dass Sie nicht gleichzeitig in dieselbe Metastore-Tabelle schreiben, es sei denn, Sie schreiben in verschiedene Partitionen derselben Metastore-Tabelle.

Legen Sie die folgenden Konfigurationen in der hive-site Klassifizierung fest, um den externen Hive-Metastore zu aktivieren.

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

Verwenden Sie einen Thrift-Server

Sie können Ihre EMR Serverless Hive-Anwendung so konfigurieren, dass sie eine Verbindung zu einem Hive-Metastore herstellt, der auf Amazon RDS for My SQL oder Amazon Aurora M basiert. ySQLinstance Führen Sie dazu einen Thrift-Server auf dem Hauptknoten eines vorhandenen EMR Amazon-Clusters aus. Diese Option ist ideal, wenn Sie bereits über einen EMR Amazon-Cluster verfügen, auf dem ein Thrift-Server ausgeführt wird, und Sie Ihre EMR serverlosen Jobkonfigurationen verwenden möchten.

Legen Sie die folgenden Konfigurationen in der hive-site Klassifizierung fest, sodass EMR Serverless auf den Remote-Thrrift-Metastore zugreifen kann. Beachten Sie, dass Sie die hive.metastore.uris Eigenschaft so einstellen müssen, dass sie aus einem externen Hive-Metastore liest.

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

Überlegungen bei der Verwendung eines externen Metastores