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:
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/)
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.
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.
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 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 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 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á 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
emydb3
contenham todos uma tabela chamadatable1
. Você pode omitir todos os bancos de dados com a convenção de nomenclaturamydb<number>
exceto paramydb1
, adicionando a expressão regularmydb[^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>
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>
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¶
Crie uma nova tabela no Hive.
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>;
Onde
database
eschema
são o banco de dados e o esquema que você especificou no arquivosnowflake-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];
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>;
- 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¶
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 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 tanto em maiúsculas como em minúsculas, os dados nessas colunas podem ser NULL nas colunas correspondentes das tabelas externas do Snowflake.