Metastore do Serviço Data Catalog

O Apache Hive é uma estrutura de data warehousing que facilita as operações de leitura, gravação ou gerenciamento em grandes conjuntos de dados que residem em sistemas distribuídos.

O Metastore do serviço Data Catalog fornece um repositório central altamente disponível e escalável de metadados para um cluster do Hive. Ele armazena metadados para estruturas de dados, como bancos de dados, tabelas e partições em um banco de dados relacional, com o apoio de arquivos mantidos no Object Storage. O Apache Spark SQL usa o Metastore do serviço Data Catalog para essa finalidade.

As instâncias do serviço OCI Data Flow, OCI Big Data Service e OCI Data Science acessam o Metastore do Data Catalog para armazenar e recuperar com segurança definições de esquema para os objetos em ativos de dados não estruturados e semiestruturados, como o Object Storage.

Pré-requisitos

Antes de criar um metastore no serviço Data Catalog, você deve criar dois buckets no Oracle Object Storage para incluir as tabelas Gerenciadas e Externas.
  • Tabela Gerenciada: O Metastore gerencia o objeto de tabela.
  • Tabela Externa: Como usuário, você gerencia o objeto da tabela.

Ao criar o metastore no serviço Data Catalog, você fornece os URIs dos buckets nos quais as tabelas gerenciadas e externas residem. O formato do URI deve ser oci://<bucket_name>@<namespace_name>/<folder name of your choice>.

Observação

Recomendamos que você não use o mesmo local para tabelas gerenciadas e externas. Se os dois tipos de tabelas estiverem no mesmo diretório, a exclusão de dados das tabelas gerenciadas também poderá resultar na perda de dados das tabelas externas.

Para obter mais informações, consulte conector HDFS.

Políticas Obrigatórias do Serviço IAM

Você deve adicionar políticas para permitir o acesso do Controlador de Recursos do Metastore aos locais de armazenamento.

Como pré-requisito, crie um grupo dinâmico que inclua o metastore. Nas seguintes instruções de política, seu OCID é representado por <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>'}
Observação

Para permitir que o Metastore crie buckets dinamicamente por banco de dados usando a definição de parâmetro spark.conf oci.dcat.metastore.create.bucket.per.db = true, adicione as seguintes políticas:
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>'}}

Somente um Admin e os usuários do grupo Administrators têm acesso a todos os recursos de metastore do serviço Data Catalog. Como um Admin, você pode usar as políticas a seguir para fornecer acesso a todos os recursos do 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>

Essas políticas são obrigatórias, a menos que políticas detalhadas sejam definidas para recursos de catálogo, banco de dados ou nível de tabela. Para obter mais informações, consulte Políticas Obrigatórias do Serviço IAM para Controle de Acesso Grosso.

Controle de Acesso Grosso no Metastore do Serviço Data Catalog

O Metastore do serviço Data Catalog fornece controle de acesso detalhado usando o serviço Identity and Access Management para evitar acesso acidental e modificação de recursos criados por outro usuário. Como administrador, você pode conceder acesso a recursos como catálogos, bancos de dados e tabelas usando políticas predefinidas mencionadas na Lista de Recursos na página de detalhes do metastore. Para obter mais informações sobre como exibir recursos do metastore, consulte Exibindo a Lista de Recursos do Metastore.
Observação

Por padrão, o controle de acesso detalhado é desativado; portanto, você deve definir as políticas necessárias para acessar todos os recursos do metastore. Consulte Políticas Obrigatórias do Serviço IAM. Após definir essas políticas, defina o parâmetro Spark.Conf como true. Para soluções baseadas em Hive ou HiveServer2, defina oci.dcat.metastore.enable.cgac = true. Para soluções baseadas em Spark ou Spark, defina spark.hadoop.oci.dcat.metastore.enable.cgac = true.

Políticas Obrigatórias do IAM para Controle de Acesso Grosso

Use as seguintes políticas para fornecer acesso a recursos de catálogo, banco de dados ou nível de tabela:

Observação

  • A aplicação de políticas no nível do banco de dados ou da tabela requer permissão para gerenciar <hive-default>.
  • Quando as políticas são aplicadas no nível do banco de dados ou da tabela, os usuários do grupo não podem ver ou listar os bancos de dados e as tabelas criados por outro usuário.

Permitir acesso a recursos de nível de catálogo:

  • Usando 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>'}
  • Usando 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>'}
    Observação

    O nome, a chave e a declaração de política de amostra estão disponíveis na página do metastore na seção Recursos.
    Ao criar uma política para um novo catálogo, você também deve criar uma política para o banco de dados padrão criado como parte desse catálogo.
    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>}

Permita que um <specific-group> acesse recursos no nível do banco de dados ou da tabela para um catálogo específico, em que o usuário tenha acesso aos recursos filhos desse catálogo:

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

Permita que um <specific-group> acesse recursos no nível do banco de dados para um catálogo específico aplicando uma das seguintes políticas:

  • Usando 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>'}
  • Usando 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>'}

Permita que um <specific-group> acesse recursos no nível da tabela para um banco de dados específico aplicando uma das seguintes políticas:

  • Usando 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>'}
  • Usando 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>'}