A partir da versão V2.2, o Hologres suporta o Hive Metastore (HMS) como source de metadados para data lakes construídos no Object Storage Service (oss). Se o seu data lake for executado em um cluster E-MapReduce (EMR) com oss ou OSS-HDFS como camada de armazenamento, conecte o Hologres ao HMS para consultar dados do oss diretamente via SQL, sem necessidade de migrar ou copiar dados.
Pré-requisitos
Antes de começar, verifique se você possui:
O service oss ativado. Consulte Console quick start.
-
Um data lake cluster do EMR com dados de teste carregados. Consulte 在EMR Hive或Spark中访问OSS-HDFS e Create a cluster. O cluster deve atender a todas as condições abaixo:
Hive versão 3.1.3 ou posterior
Autenticação Kerberos desativada
Metadata definido como Self-managed RDS ou Built-in MySQL
-
Uma instância do Hologres com aceleração de data lake ativada e um banco de dados criado. Consulte Purchase a Hologres instance e Create a database.
Para ativar a aceleração de data lake, acesse o console do Hologres. Na coluna Actions da instância desejada, clique em Lake Acceleration e confirme.
-
Uma conexão de rede entre o Hologres e o cluster EMR. Como o Hologres é implantado em uma rede clássica e o EMR opera em uma Virtual Private Cloud (VPC), é necessário um endpoint reverso para que os dois services se comuniquem. Envie uma solicitação de conexão de rede. A equipe de suporte do Hologres orientará você nas etapas a seguir:
Faça login no console da VPC e crie um endpoint reverso. Consulte Access Alibaba Cloud services.
-
No parâmetro Type, selecione Other Endpoint Services e insira o nome do service de endpoint correspondente à região onde seu cluster EMR está localizado:
Região
Nome do service de endpoint
China (Beijing)
com.aliyuncs.privatelink.cn-beijing.epsrv-2zeokrydzjd6kx3cbwmbChina (Shanghai)
com.aliyuncs.privatelink.cn-shanghai.epsrv-uf61fvlfwta7f7dv9n3xChina (Zhangjiakou)
com.aliyuncs.privatelink.cn-zhangjiakou.epsrv-8vbno4k4wwvys0eg2swp
Caso sua região não esteja listada, a equipe do Hologres criará um service de endpoint e fornecerá o nome após o envio da solicitação. A conexão utiliza um endereço ip. Se o endereço ip do cluster EMR mudar, reconfigure a conexão.
Limitações
Instâncias secundárias do Hologres somente leitura não suportam aceleração de data lake.
Os comandos
UPDATE,DELETEeTRUNCATEnão são suportados em tabelas externas.O recurso Auto Load (mapeamento em lote de tabelas externas a partir do HMS) não é suportado.
Clusters EMR com autenticação Kerberos ativada não são suportados.
Conecte o Hologres ao HMS
O Hologres oferece duas formas de conexão com o HMS. Escolha uma delas com base na versão da sua instância e no nível de controle necessário sobre o mapeamento de colunas.
Método 1: banco de dados externo (recomendado). Requer Hologres V3.0 ou posterior. Um banco de dados externo mapeia todos os bancos de dados e tabelas do HMS para um banco de dados externo, schema e tabela externa no Hologres simultaneamente. Isso permite consultar dados com um nome composto por três partes, em vez de criar uma tabela externa por vez.
Método 2: hive_fdw. Utilize esta opção no Hologres V2.2 ou posterior, mas anterior à V3.0, ou quando for necessário mapear apenas um subconjunto de colunas ou renomear tabelas.
Método 1: Use um banco de dados externo (recomendado)
-
Conecte-se à sua instância do Hologres e crie o banco de dados externo. Esta etapa requer permissões de superusuário.
Para a sintaxe completa, consulte CREATE EXTERNAL DATABASE.
CREATE EXTERNAL DATABASE <EXTERNAL_DATABASE_NAME> owner '<ACCOUNT_NAME>' metastore_type 'hms' catalog_type 'hive' hive_metastore_uris 'thrift://<HIVE_METASTORE_IP>:<PORT>' metadata_cache_ttl_sec '600' metadata_cache_update_interval_sec '60' metadata_refresh_interval_sec '7200' oss_endpoint 'oss-<REGION_ID>-internal.aliyuncs.com' table_count_limitation_per_schema '2000' comment '<EXTERNAL_DATABASE_COMMENT>';Parâmetro
Descrição
Exemplo
external_database_nameNome do banco de dados externo.
catalog_hiveownerConta do Hologres proprietária do banco de dados externo.
p4_<ACCOUNT_ID>metastore_typeTipo de service de metadados. Defina como hms para Hive Metastore.
hmscatalog_typeTipo de catálogo. Defina como hive para um catálogo Hive.
hivehive_metastore_urisURI do Hive Metastore. Formato: thrift://<HIVE_METASTORE_IP>:<PORT>. A porta padrão é 9083.
thrift://10.0.0.1:9083metadata_cache_ttl_secOpcional. Tempo de validade dos metadados em cache, em segundos.
600 (default)metadata_cache_update_interval_secOpcional. Intervalo entre atualizações do cache de metadados, em segundos.
60 (default)metadata_refresh_interval_secOpcional. Intervalo entre atualizações completas de metadados, em segundos.
7200 (default)oss_endpointEndpoint do oss. Para oss nativo, utilize o endpoint interno para melhor desempenho.
oss-cn-beijing-internal.aliyuncs.comtable_count_limitation_per_schemaOpcional. Número máximo de tabelas carregadas por schema.
2000 (default)commentOpcional. Descrição do banco de dados externo.
holo-emr-hiveOs intervalos de cache e o limite de tabelas acima são valores de exemplo. Ajuste-os conforme a frequência de atualização dos seus metadados e a quantidade de tabelas no HMS.
-
(Opcional) Crie um mapeamento de usuário.
Um mapeamento de usuário fornece as credenciais que uma determinada conta do Hologres utiliza para ler dados do oss. Para mais detalhes, consulte CREATE USER MAPPING.
CREATE USER MAPPING FOR <ACCOUNT_NAME> EXTERNAL DATABASE <EXTERNAL_DATABASE_NAME> OPTIONS ( oss_access_id '<ACCESS_KEY_ID>', oss_access_key '<ACCESS_KEY_SECRET>' ); -
Consulte as tabelas externas.
Após a criação do banco de dados externo, referencie qualquer tabela usando um nome composto por três partes: banco de dados externo, banco de dados Hive e tabela Hive.
Tabela não particionada:
SELECT * FROM <EXTERNAL_DATABASE_NAME>.<HIVE_DATABASE_NAME>.<HIVE_TABLE_NAME>;Tabela particionada: filtre pela chave de partição na cláusula WHERE.
SELECT * FROM <EXTERNAL_DATABASE_NAME>.<HIVE_DATABASE_NAME>.<HIVE_PARTITION_TABLE_NAME> WHERE <PARTITION_KEY> = '<PARTITION_VALUE>';
Método 2: Use hive_fdw
Etapa 1: Crie a extensão
Execute o comando SQL a seguir para instalar o foreign data wrapper (FDW) hive_fdw. Esta operação exige permissões de superusuário e precisa ser executada apenas uma vez por banco de dados.
CREATE EXTENSION IF NOT EXISTS hive_fdw;
Etapa 2: Crie um servidor externo
Crie um servidor externo que aponte para sua instância do HMS e para o armazenamento no oss.
Antes de executar o comando, reúna os seguintes valores:
Endereço ip do HMS: No console do E-MapReduce, clique em Node Management referente ao seu cluster. Na aba Node Management, localize o Internal IP do nó mestre.
Endpoint do oss: No console do oss, abra a página de visão geral do bucket e verifique a área Access Ports.
CREATE SERVER IF NOT EXISTS <SERVER_NAME> FOREIGN DATA WRAPPER hive_fdw
OPTIONS (
hive_metastore_uris 'thrift://<HIVE_METASTORE_IP>:<PORT>',
oss_endpoint '<OSS_ENDPOINT>'
);
|
Parâmetro |
Obrigatório |
Descrição |
Exemplo |
|
|
Sim |
Nome personalizado para o servidor externo. |
|
|
|
Sim |
URI do Hive Metastore. Formato: |
|
|
|
Sim |
Endpoint do oss. Para oss nativo, use o endpoint interno para obter melhor desempenho. Para OSS-HDFS, apenas o endpoint interno é suportado. |
Veja os exemplos abaixo |
Para oss_endpoint, escolha a opção adequada ao seu tipo de armazenamento:
-
oss Nativo: Utilize o endpoint interno.
oss-cn-shanghai-internal.aliyuncs.com -
OSS-HDFS: Apenas o acesso via rede interna é suportado.
<BUCKET_NAME>.cn-beijing.oss-dls.aliyuncs.com
Etapa 3: (Opcional) Crie um mapeamento de usuário
O mapeamento de usuário controla quais contas do Hologres podem acessar dados externos por meio de um servidor externo. Por exemplo, o proprietário de um servidor externo pode conceder a um usuário do Resource Access Management (ram) acesso aos dados no oss.
Para detalhes sobre a sintaxe do CREATE USER MAPPING, consulte a documentação do PostgreSQL.
-- Grant the current user access to the foreign server
CREATE USER MAPPING FOR current_user SERVER <SERVER_NAME> OPTIONS (
dlf_access_id '<ACCESS_KEY_ID>',
dlf_access_key '<ACCESS_KEY_SECRET>',
oss_access_id '<ACCESS_KEY_ID>',
oss_access_key '<ACCESS_KEY_SECRET>'
);
-- Grant a RAM user (123xxx) access to the foreign server
CREATE USER MAPPING FOR "p4_123xxx" SERVER <SERVER_NAME> OPTIONS (
dlf_access_id '<ACCESS_KEY_ID>',
dlf_access_key '<ACCESS_KEY_SECRET>',
oss_access_id '<ACCESS_KEY_ID>',
oss_access_key '<ACCESS_KEY_SECRET>'
);
-- Remove user mappings
DROP USER MAPPING FOR CURRENT_USER SERVER <SERVER_NAME>;
DROP USER MAPPING FOR "p4_123xxx" SERVER <SERVER_NAME>;
Etapa 4: Crie uma tabela externa
O Hologres disponibiliza dois comandos para criar tabelas externas:
|
Comando |
Mais indicado para |
|
Um pequeno número de tabelas, ou quando é necessário mapear um subconjunto de colunas ou atribuir um nome personalizado à tabela. |
|
|
Mapeamento em lote de múltiplas tabelas a partir de um schema externo. |
O Hologres suporta tabelas particionadas no oss. Os tipos de chave de partição suportados são TEXT, VARCHAR e INT.
Ao utilizar CREATE FOREIGN TABLE : defina os campos de partição como colunas regulares, pois este comando mapeia o schema sem armazenar dados.
Com o comando IMPORT FOREIGN SCHEMA : o sistema mapeia os campos automaticamente.
Se o nome de uma tabela externa entrar em conflito com uma tabela interna existente no Hologres, oIMPORT FOREIGN SCHEMAignorará essa tabela. Utilize oCREATE FOREIGN TABLEpara mapeá-la com um nome diferente.
-- Create a single foreign table
CREATE FOREIGN TABLE <HOLO_SCHEMA_NAME>.<TABLE_NAME>
(
column_name data_type
[, ...]
)
SERVER <SERVER_NAME>
OPTIONS (
schema_name '<HIVE_DATABASE_NAME>',
table_name '<HIVE_TABLE_NAME>'
);
-- Import multiple foreign tables in batch
IMPORT FOREIGN SCHEMA <HIVE_DATABASE_NAME>
[
{ LIMIT TO | EXCEPT }
( table_name [, ...] )
]
FROM SERVER <SERVER_NAME>
INTO <HOLO_SCHEMA_NAME>
OPTIONS (
if_table_exist 'update',
if_unsupported_type 'error'
);
Etapa 5: Consulte a tabela externa
Após criar a tabela externa, consulte-a diretamente para ler dados do oss.
Tabela não particionada:
SELECT * FROM <HOLO_SCHEMA_NAME>.<TABLE_NAME>;
Tabela particionada:
SELECT * FROM <HOLO_SCHEMA_NAME>.<PARTITION_TABLE_NAME>
WHERE <PARTITION_KEY> = '<PARTITION_VALUE>';