Soporte de AWS Glue Data Catalog para trabajos de Spark SQL - AWS Glue

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Soporte de AWS Glue Data Catalog para trabajos de Spark SQL

AWS Glue Data Catalog es un catálogo compatible con metaalmacenes de Apache Hive. Puede configurar los trabajos y los puntos de conexión de desarrollo de AWS Glue para que utilicen el Data Catalog como un metaalmacén de Apache Hive externo. De este modo, podrá ejecutar directamente consultas de Apache Spark SQL en las tablas almacenadas en el catálogo de datos. De forma predeterminada, los marcos dinámicos de AWS Glue se integran con Data Catalog. Sin embargo, con esta característica, los trabajos de Spark SQL pueden empezar a utilizar Data Catalog como un metaalmacén de Hive externo.

Esta característica requiere el acceso de red al punto de conexión de la API de AWS Glue Para trabajos de AWS Glue con conexiones ubicadas en subredes privadas, debe configurar un punto de conexión de VPC o una puerta de enlace NAT para proporcionar el acceso a la red. Para obtener más información sobre la configuración del punto de conexión de VPC, consulte Configuración del acceso de red a los almacenes de datos. Para crear una gateway NAT, consulte Gateways NAT en la Guía del usuario de Amazon VPC.

Puede configurar los trabajos y los puntos de enlace de AWS Glue añadiendo el argumento "--enable-glue-datacatalog": "" a los argumentos de los trabajos y los puntos de enlace de desarrollo, respectivamente. Al transferir este argumento, se definen ciertas configuraciones en Spark que le permiten obtener acceso a Data Catalog como un metaalmacén de Hive externo. También permite la compatibilidad de Hive en el objeto SparkSession creado en el trabajo o punto de enlace de desarrollo de AWS Glue.

Para permitir el acceso a Data Catalog, verifique la casilla Use AWS Glue Data Catalog as the Hive metastore (Utilizar AWS Glue Data Catalog como metastore de Hive) del grupo Catalog options (Opciones de Catalog), que encontrará en la página Add job (Agregar trabajo) o Add endpoint (Agregar punto de conexión) de la consola. Tenga en cuenta que el rol de IAM utilizado para el trabajo o el punto de enlace de desarrollo debe tener permisos glue:CreateDatabase. Si no existe una base de datos, se crea una denominada "default" en Data Catalog.

Veamos un ejemplo acerca de cómo se puede utilizar esta característica en los trabajos de Spark SQL. En el siguiente ejemplo, se presupone que se han rastreado los conjuntos de datos de legisladores de EE. UU. disponibles en s3://awsglue-datasets/examples/us-legislators.

Para serializar o deserializar los datos de las tablas definidas en AWS Glue Data Catalog, Spark SQL necesita la clase Hive SerDe del formato definido en AWS Glue Data Catalog, en la ruta de clase del trabajo de Spark.

AWS Glue distribuye las clases SerDe de algunos formatos comunes. A continuación, se incluyen los enlaces de Amazon S3 de dichas clases:

Añada la clase SerDe de JSON como un JAR adicional al punto de enlace de desarrollo. En el caso de los trabajos, puede añadir la clase SerDe utilizando el argumento --extra-jars en el campo "arguments". Para obtener más información, consulte Parámetros de los trabajos de AWS Glue.

A continuación, se muestra un ejemplo de un JSON de entrada que crea un punto de enlace de desarrollo con Data Catalog habilitado para Spark SQL.

{ "EndpointName": "Name", "RoleArn": "role_ARN", "PublicKey": "public_key_contents", "NumberOfNodes": 2, "Arguments": { "--enable-glue-datacatalog": "" }, "ExtraJarsS3Path": "s3://crawler-public/json/serde/json-serde.jar" }

Ahora, puede consultar las tablas creadas a partir del conjunto de datos de los legisladores de EE. UU con Spark SQL.

>>> spark.sql("use legislators") DataFrame[] >>> spark.sql("show tables").show() +-----------+------------------+-----------+ | database| tableName|isTemporary| +-----------+------------------+-----------+ |legislators| areas_json| false| |legislators| countries_json| false| |legislators| events_json| false| |legislators| memberships_json| false| |legislators|organizations_json| false| |legislators| persons_json| false| +-----------+------------------+-----------+ >>> spark.sql("describe memberships_json").show() +--------------------+---------+-----------------+ | col_name|data_type| comment| +--------------------+---------+-----------------+ | area_id| string|from deserializer| | on_behalf_of_id| string|from deserializer| | organization_id| string|from deserializer| | role| string|from deserializer| | person_id| string|from deserializer| |legislative_perio...| string|from deserializer| | start_date| string|from deserializer| | end_date| string|from deserializer| +--------------------+---------+-----------------+

Si la clase SerDe del formato no está disponible en el classpath del trabajo, aparecerá un error similar al siguiente.

>>> spark.sql("describe memberships_json").show() Caused by: MetaException(message:java.lang.ClassNotFoundException Class org.openx.data.jsonserde.JsonSerDe not found) at org.apache.hadoop.hive.metastore.MetaStoreUtils.getDeserializer(MetaStoreUtils.java:399) at org.apache.hadoop.hive.ql.metadata.Table.getDeserializerFromMetaStore(Table.java:276) ... 64 more

Para ver únicamente los diferentes valores de organization_id de la tabla memberships, ejecute la siguiente consulta SQL.

>>> spark.sql("select distinct organization_id from memberships_json").show() +--------------------+ | organization_id| +--------------------+ |d56acebe-8fdc-47b...| |8fa6c3d2-71dc-478...| +--------------------+

Si debe hacer lo mismo con marcos dinámicos, ejecute lo siguiente.

>>> memberships = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="memberships_json") >>> memberships.toDF().createOrReplaceTempView("memberships") >>> spark.sql("select distinct organization_id from memberships").show() +--------------------+ | organization_id| +--------------------+ |d56acebe-8fdc-47b...| |8fa6c3d2-71dc-478...| +--------------------+

Aunque DynamicFrames está optimizado para las operaciones de ETL, permitir que Spark SQL tenga acceso a Data Catalog es un modo sencillo de ejecutar instrucciones SQL complejas o migrar aplicaciones existentes.