Integrar metastores do Apache Hive com o Snowflake

Você pode usar o conector do metastore do Hive para o Snowflake para integrar os metastores do Apache Hive com o Snowflake usando tabelas externas. O conector detecta eventos de metastores e os transmite para o Snowflake para manter as tabelas externas sincronizadas com o metastore do Hive. Com esse recurso, os usuários podem gerenciar os esquemas no Hive enquanto consultam o metastores 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

  • Microsoft Azure

Neste tópico:

Instalar e configurar o conector do metastore do Hive

Esta seção descreve como 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:

Com as integrações de armazenamento, você pode configurar o acesso seguro ao armazenamento em nuvem externo sem passar credenciais explícitas do provedor de nuvem, 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. No Repositório Central do Maven (`Sonatype<https://central.sonatype.com/search?q=g%3Anet.snowflake%20snowflake-hive-metastore-connector>`_ ou https://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/), baixe o arquivo JAR do conector e o arquivo XML de configuração.

  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/. O local pode variar dependendo da versão do Azure HDInsight e das opções de instalação.

    Dica

    Um exemplo de script personalizado está disponível na pasta scripts na página do projeto do GitHub para o Hive. 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 seguinte diretório:

    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. Em um editor de texto, abra o arquivo snowflake-config.xml e preencha-o com as seguintes propriedades <name> e os <values> 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, use a autenticação de par de chaves. Para obter 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 da 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. Para obter mais informações, consulte a seção Pré-requisitos anteriormente neste tópico.

    snowflake.jdbc.schema

    Especifica um esquema do Snowflake existente no banco de dados especificado. Para obter mais informações, consulte a seção Pré-requisitos anteriormente neste tópico.

    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á foi 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 exemplo a seguir mostra o formato preferencial do identificador da conta:

    organization_name-account_name

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

    Como alternativa, especifique o localizador da sua conta e a região geográfica e, possivelmente, a plataforma de nuvem onde a conta está hospedada. Para obter mais informações, consulte Formato 2: 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. Para obter mais informações, consulte a seção Pré-requisitos anteriormente neste tópico.

    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 essa propriedade lista um esquema do Snowflake com o mesmo nome do banco de dados ou esquema do Hive que contém a tabela nova:

    • 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

    Essa propriedade requer a versão 0.5.0 (ou superior) do conector do Hive.

    (Opcional) 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. Com esta propriedade, você pode controlar quais bancos de dados integrar 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<número> , exceto ` ``mydb1`, adicionando a expressão regular mydb[^1] como o valor da propriedade.

    Exemplo de nó de propriedade

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

    Exemplo de arquivo snowflake-config.xml

    <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. No Hive, crie uma tabela nova.

  2. No seu banco de dados e esquema do Snowflake, consulte a lista de tabelas externas usando SHOW EXTERNAL TABLES:

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

    Em que database e schema são o banco de dados e o esquema que você especificou no arquivo snowflake-config.xml na Etapa 1: Instalar o conector anteriormente 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. Você pode visualizar as consultas executadas pelo conector na saída da função/exibição QUERY_HISTORY do Snowflake, da mesma forma que outras consultas.

Integrar tabelas e partições existentes do Hive com o Snowflake

Para integrar tabelas e partições existentes do 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 informações, consulte a página do projeto no GitHub.

Importante

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, remova-a (usando DROP EXTERNAL TABLE) antes de executar o comando ALTER TABLE … TOUCH no metastore do Hive.

Recursos com e sem suporte

As seções a seguir listam os recursos com e sem suporte da integração dos metastore do Apache Hive com o conector do metastore do Hive para o Snowflake.

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

  • Altere (ou seja, toque) a 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

Atualizar metadados de tabela externa para refletir eventos do Cloud Storage

Quando qualquer uma das operações do Hive listadas em Operações e tipos de tabela do Hive com suporte anteriormente neste tópico é executada em uma tabela, o conector do Hive escuta os eventos do Hive e atualiza os metadados de 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 comando ALTER TABLE … TOUCH correspondente para sua tabela do Hive particionada ou não particionada. 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

A lista a seguir descreve as principais diferenças entre tabelas do Hive e tabelas externas do Snowflake:

Partições:
  • As partições do Snowflake são compostas por subcaminhos do local de armazenamento referenciado pela tabela, enquanto as partições do Hive não têm essa restrição. Se partições forem adicionadas em tabelas do Hive que não sejam subcaminhos do local de armazenamento, essas partições não serão adicionadas à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 que misturam maiúsculas e minúsculas, os dados nessas colunas poderão estar NULL nas colunas correspondentes nas tabelas externas do Snowflake.