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:
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.
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.
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.
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 arquivosnowflake-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 propriedadesnowflake.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
emydb3
contenham todos uma tabela chamadatable1
. Você pode omitir todos os bancos de dados com a convenção de nomenclaturamydb<número>
, exceto ` ``mydb1`, adicionando a expressão regularmydb[^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>
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>
Salve as mudanças no arquivo.
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>
- 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:
Clique na guia Hive no menu do lado esquerdo » Configs » Advanced.
Vá até a guia Custom Hive Site.
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>
.Salve as mudanças no arquivo.
Reinicie o serviço de metastore do Hive.
Etapa 2: validar a instalação¶
No Hive, crie uma tabela nova.
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>;
Em que
database
eschema
são o banco de dados e o esquema que você especificou no arquivosnowflake-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];
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>;
- Tabela do Hive não particionada:
Execute o seguinte comando:
ALTER TABLE <table_name> TOUCH;
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 pors3://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';
- 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.