Prise en charge d'AWS Glue Data Catalog pour les tâches Spark SQL
AWS Glue Data Catalog est un catalogue compatible avec le métastore Apache Hive. Vous pouvez configurer vos tâches et points de terminaison de développement AWS Glue de manière à utiliser Data Catalog en tant que métastore Apache Hive externe. Vous pouvez alors exécuter directement les requêtes Apache Spark SQL sur les tables stockées dans le Data Catalog. Les images dynamiques AWS Glue s'intègrent au Catalog Data par défaut. Toutefois, avec cette fonctionnalité, les tâches Spark SQL peuvent commencer à utiliser Data Catalog en tant que métastore Hive externe.
Cette fonctionnalité nécessite un accès réseau à l'API de point de terminaison AWS Glue. Pour AWS Glue avec des connexions situées dans des sous-réseaux privés, vous devez configurer un point de terminaison VPC ou une passerelle NAT pour fournir l'accès au réseau. Pour plus d'informations sur la configuration des points de terminaison de VPC, reportez-vous à Configuration de l'accès réseau aux magasins de données. Pour créer une passerelle NAT, veuillez consulter Passerelles NAT dans le Guide de l'utilisateur Amazon VPC.
Vous pouvez configurer des tâches et des points de terminaison de développement AWS Glue en ajoutant l'argument "--enable-glue-datacatalog": "" aux arguments de tâche et aux arguments de point de terminaison de développement, respectivement. La transmission de cet argument définit certaines configurations dans Spark qui lui permettent d'accéder à Data Catalog en tant que métastore Hive externe. Elle permet également la prise en charge de HiveSparkSession créé dans la tâche ou le point de terminaison de développement AWS Glue.
Pour activer l'accès au catalogue de données, cochez la case Use AWS Glue Data Catalog as the Hive metastore (Utiliser le catalogue de données Glue en tant que metastore Hive) dans le groupe Catalog options (Options de catalogue) dans la page Ajouter une tâche ou Add endpoint (Ajouter un point de terminaison) sur la console. Notez que le rôle IAM utilisé pour la tâche ou le point de terminaison de développement doit disposer des autorisations glue:CreateDatabase. Une base de données appelée « default » est créée dans Data Catalog, si elle n'existe pas déjà.
Prenons l'exemple de la façon dont vous pouvez utiliser cette fonction dans vos tâches Spark SQL. L'exemple suivant suppose que vous avez analysé l'ensemble de données des législateurs américains disponible dans s3://awsglue-datasets/examples/us-legislators.
Pour sérialiser/désérialiser les données à partir des tables définies dans AWS Glue Data Catalog, Spark SQL a besoin de la classe Hive SerDe
Les SerDe pour certains formats courants sont distribués par AWS Glue. Voici les liens Amazon S3 pour :
Ajoutez le SerDe JSON en tant que fichier JAR supplémentaire pour le point de terminaison de développement. Pour les tâches, vous pouvez ajouter le SerDe en utilisant l'argument --extra-jars dans le champ d'arguments. Pour de plus amples informations, consultez Utilisation des paramètres de tâche dans les tâches AWS Glue.
Voici un exemple d'entrée JSON pour créer un point de terminaison de développement avec Data Catalog activé pour 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" }
Maintenant, interrogez les tables créées à partir de l'ensemble de données des législateurs américains à l'aide de 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 classe SerDe pour le format n'est pas disponible dans le chemin de classe de la tâche, vous verrez une erreur similaire à la suivante.
>>> 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
Pour afficher uniquement les éléments organization_id distincts à partir de la table memberships, exécutez la requête SQL suivante.
>>> spark.sql("select distinct organization_id from memberships_json").show() +--------------------+ | organization_id| +--------------------+ |d56acebe-8fdc-47b...| |8fa6c3d2-71dc-478...| +--------------------+
Si vous devez faire de même avec des images dynamiques, exécutez le code suivant.
>>> 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...| +--------------------+
Les images dynamiques sont optimisées pour les opérations ETL, mais l'activation de Spark SQL pour accéder à Data Catalog directement fournit une méthode concise pour l'exécution d'instructions SQL complexes ou le transfert d'applications existantes.