Metastore Data Catalog

Apache Hive est une structure d'entreposage de données qui facilite la lecture, l'écriture ou la gestion des opérations sur des ensembles de données volumineux résidant dans des systèmes distribués.

Le metastore Data Catalog fournit un référentiel central de métadonnées hautement disponible et évolutif pour un cluster Hive. Il stocke les métadonnées pour les structures de données telles que les bases de données, les tables et les partitions dans une base de données relationnelle, s'appuyant sur des fichiers gérés dans Object Storage. Apache Spark SQL utilise le metastore Data Catalog à cette fin.

Les instances OCI Data Flow, OCI Big Data Service et OCI Data Science ont accès au metastore Data Catalog pour stocker et extraire en toute sécurité les définitions de schéma des objets dans des ressources de données non structurées et semi-structurées, telles qu'Object Storage.

Prérequis

Avant de créer un metastore dans Data Catalog, vous devez créer deux buckets dans Oracle Object Storage, qui vont contenir les tables gérée et externe.
  • Table gérée : le metastore gère l'objet de table.
  • Table externe : en tant qu'utilisateur, vous gérez l'objet de table.

Lors de la création du metastore dans Data Catalog, vous indiquez les URI des buckets dans lesquels résident les tables gérée et externe. Le format de l'URI doit être oci://<bucket_name>@<namespace_name>/<folder name of your choice>.

Remarque

Nous vous recommandons de ne pas utiliser le même emplacement pour les tables gérée et externe. Si les deux types de table se trouvent dans le même répertoire, la suppression de données de tables gérées peut entraîner la perte de données de tables externes.

Pour plus d'informations, reportez-vous à Connecteur HDFS.

Stratégies IAM requises

Vous devez ajouter des stratégies permettant au principal de ressource de metastore d'accéder aux emplacements de stockage.

Tout d'abord, vous devez créer un groupe dynamique qui inclut le metastore. Dans les instructions de stratégie suivantes, son OCID est représenté par <dg-metastore-ocid> :
ALLOW dynamic-group <dg-metastore-ocid> to read buckets in tenancy where any {all {target.bucket.name='<managed-table-location-bucket>', request.region='<managed-table-location-bucket-region>'}, all {target.bucket.name='<external-table-location-bucket>', request.region='<external-table-location-bucket-region>'}}
ALLOW dynamic-group <dg-metastore-ocid> to manage objects in tenancy where all {target.bucket.name='<managed-table-location-bucket>', request.region='<managed-table-location-bucket-region>'}
ALLOW dynamic-group <dg-metastore-ocid> to read objects in tenancy where all {target.bucket.name='<external-table-location-bucket>', request.region='<external-table-location-bucket-region>'}
Remarque

Pour autoriser le metastore à créer dynamiquement des buckets par base de données à l'aide du paramètre spark.conf définissant oci.dcat.metastore.create.bucket.per.db = true, ajoutez les stratégies suivantes :
ALLOW dynamic-group <dg-metastore-ocid> to manage buckets in tenancy where any {all {target.bucket.name='<managed-table-location-bucket>', request.region='<managed-table-location-bucket-region>'}}
ALLOW dynamic-group <dg-metastore-ocid> to read buckets in tenancy where any {all {target.bucket.name='<external-table-location-bucket>', request.region='<external-table-location-bucket-region>'}}

Seuls Admin et les utilisateurs du groupe Administrators ont accès à toutes les ressources de metastore Data Catalog. En tant que Admin, vous pouvez utiliser les stratégies suivantes pour fournir l'accès à toutes les ressources de metastore.

allow <any-user> to manage data-catalog-metastore-assets in compartment <compartment-name>
allow group <any-group> to manage data-catalog-metastore-assets in compartment <compartment-name>

Ces stratégies sont obligatoires, sauf si des stratégies généralisées sont définies pour les ressources de catalogue, de base de données ou de table. Pour plus d'informations, reportez-vous à Stratégies IAM requises pour le contrôle d'accès de niveau grossier.

Contrôle d'accès de niveau grossier dans le metastore Data Catalog

Le metastore Data Catalog fournit un contrôle d'accès de niveau grossier à l'aide du service Identity and Access Management pour éviter tout accès accidentel et toute modification des ressources créées par un autre utilisateur. En tant qu'administrateur, vous pouvez accorder l'accès à des ressources telles que des catalogues, des bases de données et des tables à l'aide de stratégies prédéfinies mentionnées dans la liste des ressources sur la page de détails du metastore. Pour plus d'informations sur l'affichage des ressources de metastore, reportez-vous à Affichage de la liste des ressources de metastore.
Remarque

Par défaut, le contrôle d'accès de niveau grossier est désactivé. Vous devez donc définir les stratégies requises pour accéder à toutes les ressources de metastore. Reportez-vous à Stratégies IAM requises. Après avoir défini ces stratégies, définissez le paramètre Spark.Conf sur true. Pour les solutions basées sur Hive ou HiveServer2, définissez oci.dcat.metastore.enable.cgac = true. Pour les solutions basées sur Spark ou Spark, définissez spark.hadoop.oci.dcat.metastore.enable.cgac = true.

Stratégies IAM requises pour le contrôle d'accès de niveau grossier

Utilisez les stratégies suivantes pour fournir l'accès aux ressources de niveau catalogue, base de données ou table :

Remarque

  • L'application de stratégies au niveau de la base de données ou de la table nécessite des droits d'accès permettant de gérer <hive-default>.
  • Lorsque des stratégies sont appliquées au niveau de la base de données ou de la table, les utilisateurs du groupe ne peuvent pas voir ni répertorier les bases de données et les tables créées par un autre utilisateur.

Autoriser l'accès aux ressources de niveau catalogue :

  • Utilisation de target.metastore.catalog.name
    allow group <any-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.catalog.name = '<metastore-catalog-name>'}
  • Utilisation de target.metastore.catalog.key
    allow group <any-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.catalog.key = '<metastore-catalog-key>'}
    Remarque

    Le nom, la clé et l'exemple d'instruction de stratégie sont disponibles sur la page du metastore, sous la section Ressources.
    Lorsque vous créez une stratégie pour un nouveau catalogue, vous devez également créer une stratégie pour la base de données par défaut créée dans le cadre de ce catalogue.
    allow group <any-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.catalog.name = '<metastore-catalog-name>'}
    allow group <any-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.database.name = <metastore-catalog-name.default>}

Autorisez <specific-group> à accéder aux ressources au niveau de la base de données ou de la table pour un catalogue spécifique, où l'utilisateur a accès aux ressources enfant de ce catalogue :

  • Utilisation de target.metastore.catalog.name
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.database.name = '<metastore-catalog-name.default>'}
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.catalog.name = '<metastore-catalog-name>'}
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.database.name = '*'}
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.table.name = '*'}
  • Utilisation de target.metastore.catalog.key
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.catalog.key = '<catalog-ID>'}
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.database.name = <metastore-catalog-name.default>}
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.database.key = '*'}
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.table.key = '*'}

Autorisez <specific-group> à accéder aux ressources de niveau base de données pour un catalogue spécifique en appliquant l'une des stratégies suivantes :

  • Utilisation de target.metastore.database.name
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.catalog.name = '<metastore-catalog-name>'}
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.database.name = '<catalog-name>.<database-name>'}
  • Utilisation de target.metastore.database.key
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.database.key = '<metastore-database-ID>'}

Autorisez <specific-group> à accéder aux ressources de niveau table pour une base de données spécifique en appliquant l'une des stratégies suivantes :

  • Utilisation de target.metastore.table.name
    allow group <any-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.catalog.name = '<metastore-catalog-name>'}
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.database.name = '<catalog-name>.<database-name>'}
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.table.name = '<catalog-name>.<database-name>.<table-name>'}
  • Utilisation de target.metastore.table.key
    allow group <specific-group> to manage data-catalog-metastore-assets in compartment <compartment-name> where all {target.metastore.id = '<metastore-id>', target.metastore.table.key = '<metastore-table-ID>'}