Aller au contenu principal

Utiliser AWS Glue Data Catalog comme métastore (hérité)

important

Cette documentation a été retirée et pourrait ne pas être mise à jour.

remarque

L’utilisation de métastores externes est un modèle de gouvernance des données hérité. Databricks vous recommande de passer à Unity Catalog. Unity Catalog simplifie la sécurité et la gouvernance de vos données en fournissant un emplacement central pour administrer et auditer l'accès aux données dans plusieurs Workspaces de votre compte. Voir Qu'est-ce que Unity Catalog ?.

Vous pouvez configurer Databricks Runtime pour utiliser le AWS Glue Data Catalog comme métastore. Ceci peut servir de remplacement direct pour un Hive metastore.

Chaque compte AWS possède un seul catalogue dans une région AWS dont l'ID de catalogue est le même que l'ID du compte AWS. L'utilisation du catalogue Glue comme métastore pour Databricks peut potentiellement permettre un métastore partagé entre les services AWS, les applications ou les comptes AWS.

Vous pouvez configurer plusieurs workspaces Databricks pour partager le même métastore.

Cet article explique comment accéder en toute sécurité à un data catalog Glue dans Databricks à l'aide de profils d'instance.

Exigences

  • Vous devez disposer d'un accès administrateur AWS aux rôles et stratégies IAM dans le compte AWS où Databricks est déployé et dans le compte AWS contenant le data catalog Glue.
  • Si le data catalog Glue est dans un compte AWS différent de celui où Databricks est déployé, une politique d'accès inter-comptes doit autoriser l'accès au catalog depuis le compte AWS où Databricks est déployé. Veuillez noter que nous ne prenons en charge l'octroi d'un accès inter-comptes qu'en utilisant une politique de ressources pour Glue.
  • Le mode intégré nécessite Databricks Runtime 8.4 ou une version ultérieure, ou Databricks Runtime 7.3 LTS.

Configurez Glue Data Catalog comme métastore

Pour activer l'intégration du catalogue Glue, définissez la configuration Spark spark.databricks.hive.metastore.glueCatalog.enabled true. Cette configuration est désactivée par default. C'est-à-dire que le default est d'utiliser le Hive metastore hébergé par Databricks, ou un autre metastore externe s'il est configuré.

Pour les clusters interactifs ou de Jobs, définissez la configuration dans la configuration du cluster avant le Startup du cluster.

important

Cette option de configuration ne peut pas être modifiée dans un cluster en cours d’exécution.

Lors de l'exécution de spark-submit jobs, définissez cette option de configuration soit dans les spark-submit paramètres à l'aide de, soit --conf spark.databricks.hive.metastore.glueCatalog.enabled=true définissez-la dans le code *avant* de créer le SparkSession ou SparkContext le. Par exemple :

Python
from pyspark.sql import SparkSession

# Set the Glue confs here directly instead of using the --conf option in spark-submit
spark = SparkSession.builder. \
appName("ExamplePySparkSubmitTask"). \
config("spark.databricks.hive.metastore.glueCatalog.enabled", "true"). \
enableHiveSupport(). \
getOrCreate()
print(spark.sparkContext.getConf().get("spark.databricks.hive.metastore.glueCatalog.enabled"))
spark.sql("show databases").show()
spark.stop()

La manière de configurer l'accès au catalogue Glue dépend de si Databricks et le catalogue Glue se trouvent dans le même compte et la même région AWS, dans des comptes différents ou dans des régions différentes. Suivez les étapes appropriées dans le reste de cet article :

  • Même compte et région AWS : suivez l'étape 1, puis les étapes 3 à 5.
  • **Inter-compte** : Suivez les étapes 1 à 6.
  • Interrégional : Suivez l'étape 1, puis les étapes de 3 à 6.
important

Les politiques du data catalog AWS Glue définissent uniquement les autorisations d'accès aux métadonnées. Les politiques S3 définissent les autorisations d'accès au contenu lui-même. Ces étapes mettent en place une politique sur le data catalog AWS Glue. Ils ne configurent pas le compartiment S3 associé ou les politiques au niveau de l'objet. Consultez Tutoriel : configurer l'accès S3 avec un profil d'instance pour configurer les autorisations S3 pour Databricks.

Pour plus d'informations, consultez Restreindre l'accès à votre Data Catalog AWS Glue avec des autorisations IAM au niveau des ressources et des politiques basées sur les ressources.

Étape 1 : Créez un profil d'instance pour accéder à un data catalog Glue

  1. Dans la console AWS, accédez au service IAM.

  2. Cliquez sur le tab Roles dans la barre latérale.

  3. Cliquez sur Créer un rôle .

    1. Sous Sélectionner le type d'entité de confiance, sélectionnez AWS service .

    2. Cliquez sur le service **EC2**.

    3. Sous Sélectionnez votre cas d’utilisation, cliquez sur EC2 .

      Sélectionner un service

    4. Cliquez sur **Suivant : Permissions** et cliquez sur **Suivant : Vérifier**.

    5. Dans le champ Nom du rôle, saisissez un nom de rôle.

    6. Cliquez sur Créer un rôle . La liste des rôles s'affiche.

  4. Dans la liste des rôles, cliquez sur le rôle.

  5. Ajoutez une stratégie en ligne au catalogue Glue.

    1. Dans le tab Autorisations, cliquez sur Politique en ligne.

    2. Cliquez sur l'onglet JSON .

    3. Copiez et collez cette politique dans l'tab.

      JSON
      {
      "Version": "2012-10-17",
      "Statement": [
      {
      "Sid": "GrantCatalogAccessToGlue",
      "Effect": "Allow",
      "Action": [
      "glue:BatchCreatePartition",
      "glue:BatchDeletePartition",
      "glue:BatchGetPartition",
      "glue:CreateDatabase",
      "glue:CreateTable",
      "glue:CreateUserDefinedFunction",
      "glue:DeleteDatabase",
      "glue:DeletePartition",
      "glue:DeleteTable",
      "glue:DeleteUserDefinedFunction",
      "glue:GetDatabase",
      "glue:GetDatabases",
      "glue:GetPartition",
      "glue:GetPartitions",
      "glue:GetTable",
      "glue:GetTables",
      "glue:GetUserDefinedFunction",
      "glue:GetUserDefinedFunctions",
      "glue:UpdateDatabase",
      "glue:UpdatePartition",
      "glue:UpdateTable",
      "glue:UpdateUserDefinedFunction"
      ],
      "Resource": "arn:aws:glue:<aws-region-target-glue-catalog>:<aws-account-id-target-glue-catalog>:*",
      "Condition": {
      "ArnEquals": {
      "aws:PrincipalArn": ["arn:aws:iam::<aws-account-id-databricks>:role/<iam-role-for-glue-access>"]
      }
      }
      }
      ]
      }

Pour une configuration granulaire des ressources autorisées (catalogue, base de données, table, fonction définie par l'utilisateur), consultez Spécification des ARNs de ressources AWS Glue.

Si la liste des actions autorisées dans la politique ci-dessus est insuffisante, contactez le support Databricks avec les informations d'erreur. La solution de contournement la plus simple consiste à utiliser une politique qui donne un accès complet à Glue :

JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GrantFullAccessToGlue",
"Effect": "Allow",
"Action": ["glue:*"],
"Resource": "*"
}
]
}

Étape 2 : Créer une stratégie pour le catalogue Glue cible

Suivez cette étape uniquement si le catalogue Glue cible se trouve dans un *compte AWS différent* de celui utilisé pour le déploiement Databricks.

  1. Connectez-vous au compte AWS du catalogue Glue cible et accédez à la console Glue.

  2. Dans Paramètres, collez la politique suivante dans la zone Autorisations. Définissez <aws-account-id-databricks>, <iam-role-for-glue-access> de l’étape 1, <aws-region-target-glue-catalog>, <aws-account-id-target-glue-catalog>, en conséquence.

    JSON
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Sid": "Example permission",
    "Effect": "Allow",
    "Principal": {
    "AWS": "arn:aws:iam::<aws-account-id-databricks>:role/<iam-role-for-glue-access>"
    },
    "Action": [
    "glue:BatchCreatePartition",
    "glue:BatchDeletePartition",
    "glue:BatchGetPartition",
    "glue:CreateDatabase",
    "glue:CreateTable",
    "glue:CreateUserDefinedFunction",
    "glue:DeleteDatabase",
    "glue:DeletePartition",
    "glue:DeleteTable",
    "glue:DeleteUserDefinedFunction",
    "glue:GetDatabase",
    "glue:GetDatabases",
    "glue:GetPartition",
    "glue:GetPartitions",
    "glue:GetTable",
    "glue:GetTables",
    "glue:GetUserDefinedFunction",
    "glue:GetUserDefinedFunctions",
    "glue:UpdateDatabase",
    "glue:UpdatePartition",
    "glue:UpdateTable",
    "glue:UpdateUserDefinedFunction"
    ],
    "Resource": "arn:aws:glue:<aws-region-target-glue-catalog>:<aws-account-id-target-glue-catalog>:*"
    }
    ]
    }

Étape 3 : recherchez le rôle IAM utilisé pour créer le déploiement Databricks

Ce rôle IAM est celui que vous avez utilisé lors de la configuration du compte Databricks.

Les étapes suivantes sont différentes pour les comptes utilisant la version E2 de la plateforme que pour les comptes utilisant une autre version de la plateforme Databricks. Tous les nouveaux comptes Databricks et la plupart des comptes existants sont désormais E2.

Si vous utilisez un compte E2:

  1. En tant que propriétaire du compte ou administrateur du compte, connectez-vous à la console du compte.

  2. Accédez aux Workspaces et cliquez sur le nom de votre Workspace.

  3. Dans la boîte **Informations d'identification**, notez le nom du rôle à la fin de l'ARN de rôle.

    Par exemple, dans l'ARN de rôle arn:aws:iam::123456789123:role/finance-prod, finance-prod est le nom du rôle.

Si vous n'êtes pas sur un compte E2 :

  1. En tant que propriétaire du compte, connectez-vous à la console du compte.

  2. Cliquez sur l'onglet Compte AWS .

  3. Notez le nom du rôle à la fin de l'ARN du rôle, ici testco-role .

    Rôle IAM

Étape 4 : Ajoutez le profil d'instance Glue Catalog à la politique EC2

  1. Dans la console AWS, accédez au service IAM.

  2. Cliquez sur l’onglet tab dans la barre latérale.

  3. Cliquez sur le rôle que vous avez noté à l’étape 3.

  4. Sur l'onglet tab, cliquez sur la politique.

  5. Cliquez sur **Modifier la politique**.

  6. Modifiez la politique pour permettre à Databricks de transmettre le profil d'instance que vous avez créé à l'étape 1 aux instances EC2 pour les clusters Spark. Voici un exemple de ce à quoi la nouvelle politique devrait ressembler. Remplacez <iam-role-for-glue-access> par le rôle que vous avez créé à l'étape 1.

    • Pour les comptes sur la version E2 de la plateforme :

      JSON
      {
      "Version": "2012-10-17",
      "Statement": [
      {
      "Sid": "Stmt1403287045000",
      "Effect": "Allow",
      "Action": [
      "ec2:AssociateDhcpOptions",
      "ec2:AssociateIamInstanceProfile",
      "ec2:AssociateRouteTable",
      "ec2:AttachInternetGateway",
      "ec2:AttachVolume",
      "ec2:AuthorizeSecurityGroupEgress",
      "ec2:AuthorizeSecurityGroupIngress",
      "ec2:CancelSpotInstanceRequests",
      "ec2:CreateDhcpOptions",
      "ec2:CreateInternetGateway",
      "ec2:CreatePlacementGroup",
      "ec2:CreateRoute",
      "ec2:CreateSecurityGroup",
      "ec2:CreateSubnet",
      "ec2:CreateTags",
      "ec2:CreateVolume",
      "ec2:CreateVpc",
      "ec2:CreateVpcPeeringConnection",
      "ec2:DeleteInternetGateway",
      "ec2:DeletePlacementGroup",
      "ec2:DeleteRoute",
      "ec2:DeleteRouteTable",
      "ec2:DeleteSecurityGroup",
      "ec2:DeleteSubnet",
      "ec2:DeleteTags",
      "ec2:DeleteVolume",
      "ec2:DeleteVpc",
      "ec2:DescribeAvailabilityZones",
      "ec2:DescribeIamInstanceProfileAssociations",
      "ec2:DescribeInstanceStatus",
      "ec2:DescribeInstances",
      "ec2:DescribePlacementGroups",
      "ec2:DescribePrefixLists",
      "ec2:DescribeReservedInstancesOfferings",
      "ec2:DescribeRouteTables",
      "ec2:DescribeSecurityGroups",
      "ec2:DescribeSpotInstanceRequests",
      "ec2:DescribeSpotPriceHistory",
      "ec2:DescribeSubnets",
      "ec2:DescribeVolumes",
      "ec2:DescribeVpcs",
      "ec2:DetachInternetGateway",
      "ec2:DisassociateIamInstanceProfile",
      "ec2:ModifyVpcAttribute",
      "ec2:ReplaceIamInstanceProfileAssociation",
      "ec2:RequestSpotInstances",
      "ec2:RevokeSecurityGroupEgress",
      "ec2:RevokeSecurityGroupIngress",
      "ec2:RunInstances",
      "ec2:TerminateInstances"
      ],
      "Resource": ["*"]
      },
      {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::<aws-account-id-databricks>:role/<iam-role-for-glue-access>"
      }
      ]
      }
      • Pour les comptes sur d'autres versions de la plateforme :
      JSON
      {
      "Version": "2012-10-17",
      "Statement": [
      {
      "Sid": "Stmt1403287045000",
      "Effect": "Allow",
      "Action": [
      "ec2:AssociateDhcpOptions",
      "ec2:AssociateIamInstanceProfile",
      "ec2:AssociateRouteTable",
      "ec2:AttachInternetGateway",
      "ec2:AttachVolume",
      "ec2:AuthorizeSecurityGroupEgress",
      "ec2:AuthorizeSecurityGroupIngress",
      "ec2:CancelSpotInstanceRequests",
      "ec2:CreateDhcpOptions",
      "ec2:CreateInternetGateway",
      "ec2:CreateKeyPair",
      "ec2:CreateRoute",
      "ec2:CreateSecurityGroup",
      "ec2:CreateSubnet",
      "ec2:CreateTags",
      "ec2:CreateVolume",
      "ec2:CreateVpc",
      "ec2:CreateVpcPeeringConnection",
      "ec2:DeleteInternetGateway",
      "ec2:DeleteKeyPair",
      "ec2:DeleteRoute",
      "ec2:DeleteRouteTable",
      "ec2:DeleteSecurityGroup",
      "ec2:DeleteSubnet",
      "ec2:DeleteTags",
      "ec2:DeleteVolume",
      "ec2:DeleteVpc",
      "ec2:DescribeAvailabilityZones",
      "ec2:DescribeIamInstanceProfileAssociations",
      "ec2:DescribeInstanceStatus",
      "ec2:DescribeInstances",
      "ec2:DescribePrefixLists",
      "ec2:DescribeReservedInstancesOfferings",
      "ec2:DescribeRouteTables",
      "ec2:DescribeSecurityGroups",
      "ec2:DescribeSpotInstanceRequests",
      "ec2:DescribeSpotPriceHistory",
      "ec2:DescribeSubnets",
      "ec2:DescribeVolumes",
      "ec2:DescribeVpcs",
      "ec2:DetachInternetGateway",
      "ec2:DisassociateIamInstanceProfile",
      "ec2:ModifyVpcAttribute",
      "ec2:ReplaceIamInstanceProfileAssociation",
      "ec2:RequestSpotInstances",
      "ec2:RevokeSecurityGroupEgress",
      "ec2:RevokeSecurityGroupIngress",
      "ec2:RunInstances",
      "ec2:TerminateInstances"
      ],
      "Resource": ["*"]
      },
      {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::<aws-account-id-databricks>:role/<iam-role-for-glue-access>"
      }
      ]
      }
  7. Cliquez sur Vérifier la politique .

  8. Cliquez sur Enregistrer les modifications .

Étape 5 : Ajouter le profil d'instance du catalogue Glue à un Workspace Databricks

  1. Accédez à la page des paramètres d’administration.

  2. Cliquez sur l' Instance Profiles tab .

  3. Cliquez sur le bouton **Ajouter un profil d'instance**. Une boîte de dialogue apparaît.

  4. Collez l'ARN du profil d'instance de l'étape 1.

    ARN du profil d&#39;instance

    Databricks valide que cet ARN de profil d'instance est à la fois syntaxiquement et sémantiquement correct. Pour valider la justesse sémantique, Databricks effectue une simulation en lançant un cluster avec ce profil d'instance. Tout échec lors de cette simulation produit une erreur de validation dans l'interface utilisateur.

remarque

La validation du profil d'instance peut échouer s'il contient la politique d'application des balises, vous empêchant d'ajouter un profil d'instance légitime. Si la validation échoue et que vous souhaitez toujours ajouter le profil d'instance à Databricks, utilisez l'API de profils d'instance et spécifiez skip_validation.

  1. Cliquez sur **Ajouter**.

  2. Spécifiez éventuellement les utilisateurs qui peuvent lancer des clusters avec le profil d'instance.

    Ajouter des utilisateurs

Étape 6 : Lancer un cluster avec le profil d'instance Glue Catalog

  1. Créez un cluster.

  2. Cliquez sur l'onglet Instances de la page de création de clusters.

  3. Dans la liste déroulante Profils d'instance , sélectionnez le profil d'instance.

    Sélectionnez un profil d&#39;instance

  4. Vérifiez que vous pouvez accéder au catalogue Glue, à l’aide de la commande suivante dans un notebook :

    SQL
     show databases;

    Si la commande réussit, ce cluster Databricks Runtime est configuré pour utiliser Glue. Selon votre compte AWS et la région Glue, vous pourriez avoir besoin d'effectuer deux étapes supplémentaires :

    • Si le compte AWS du déploiement Databricks et le compte AWS du Glue Data Catalog sont différents, une configuration inter-comptes supplémentaire est nécessaire.

      Définir spark.hadoop.hive.metastore.glue.catalogid <aws-account-id-for-glue-catalog> dans la configuration Spark.

    • Si le catalogue Glue cible se trouve dans une région différente de celle du déploiement Databricks, spécifiez également spark.hadoop.aws.region <aws-region-for-glue-catalog>.

astuce

Rappel : spark.databricks.hive.metastore.glueCatalog.enabled true est une configuration requise pour la connexion à AWS Glue.

  1. Spark inclut une prise en charge intégrée pour Hive, mais son utilisation dépend de la version de Databricks Runtime.

    • Mode d'isolation : Le support intégré pour Hive est désactivé. Bibliothèques pour Hive 1.2.1.spark2 sont chargés depuis /databricks/glue/. Dans Databricks Runtime 8.3, le mode d'isolation est activé et ne peut pas être désactivé. Dans Databricks Runtime 7.3 LTS et Databricks Runtime 8.4 et versions ultérieures, le mode d'isolation est le default mode, mais peut être désactivé.
    • Mode intégré : Le support intégré pour Hive est activé, et la version de Hive dépend de la version de Spark. Dans Databricks Runtime 7.3 LTS et Databricks Runtime 8.4 et versions ultérieures, vous pouvez activer le mode intégré en définissant spark.databricks.hive.metastore.glueCatalog.isolation.enabled false sur le cluster.
  2. Pour activer la transmission des identifiants, définissez spark.databricks.passthrough.enabled true. Cela nécessite Databricks Runtime 7.3 LTS ou Databricks Runtime 8.4 ou une version ultérieure. Sur Databricks Runtime 7.3 LTS et Databricks Runtime 8.4 et supérieur, ce paramètre active également automatiquement le mode intégré.

Limitations

  • L'utilisation d'AWS Glue Data Catalog comme métastore dans Databricks a le potentiel d'une latence plus élevée que le Hive metastore par default. Pour plus d'information, consultez Latence plus élevée avec Glue Catalog qu'avec Databricks Hive metastore dans la section Dépannage.
  • La base de données par default est créée avec un emplacement défini sur un URI utilisant le schéma dbfs: (Databricks File System). Cet emplacement n’est pas accessible à partir d’applications AWS externes à Databricks telles qu’AWS EMR ou AWS Athena. Comme solution de contournement, utilisez la clause LOCATION pour spécifier un emplacement de compartiment, tel que s3://mybucket/, lorsque vous appelez CREATE TABLE. Sinon, créez des tables dans une base de données autre que la base de données « default » et définissez les LOCATION de cette base de données sur un emplacement S3.
  • Vous ne pouvez pas basculer dynamiquement entre un catalogue Glue et un Hive metastore. Vous devez redémarrer le cluster pour que les nouvelles configurations Spark prennent effet.
  • La transmission des identifiants est prise en charge uniquement dans Databricks Runtime 8.4 et versions ultérieures.
  • Les fonctionnalités suivantes ne sont pas prises en charge :
    • Databricks Connect
    • Interactions inter-systèmes où vous partagez le même catalogue de métadonnées ou les données réelles des tables sur plusieurs systèmes.
important

Lorsque vous spécifiez un emplacement de schéma, vous devez inclure une barre oblique finale dans l'URI, telle que s3://mybucket/ plutôt que s3://mybucket. Omettre la barre oblique peut entraîner des exceptions.

Dépannage

Dans cette section :

Latence plus élevée avec Glue Catalog que Databricks Hive metastore

L'utilisation de Glue Data Catalog comme metastore externe peut entraîner une latence plus élevée que le Hive metastore hébergé par default dans Databricks. Databricks recommande d'activer la mise en cache côté client dans le client du catalogue Glue. Les sections suivantes expliquent comment configurer la mise en cache côté client pour les tables et les bases de données. Vous pouvez configurer la mise en cache côté client pour les clusters et les SQL Warehouse.

remarque
  • La mise en cache côté client n'est pas disponible pour l'opération de listage de table getTables.
  • La configuration de la durée de vie (TTL) représente un compromis entre l'efficacité du cache et la désuétude tolérable des métadonnées. Choisissez une valeur TTL qui convient au scénario spécifique.

Pour plus de détails, consultez Activation de la mise en cache côté client pour le catalogue Glue dans la documentation AWS.

Tables

ini
spark.hadoop.aws.glue.cache.table.enable true
spark.hadoop.aws.glue.cache.table.size 1000
spark.hadoop.aws.glue.cache.table.ttl-mins 30

Bases de données

ini
spark.hadoop.aws.glue.cache.db.enable true
spark.hadoop.aws.glue.cache.db.size 1000
spark.hadoop.aws.glue.cache.db.ttl-mins 30

Aucun profil d'instance attaché au cluster Databricks Runtime

Si aucun profil d'instance n'est attaché au cluster Databricks Runtime, l'exception suivante se produit lorsque vous exécutez toute opération qui nécessite une recherche dans le metastore :

Console
org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain: [EnvironmentVariableCredentialsProvider: Unable to load AWS credentials from environment variables (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY)), SystemPropertiesCredentialsProvider: Unable to load AWS credentials from Java system properties (aws.accessKeyId and aws.secretKey), com.amazonaws.auth.profile.ProfileCredentialsProvider@2245a35d: profile file cannot be null, com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@52be6b57: The requested metadata is not found at https://169.254.169.254/latest/meta-data/iam/security-credentials/];

Associez un profil d'instance disposant des autorisations suffisantes pour accéder au catalogue Glue souhaité.

Autorisation Glue Catalog insuffisante

Lorsque le profil d'instance n'accorde pas une autorisation requise pour effectuer une opération de metastore, une exception telle que la suivante se produit :

Console
org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: MetaException(message:Unable to verify existence of default database: com.amazonaws.services.glue.model.AccessDeniedException: User: arn:aws:sts::<aws-account-id>:assumed-role/<role-id>/... is not authorized to perform: glue:GetDatabase on resource: arn:aws:glue:<aws-region-for-glue-catalog>:<aws-account-id-for-glue-catalog>:catalog (Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: <request-id>));

Vérifiez que le profil d'instance joint spécifie des autorisations suffisantes. Par exemple, dans l'exception précédente, ajoutez glue:GetDatabase au profil d'instance.

Erreur d'autorisation sur glue:GetDatabase lors de l'exécution directe de SQL sur des fichiers

Dans les versions de Databricks Runtime inférieures à 8.0, lors de l'exécution d'une requête SQL directement sur des fichiers, par exemple,

SQL
select * from parquet.`path-to-data`

vous pouvez rencontrer une erreur comme suit :

Console
Error in SQL statement: AnalysisException ... is not authorized to perform: glue:GetDatabase on resource: <glue-account>:database/parquet

Cela se produit lorsque la politique IAM n’accorde pas l’autorisation d’effectuer glue:GetDatabase sur la ressource database/<datasource-format>, où <datasource-format> est un format de source de données tel que parquet ou delta.

Ajouter des autorisations à la politique IAM pour autoriser glue:GetDatabase sur database/<datasource-format>.

Il existe une limitation dans l'implémentation de l'analyseur Spark SQL, où il tente de résoudre une relation par rapport au catalogue avant de revenir à la tentative de résolution par rapport à une source de données enregistrée pour SQL sur fichier. Le fallback ne fonctionne que lorsque la tentative initiale de résolution par rapport au catalogue ne génère aucune exception.

Même si la ressource database/<datasource-format> n'existe peut-être pas, pour que le fallback vers la query SQL sur fichier s'exécute correctement, la politique IAM pour Glue Catalog doit autoriser l'exécution de l'action glue:GetDatabase sur celle-ci.

Dans Databricks Runtime 8.0 et versions supérieures, ce problème est géré automatiquement et cette solution de contournement n'est plus nécessaire.

ID de catalogue Glue non concordant

Par default, un cluster Databricks tente de se connecter au catalogue Glue dans le même compte AWS que celui utilisé pour le déploiement Databricks.

Si le catalogue Glue cible se trouve dans un compte ou une région AWS différent du déploiement Databricks, et que la configuration Spark spark.hadoop.hive.metastore.glue.catalogid n'est pas définie, le cluster se connectera au catalogue Glue dans le compte AWS du déploiement Databricks au lieu du catalogue cible.

Si la configuration spark.hadoop.hive.metastore.glue.catalogid est définie, mais que les configurations de l'étape 2 n'ont pas été correctement effectuées, tout accès au metastore provoque une exception telle que la suivante :

Console
org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: MetaException(message:Unable to verify existence of default database: com.amazonaws.services.glue.model.AccessDeniedException: User:
arn:aws:sts::<aws-account-id>:assumed-role/<role-id>/... is not authorized to perform: glue:GetDatabase on resource: arn:aws:glue:<aws-region-for-glue-catalog>:<aws-account-id-for-glue-catalog>:catalog (Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: <request-id>));

Vérifiez que la configuration est conforme aux étapes 2 et 6 de cet article.

Le catalogue Athena est en conflit avec le catalogue Glue.

Si vous avez créé des tables à l'aide d'Amazon Athena ou d'Amazon Redshift Spectrum avant le 14 août 2017, les bases de données et les tables sont stockées dans un catalogue géré par Athena, qui est séparé du AWS Glue Data Catalog. Pour intégrer Databricks Runtime à ces tables, vous devez passer au AWS Glue Data Catalog. Dans le cas contraire, Databricks Runtime ne parvient pas à se connecter au catalogue Glue ou à créer et accéder à certaines bases de données, et le message d’exception peut être cryptique.

Par exemple, si la base de données « default » existe dans l’Athena Catalog mais pas dans le Glue Catalog, une exception se produira avec un message tel que :

Console
AWSCatalogMetastoreClient: Unable to verify existence of default database:
com.amazonaws.services.glue.model.AccessDeniedException: Please migrate your Catalog to enable access to this database (Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: <request-id>)

Suivez les instructions dans Mise à niveau vers le data catalog AWS Glue dans le Guide de l'utilisateur Amazon Athena.

Création d'une table dans une base de données vide LOCATION

Les bases de données du catalogue Glue peuvent être créées à partir de diverses sources. Les bases de données créées par Databricks Runtime ont un champ LOCATION non vide default. Les bases de données créées directement dans la Console Glue ou importées d'autres sources peuvent avoir un champ LOCATION vide.

Lorsque Databricks Runtime tente de créer une table dans une base de données avec un champ LOCATION vide, une exception comme celle-ci se produit :

Console
IllegalArgumentException: Can not create a Path from an empty string

Créez la base de données dans le catalogue Glue avec un chemin valide et non vide dans le champ LOCATION, spécifiez le LOCATION lors de la création de la table en SQL, ou spécifiez option("path", <some-valid-path>) dans l'API DataFrame.

Lorsque vous créez une base de données dans la console AWS Glue, seul le nom est requis ; la « Description » et l'« Emplacement » sont tous deux marqués comme facultatifs. Cependant, les opérations du Hive metastore dépendent de l'« Emplacement », vous devez donc le spécifier pour les bases de données qui seront utilisées dans Databricks Runtime.

Accéder aux tables entre des workspaces Databricks à partir d'un catalogue Glue partagé

Le mot-clé LOCATION peut être défini au niveau de la base de données (contrôlant l'emplacement default pour toutes les tables) ou dans le cadre de l'instruction CREATE TABLE. Si le chemin spécifié par LOCATION est un compartiment monté, vous devez utiliser le même nom de montage dans tous les Workspaces Databricks qui partagent le catalogue Glue. Étant donné que le catalogue Glue stocke les références aux données en utilisant le chemin spécifié par la valeur LOCATION, l'utilisation du même nom de point de montage garantit que chaque Workspace peut accéder aux objets de base de données stockés dans le compartiment S3.

Accès aux tables et vues créées dans un autre système

L'accès aux tables et vues créées par d'autres systèmes, tels qu'AWS Athena ou Presto, peut ou non fonctionner dans Databricks Runtime ou Spark, et ces opérations ne sont pas prises en charge. Elles peuvent échouer avec des messages d'erreur cryptiques. Par exemple, l'accès à une vue créée par Athena, Databricks Runtime ou Spark peut générer une exception telle que :

Console
IllegalArgumentException: Can not create a Path from an empty string

Cette exception se produit parce qu'Athena et Presto stockent les métadonnées de vue dans un format différent de celui attendu par Databricks Runtime et Spark.