Integração de metastores do Apache Hive com o Snowflake

Este tópico fornece instruções para usar o conector do metastore do Hive para Snowflake para integrar metastores do Apache Hive com o Snowflake usando tabelas externas. O conector detecta eventos de metastore e os transmite ao Snowflake para manter as tabelas externas sincronizadas com o metastore do Hive. Isto permite aos usuários gerenciar seu esquema no Hive enquanto o consultam a partir do Snowflake.

O metastore do Apache Hive deve ser integrado com o armazenamento em nuvem em uma das seguintes plataformas de nuvem:

  • Amazon Web Services

  • Google Cloud Platform

  • Microsoft Azure

Neste tópico:

Instalação e configuração do conector do metastore do Hive

Esta seção fornece instruções detalhadas para instalar e configurar o conector do metastore do Hive para o Snowflake.

Pré-requisitos

O conector do Hive para o Snowflake tem os seguintes pré-requisitos:

Banco de dados e esquemas do Snowflake

Armazene as tabelas externas que são mapeadas para tabelas do Hive no metastore.

Usuário designado do Snowflake

O conector é configurado para executar operações nas tabelas externas como este usuário.

Integração de armazenamento

As integrações de armazenamento permitem configurar o acesso seguro ao armazenamento externo em nuvem sem passar credenciais explícitas do provedor de nuvem, tais como chaves secretas ou tokens de acesso. Crie uma integração de armazenamento para acessar locais de armazenamento em nuvem referenciados nas tabelas do Hive usando CREATE STORAGE INTEGRATION.

O parâmetro STORAGE_ALLOWED_LOCATIONS para a integração de armazenamento deve listar os mesmos contêineres de armazenamento que os referenciados no parâmetro Location das tabelas do Hive em seu metastore.

Função

A função deve ser atribuída ao usuário designado do Snowflake e incluir os seguintes privilégios de objeto para os outros objetos do Snowflake identificados nesta seção:

Objeto

Privilégios

Banco de dados

USAGE

Esquema

USAGE , CREATE STAGE , CREATE EXTERNAL TABLE

Integração de armazenamento

USAGE

Etapa 1: Instalar o conector

Complete as seguintes etapas para instalar o conector:

  1. Baixe o arquivo JAR do conector e o arquivo XML de configuração do Repositório central Maven:

    Sonatype (ou https://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/)

  2. Copie o arquivo JAR para o seguinte diretório:

    Amazon S3 ou Google Cloud Storage

    Diretório lib no classpath do Hive. A localização pode variar dependendo da instalação do Hive. Para determinar o classpath, verifique a variável de ambiente HIVE_AUX_JARS_PATH.

    Microsoft Azure HDInsight

    Diretório hive no diretório do usuário; por exemplo, /usr/hdp/<hdinsight_version>/atlas/hook/hive/. A localização pode variar dependendo da versão do Azure HDInsight e das opções de instalação.

    Nota

    Um script personalizado de exemplo está disponível na pasta scripts na página do projeto no GitHub. O script adiciona o arquivo JAR e os arquivos de configuração aos diretórios corretos.

  3. Crie um arquivo chamado snowflake-config.xml no diretório a seguir:

    Amazon S3 ou Google Cloud Storage

    Diretório conf no classpath do Hive.

    Microsoft Azure HDInsight

    Diretório conf/conf.server no classpath do Hive.

  4. Abra o arquivo snowflake-config.xml em um editor de texto e preencha-o com as seguintes propriedades <name> e valores <correspondentes>:

    snowflake.jdbc.username

    Especifica o nome de login do usuário do Snowflake designado para operações de atualização nas tabelas externas.

    snowflake.jdbc.password

    Especifica a senha para o nome de login.

    Nota

    • Você pode definir um espaço reservado para a senha com base em uma propriedade do sistema ou variável de ambiente, dependendo de sua versão do Hadoop. A configuração se comporta como outras configurações do Hadoop. Para obter mais informações, consulte a documentação do Hadoop.

    • snowflake.jdbc.privateKey

    Alternativamente, autentique usando a autenticação de par de chaves. Para instruções sobre como gerar o par de chaves e atribuir a chave pública a um usuário, consulte Autenticação de pares de chaves e rotação de pares de chaves.

    Para passar a chave privada para o Snowflake, adicione a propriedade snowflake.jdbc.privateKey ao arquivo snowflake-config.xml. Abra o arquivo de chave privada (por exemplo, rsa_key.p8) em um editor de texto. Copie as linhas entre -----BEGIN RSA PRIVATE KEY----- e -----END RSA PRIVATE KEY----- como o valor da propriedade ou da variável de ambiente.

    snowflake.jdbc.account

    Especifica o nome de sua conta (fornecido pelo Snowflake), por exemplo xy12345.

    snowflake.jdbc.db

    Especifica um banco de dados Snowflake existente a ser utilizado para a integração do metastore do Hive. Consulte a seção Pré-requisitos (neste tópico) para mais informações.

    snowflake.jdbc.schema

    Especifica um esquema do Snowflake existente no banco de dados especificado. Consulte a seção Pré-requisitos (neste tópico) para mais informações.

    Para mapear múltiplos esquemas em sua metastore do Hive para esquemas correspondentes em seu banco de dados Snowflake, defina a propriedade snowflake.hive-metastore-listener.schemas além da propriedade atual. Especifique o esquema padrão do Snowflake na propriedade snowflake.jdbc.schema.

    snowflake.jdbc.role

    Especifica a função de controle de acesso a ser usada pelo conector do Hive. A função deve ser uma função existente que já tenha sido atribuída ao usuário especificado.

    Se nenhuma função for especificada aqui, então o conector do Hive usa a função padrão para o usuário especificado.

    snowflake.jdbc.connection

    Especifica a cadeia de conexão para sua conta Snowflake no seguinte formato:

    jdbc:snowflake://<account_identifier>.snowflakecomputing.com

    Onde:

    <account_identifier>

    Identificador único de sua conta Snowflake.

    O formato preferido do identificador de conta é o seguinte:

    organization_name-account_name

    Nomes de sua conta e organização no Snowflake. Para obter mais detalhes, consulte Formato 1 (preferido): Nome da conta em sua organização.

    Alternativamente, especifique seu localizador de conta junto com a região geográfica e possivelmente a plataforma de nuvem, onde a conta é hospedada. Para obter mais detalhes, consulte Formato 2 (legado): Localizador de conta em uma região.

    snowflake.hive-metastore-connector.integration

    Especifica o nome do objeto de integração de armazenamento a ser utilizado para acesso seguro aos locais de armazenamento externo referenciados nas tabelas do Hive no metastore. Consulte a seção Pré-requisitos (neste tópico) para mais informações.

    snowflake.hive-metastore-listener.schemas

    Especifica uma lista separada por vírgulas dos esquemas do Snowflake que existem no banco de dados Snowflake especificado em snowflake.jdbc.db.

    Quando uma tabela é criada no metastore do Hive, o conector verifica se esta propriedade lista um esquema do Snowflake com o mesmo nome que o esquema/banco de dados do Hive que contém a nova tabela:

    • Se um esquema do Snowflake com o mesmo nome for listado, o conector cria uma tabela externa neste esquema.

    • Se um esquema do Snowflake com o mesmo nome não for listado, o conector cria uma tabela externa no esquema padrão, que é definido na propriedade snowflake.jdbc.schema.

    A tabela externa tem o mesmo nome que a nova tabela do Hive.

    Nota

    Requer a versão 0.5.0 (ou superior) do Conector do Hive.

    Opcionalmente, adicione a seguinte propriedade:

    snowflake.hive-metastore-listener.database-filter-regex

    Especifica os nomes de quaisquer bancos de dados no metastore do Hive a ignorar com a integração. A utilização desta propriedade permite controlar quais bancos de dados se integram com o Snowflake. Esta opção é especialmente útil quando várias tabelas têm o mesmo nome em todos os bancos de dados do Hive. Atualmente, nesta situação, o conector do Hive cria a primeira tabela com o nome no banco de dados de destino do Snowflake, mas ignora tabelas adicionais com o mesmo nome.

    Por exemplo, suponha que os bancos de dados mydb1, mydb2 e mydb3 contenham todos uma tabela chamada table1. Você pode omitir todos os bancos de dados com a convenção de nomenclatura mydb<number> exceto para mydb1, adicionando a expressão regular mydb[^1] como o valor da propriedade.

    Nó de propriedade de exemplo

    <configuration>
      ..
      <property>
        <name>snowflake.hive-metastore-listener.database-filter-regex</name>
        <value>mydb[^1]</value>
      </property>
    </configuration>
    
    Copy

    Arquivo snowflake-config.xml de exemplo

    <configuration>
      <property>
        <name>snowflake.jdbc.username</name>
        <value>jsmith</value>
      </property>
      <property>
        <name>snowflake.jdbc.password</name>
        <value>mySecurePassword</value>
      </property>
      <property>
        <name>snowflake.jdbc.role</name>
        <value>custom_role1</value>
      </property>
      <property>
        <name>snowflake.jdbc.account</name>
        <value>myaccount</value>
      </property>
      <property>
        <name>snowflake.jdbc.db</name>
        <value>mydb</value>
      </property>
      <property>
        <name>snowflake.jdbc.schema</name>
        <value>myschema</value>
      </property>
      <property>
        <name>snowflake.jdbc.connection</name>
        <value>jdbc:snowflake://myaccount.snowflakecomputing.com</value>
      </property>
      <property>
        <name>snowflake.hive-metastore-listener.integration</name>
        <value>s3_int</value>
      </property>
      <property>
        <name>snowflake.hive-metastore-listener.schemas</name>
        <value>myschema1,myschema2</value>
      </property>
    </configuration>
    
    Copy
  5. Salve as mudanças no arquivo.

  6. Edite o arquivo de configuração do Hive existente (hive-site.xml):

    Amazon S3 ou Google Cloud Storage

    Abra o arquivo hive-site.xml em um editor de texto. Adicione o conector ao arquivo de configuração como segue:

    <configuration>
     ...
     <property>
      <name>hive.metastore.event.listeners</name>
      <value>net.snowflake.hivemetastoreconnector.SnowflakeHiveListener</value>
     </property>
    </configuration>
    
    Copy
    Microsoft Azure HDInsight

    Complete as etapas na documentação do Azure HDInsight para editar o arquivo hive-site.xml. Adicione a seguinte propriedade personalizada à configuração do cluster:

    hive.metastore.event.listeners=net.snowflake.hivemetastoreconnector.SnowflakeHiveListener

    Alternativamente, adicione a propriedade personalizada no HDInsight Cluster Management Portal:

    1. Clique na guia Hive no menu do lado esquerdo » Configs » Advanced.

    2. Vá até a guia Custom Hive Site.

    3. Adicione a propriedade personalizada.

    Nota

    Se houver outros conectores já configurados neste arquivo, adicione o conector do Hive para Snowflake em uma lista separada por vírgulas no nó <value>.

  7. Salve as mudanças no arquivo.

  8. Reinicie o serviço de metastore do Hive.

Etapa 2: Validar a instalação

  1. Crie uma nova tabela no Hive.

  2. Consulte a lista de tabelas externas em seu banco de dados e esquema do Snowflake usando SHOW EXTERNAL TABLES:

    SHOW EXTERNAL TABLES IN <database>.<schema>;
    
    Copy

    Onde database e schema são o banco de dados e o esquema que você especificou no arquivo snowflake-config.xml em Etapa 1: Instalar o conector (neste tópico).

    Os resultados devem mostrar uma tabela externa com o mesmo nome que a nova tabela do Hive.

Os registros do conector são gravados nos logs do metastore do Hive. As consultas executadas pelo conector podem ser visualizadas na saída da exibição/função QUERY_HISTORY do Snowflake de forma semelhante a outras consultas.

Integração de tabelas e partições existentes do Hive com o Snowflake

Para integrar as tabelas e partições existentes no Hive com o Snowflake, execute o seguinte comando no Hive para cada tabela e partição:

ALTER TABLE <table_name> TOUCH [PARTITION partition_spec];
Copy

Para obter mais informações, consulte a documentação do Hive.

Alternativamente, o Snowflake fornece um script para sincronizar as tabelas e partições existentes do Hive. Para obter mais informações, consulte a página do projeto no GitHub

Nota

Se já existe uma tabela externa com o mesmo nome da tabela de Hive no esquema Snowflake correspondente no banco de dados especificado na propriedade snowflake.jdbc.db, o comando ALTER TABLE … TOUCH não recria a tabela externa. Se você precisar recriar a tabela externa, descarte a tabela externa (usando DROP EXTERNAL TABLE) antes de executar o comando ALTER TABLE … TOUCH na metástore de Hive.

Recursos

Operações com suporte do Hive e tipos de tabelas

Operações do Hive

O conector suporta as seguintes operações do Hive:

  • Criar tabela

  • Descartar tabela

  • Alterar tabela adicionar coluna

  • Alterar tabela descartar coluna

  • Alterar (ou seja tocar) tabela

  • Adicionar partição

  • Descartar partição

  • Alterar (tocar) partição

Tipos de tabela do Hive

O conector suporta os seguintes tipos de tabelas do Hive:

  • Tabelas externas e gerenciadas

  • Tabelas particionadas e não particionadas

Tipos de dados do Hive e do Snowflake

A tabela a seguir mostra o mapeamento entre os tipos de dados do Hive e do Snowflake:

Hive

Snowflake

BIGINT

BIGINT

BINARY

BINARY

BOOLEAN

BOOLEAN

CHAR

CHAR

DATE

DATE

DECIMAL

DECIMAL

DOUBLE

DOUBLE

DOUBLE PRECISION

DOUBLE

FLOAT

FLOAT

INT

INT

INTEGER

INT

NUMERIC

DECIMAL

SMALLINT

SMALLINT

STRING

STRING

TIMESTAMP

TIMESTAMP

TINYINT

SMALLINT

VARCHAR

VARCHAR

Todos os outros tipos de dados

VARIANT

Formatos de arquivo e opções com suporte

Os seguintes formatos de arquivo de dados e opções de formato de arquivo do Hive têm suporte:

  • CSV

    As seguintes opções têm suporte usando as propriedades SerDe (Serializer/Deserializer):

    • field.delim / separatorChar

    • line.delim

    • escape.delim / escapeChar

  • JSON

  • AVRO

  • ORC

  • PARQUET

    As seguintes opções têm suporte utilizando as propriedades de tabela:

    • parquet.compression.

Comandos, recursos e casos de uso do Hive sem suporte

O conector não suporta os seguintes comandos, recursos e casos de uso do Hive:

  • Exibições do Hive

  • Instruções ALTER além de TOUCH, ADD COLUMNS e DROP COLUMNS

  • Propriedades personalizadas SerDe.

  • Modificar uma tabela do Hive gerenciada existente para se tornar uma tabela do Hive externa, ou vice-versa

Atualização de metadados de tabela externa para refletir eventos do armazenamento em nuvem

Quando qualquer uma das operações do Hive listadas em Operações com suporte do Hive e tipos de tabelas (neste tópico) é executada em uma tabela, o conector do Hive escuta os eventos do Hive e, posteriormente, atualiza os metadados para a tabela externa correspondente no Snowflake.

Entretanto, o conector não atualiza os metadados de tabela externa com base em eventos no armazenamento em nuvem, tais como adicionar ou remover arquivos de dados. Para atualizar os metadados de uma tabela externa para refletir eventos no armazenamento em nuvem, execute o respectivo comando ALTER TABLE … TOUCH para sua tabela particionada ou não do Hive. TOUCH lê os metadados e os grava de volta. Para obter mais informações sobre o comando, consulte a documentação do Hive:

Tabela do Hive particionada

Execute o seguinte comando:

ALTER TABLE <table_name> TOUCH PARTITION <partition_spec>;
Copy
Tabela do Hive não particionada

Execute o seguinte comando:

ALTER TABLE <table_name> TOUCH;
Copy

Diferenças entre tabelas do Hive e tabelas externas do Snowflake

Esta seção descreve as principais diferenças entre as tabelas do Hive e as tabelas externas do Snowflake.

Partições
  • As partições no Snowflake são compostas por subcaminhos do local de armazenamento referenciado pela tabela, enquanto as partições do Hive não têm esta restrição. Se forem acrescentadas partições nas tabelas do Hive que não sejam subcaminhos do local de armazenamento, essas partições não serão acrescentadas às tabelas externas correspondentes no Snowflake.

    Por exemplo, se o local de armazenamento associado à tabela do Hive (e a tabela externa correspondente do Snowflake) for s3://path/, então todos os locais de partição na tabela do Hive também devem ser prefixados por s3://path/.

  • Duas partições do Snowflake em uma única tabela externa não podem apontar exatamente para o mesmo local de armazenamento. Por exemplo, as seguintes partições entram em conflito entre si:

    ALTER EXTERNAL TABLE exttable ADD PARTITION(partcol='1') LOCATION 's3:///files/2019/05/12';
    
    ALTER EXTERNAL TABLE exttable ADD PARTITION(partcol='2') LOCATION 's3:///files/2019/05/12';
    
    Copy
Nomes de coluna

Os nomes de coluna do Hive não diferenciam maiúsculas e minúsculas, mas as colunas virtuais do Snowflake derivadas de VALUES o fazem. Se as tabelas do Hive contiverem colunas com nomes tanto em maiúsculas como em minúsculas, os dados nessas colunas podem ser NULL nas colunas correspondentes das tabelas externas do Snowflake.