Configuración de metaalmacenes para EMR sin servidor
Un metaalmacén de Hive es una ubicación centralizada que almacena información estructural sobre las tablas, incluidos los esquemas, los nombres de las particiones y los tipos de datos. Con EMR sin servidor, puede conservar los metadatos de esta tabla en un metaalmacén que tenga acceso a sus trabajos.
Dispone de dos opciones para un metaalmacén de Hive:
-
El catálogo de datos de Glue de AWS
-
Un metaalmacén de Apache Hive externo
Uso del catálogo de datos de Glue de AWS como metaalmacén
Puede configurar sus trabajos de Spark y Hive para que usen el catálogo de datos de Glue deAWS como su metaalmacén. Recomendamos esta configuración cuando se necesita un metaalmacén persistente o un metaalmacén compartido por diferentes servicios, aplicaciones o Cuentas de AWS. Para más información acerca del catálogo de datos, consulte Cómo rellenar el catálogo de datos de Glue de AWS. Para obtener información sobre los precios de Glue de AWS, consulte Precios de Glue de AWS
Puede configurar su trabajo de EMR sin servidor para que utilizar el catálogo de datos de Glue de AWS en la misma aplicación de la Cuenta de AWS o en una Cuenta de AWS diferente.
Configuración del catálogo de datos de Glue de AWS
Para configurar el catálogo de datos, elija el tipo de aplicación EMR sin servidor que desee utilizar.
Configuración del acceso entre cuentas para EMR sin servidor y el catálogo de datos de Glue de AWS
Para configurar el acceso entre cuentas para EMR sin servidor, primero debe iniciar sesión en las siguientes Cuentas de AWS:
-
AccountA
: una Cuenta de AWS donde haya creado una aplicación EMR sin servidor. -
AccountB
: una Cuenta de AWS que contenga un catálogo de datos de Glue de AWS al que desee que accedan sus ejecuciones de trabajos de EMR sin servidor.
-
Asegúrese de que un administrador u otra identidad autorizada en la
AccountB
adjunte una política de recursos al catálogo de datos en laAccountB
. Esta política otorga permisos específicos entre cuentas deAccountA
para realizar operaciones con los recursos del catálogo deAccountB
.{ "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"] } ] } -
Agregue una política de IAM a rol de tiempo de ejecución del trabajo de EMR sin servidor en
AccountA
para que este rol pueda acceder a los recursos del catálogo de datos enAccountB
.{ "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"] } ] } -
Inicio de su ejecución de trabajo. Este paso es ligeramente diferente según el tipo de aplicación EMR sin servidor de la
AccountA
.
Consideraciones a la hora de utilizar el Catálogo de datos de Glue de AWS
Puede añadir archivos JAR auxiliares con ADD JAR
en sus scripts de Hive. Para obtener información adicional, consulte Consideraciones a la hora de utilizar el catálogo de datos de Glue de AWS.
Uso de un metaalmacén de Hive externo
Puede configurar sus trabajos de EMR sin servidor Spark y Hive para que se conecten a un metaalmacén de Hive externo, como Amazon Aurora o Amazon RDS para MySQL. En esta sección se describe cómo configurar un metaalmacén Hive de Amazon RDS, cómo configurar su VPC y cómo configurar sus trabajos de EMR sin servidor para usar un metaalmacén externo.
Creación de un metaalmacén de Hive externo
-
Cree una Amazon Virtual Private Cloud (Amazon VPC) con subredes privadas siguiendo las instrucciones de Creación de una VPC.
-
Cree su aplicación EMR sin servidor con su nueva Amazon VPC y sus subredes privadas. Cuando configura la aplicación EMR sin servidor con una VPC, aprovisiona en primer lugar una red elástica para cada subred que especifique. A continuación, conecta el grupo de seguridad especificado a esa interfaz de red. Esto le da a la aplicación el control de acceso. Para obtener más información sobre cómo configurar una VPC, consulte Configuración del acceso a la VPC para que las aplicaciones EMR sin servidor se conecten a los datos.
-
Cómo crear una base de datos de MySQL o Aurora PostgreSQL en una subred privada de Amazon VPC. Para obtener información sobre cómo crear una base de datos de Amazon RDS, consulte Cómo crear una instancia de base de datos de Amazon RDS.
-
Modifique el grupo de seguridad de la base de datos MySQL o Aurora para permitir las conexiones JDBC desde el grupo de seguridad del EMR sin servidor siguiendo los pasos que se indican en Modificación de una instancia de base de datos de Amazon RDS. Agregue una regla para el tráfico entrante al grupo de seguridad de RDS desde uno de sus grupos de seguridad del EMR sin servidor.
Tipo Protocolo Intervalo de puertos Origen Todos los TCP
TCP
3306
emr-serverless-security-group
Configuración de las opciones de Spark
Uso de JDBC
Para configurar su aplicación EMR sin servidor Spark para que se conecte a un metaalmacén de Hive basado en una instancia de Amazon RDS para MySQL o Amazon Aurora MySQL, utilice una conexión JDBC. Pase el mariadb-connector-java.jar
con --jars
en los parámetros spark-submit
de su ejecución de trabajo.
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/" } } }'
El siguiente ejemplo de código es un script de punto de entrada de Spark que interactúa con un metaalmacén de Hive en 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()
Uso del servicio Thrift
Puede configurar su aplicación EMR sin servidor Hive para que se conecte a un metaalmacén de Hive basado en una instancia Amazon RDS para MySQL o Amazon Aurora MySQL. Para ello, ejecute un servidor Thrift en el nodo maestro de un clúster de Amazon EMR existente. Esta opción es ideal si ya tiene un clúster de Amazon EMR con un servidor Thrift que desea utilizar para simplificar las configuraciones de los trabajos de EMR sin servidor.
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/" } } }'
El siguiente ejemplo de código es un script de punto de entrada (thriftscript.py
) que utiliza el protocolo Thrift para conectarse a un metaalmacén de Hive. Tenga en cuenta que la propiedad hive.metastore.uris
debe configurarse para que se lea desde un metaalmacén de Hive externo.
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()
Configuración de las opciones de Hive
Uso de JDBC
Si desea especificar una ubicación de base de datos de Hive externa en una instancia de Amazon RDS MySQL o Amazon Aurora, puede anular la configuración predeterminada del metaalmacén.
nota
En Hive, puede realizar varias escrituras en tablas de metaalmacenes al mismo tiempo. Si comparte información del metaalmacén entre dos trabajos, debe asegurarse de no escribir en la misma tabla de metaalmacén simultáneamente, a menos que se escriba en distintas particiones de la misma tabla.
Establezca las siguientes configuraciones en la clasificación hive-site
para activar el metaalmacén de Hive externo.
{ "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
" } }
Uso de un servidor Thrift
Puede configurar su aplicación EMR sin servidor Hive para que se conecte a un metaalmacén de Hive basado en una instancia de Amazon RDS para MySQL o Amazon Aurora MySQL. Para ello, ejecute un servidor Thrift en el nodo principal de un clúster de Amazon EMR existente. Esta opción es ideal si ya tiene un clúster de Amazon EMR que ejecuta un servidor Thrift y desea utilizar las configuraciones de trabajo de EMR sin servidor.
Establezca las siguientes configuraciones en la clasificación hive-site
para que EMR sin servidor pueda acceder al metaalmacén remoto de Thrift. Tenga en cuenta que la propiedad hive.metastore.uris
debe establecerse para que se lea desde un metaalmacén de Hive externo.
{ "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
" } }
Consideraciones sobre el uso de un metaalmacén externo
-
Puede configurar bases de datos que sean compatibles con MariaDB JDBC como su metaalmacén. Algunos ejemplos de estas bases de datos son RDS para MariaDB, MySQL y Amazon Aurora.
-
Los metaalmacenes no se inicializan de forma automática. Si su metaalmacén no se ha inicializado con un esquema para su versión de Hive, utilice la Herramienta de esquemas de Hive
. -
EMR sin servidor no admite la autenticación Kerberos. No puede utilizar un servidor de metaalmacén Thrift con autenticación Kerberos con trabajos EMR sin servidor Spark o Hive.