Datenkatalog-Metastore

Apache Hive ist ein Data Warehousing Framework, das Lese-, Schreib- oder Verwaltungsvorgänge für große Datasets in verteilten Systemen erleichtert.

Data Catalog Metastore bietet ein hochverfügbares und skalierbares zentrales Metadaten-Repository für ein Hive-Cluster. Dabei werden Metadaten für Datenstrukturen wie Datenbanken, Tabellen und Partitionen in einer relationalen Datenbank gespeichert, die von in Object Storage verwalteten Dateien gesichert werden. Apache Spark SQL verwendet hierfür Data Catalog Metastore.

Die OCI Data Flow-, OCI Big Data Service- und OCI Data Science-Serviceinstanzen greifen auf den Datenkatalog-Metastore zu, um Schemadefinitionen für die Objekte in unstrukturierten und halbstrukturierten Datenassets, wie Objektspeicher, sicher zu speichern und abzurufen.

Voraussetzungen

Bevor Sie einen Metastore in Data Catalog erstellen, müssen Sie zwei Buckets in Oracle Object Storage erstellen, die verwaltete und externe Tabellen enthalten.
  • Verwaltete Tabelle: Der Metastore verwaltet das Tabellenobjekt.
  • Externe Tabelle: Als Benutzer verwalten Sie das Tabellenobjekt.

Beim Erstellen des Metastores in Data Catalog geben Sie die URIs der Buckets an, in denen die verwalteten und externen Tabellen gespeichert sind. Das URI-Format muss lauten: oci://<bucket_name>@<namespace_name>/<folder name of your choice>.

Hinweis

Es wird empfohlen, nicht denselben Speicherort für verwaltete und externe Tabellen zu verwenden. Wenn sich beide Tabellenarten im selben Verzeichnis befinden, kann das Löschen von Daten aus verwalteten Tabellen auch zu Datenverlusten aus externen Tabellen führen.

Weitere Informationen finden Sie unter HDFS-Connector.

Erforderliche IAM-Policys

Sie müssen Policys hinzufügen, um dem Metastore Resource Principal Zugriff auf Speicherorte zu gewähren.

Als Voraussetzung erstellen Sie eine dynamische Gruppe, die den Metastore enthält. In den folgenden Policy-Anweisungen wird die OCID durch <dg-metastore-ocid> dargestellt:
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>'}
Hinweis

Um zuzulassen, dass Metastore Buckets pro Datenbank mit der Parametereinstellung spark.conf oci.dcat.metastore.create.bucket.per.db = true dynamisch erstellt, fügen Sie die folgenden Policys hinzu:
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>'}}

Nur eine Admin und die Benutzer in der Gruppe Administrators haben Zugriff auf alle Data Catalog-Metastore-Ressourcen. Als Admin können Sie die folgenden Policys verwenden, um Zugriff auf alle Metastore-Ressourcen zu erteilen.

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>

Diese Policys sind obligatorisch, es sei denn, grob granulierte Policys werden für Ressourcen auf Katalog-, Datenbank- oder Tabellenebene definiert. Weitere Informationen finden Sie unter Erforderliche IAM-Policys für grob granulierte Zugriffskontrolle.

Grob granulierte Zugriffskontrolle im Data Catalog-Metastore

Data Catalog Metastore bietet eine grob granulierte Zugriffskontrolle mit dem Identity and Access Management-Service, um versehentlichen Zugriff und Änderung von Ressourcen zu vermeiden, die von einem anderen Benutzer erstellt wurden. Als Administrator können Sie Zugriff auf Ressourcen wie Kataloge, Datenbanken und Tabellen mit vordefinierten Policys erteilen, die in der Ressourcenliste auf der Detailseite des Metastores aufgeführt sind. Weitere Informationen zum Anzeigen von Metastore-Ressourcen finden Sie unter Metastore-Ressourcenliste anzeigen.
Hinweis

Standardmäßig ist die grob granulierte Zugriffskontrolle deaktiviert, sodass Sie die erforderlichen Policys für den Zugriff auf alle Metastore-Ressourcen definieren müssen. Siehe Erforderliche IAM-Policys. Nachdem Sie diese Policys definiert haben, setzen Sie den Parameter Spark.Conf auf true. Legen Sie für Hive- oder HiveServer2-basierte Lösungen oci.dcat.metastore.enable.cgac = true fest. Legen Sie für Spark- oder Spark-basierte Lösungen spark.hadoop.oci.dcat.metastore.enable.cgac = true fest.

Erforderliche IAM-Policys für grob granulierte Zugriffskontrolle

Verwenden Sie die folgenden Policys, um Zugriff auf Ressourcen auf Katalog-, Datenbank- oder Tabellenebene zu erteilen:

Hinweis

  • Das Anwenden von Policys auf Datenbank- oder Tabellenebene erfordert die Berechtigung zum Verwalten von <hive-default>.
  • Wenn Policys auf Datenbank- oder Tabellenebene angewendet werden, können die Benutzer in der Gruppe die von einem anderen Benutzer erstellten Datenbanken und Tabellen nicht anzeigen oder auflisten.

Zugriff auf Ressourcen auf Katalogebene zulassen:

  • Verwenden von 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>'}
  • Verwenden von 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>'}
    Hinweis

    Name, Schlüssel und Beispiel-Policy-Anweisung sind auf der Metastore-Seite unter dem Abschnitt Ressourcen verfügbar.
    Wenn Sie eine Policy für einen neuen Katalog erstellen, müssen Sie auch eine Policy für die Standarddatenbank erstellen, die als Teil dieses Katalogs erstellt wurde.
    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>}

Lassen Sie zu, dass eine <specific-group> auf Ressourcen auf Datenbank- oder Tabellenebene für einen bestimmten Katalog zugreift, wenn der Benutzer Zugriff auf die untergeordneten Ressourcen dieses Katalogs hat:

  • Verwenden von 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 = '*'}
  • Verwenden von 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 = '*'}

Lassen Sie zu, dass eine <specific-group> auf Ressourcen auf Datenbankebene für einen bestimmten Katalog zugreifen kann, indem Sie eine der folgenden Policys anwenden:

  • Verwenden von 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>'}
  • Verwenden von 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>'}

Lassen Sie zu, dass eine <specific-group> auf Ressourcen auf Tabellenebene für eine bestimmte Datenbank zugreift, indem Sie eine der folgenden Policys anwenden:

  • Verwenden von 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>'}
  • Verwenden von 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>'}