APACHE HIVE¶
Objetivo¶
Documentar como subir uma instância de Apache Hive utilizando metastore Postgresql e tabelas Iceberg.
Por default, o Hive utiliza o Apache Derby como armazenador de metadados.
Para utilizar o Iceberg, é obrigatorio que a versão do Hive seja 4.0.0 ou superior. Para versões menores algumas operações podem não funcionar.
Links¶
[1] Hive Dockerhub: https://hub.docker.com/r/apache/hive
[2] Docker compose: https://github.com/apache/hive/blob/master/packaging/src/docker/docker-compose.yml
[3] Iceberg Create Table example: https://iceberg.apache.org/hive-quickstart/
[4] Hive connect: https://stackoverflow.com/questions/78525911/docker-hive-with-postgres-errors
[5] Iceberg Table Types (!!Veja observações): https://iceberg.apache.org/docs/latest/schemas/
[6] Iceberg PARQUET/AVRO/ORC: https://iceberg.apache.org/docs/latest/hive/#non-partitioned-tables
Dependencias¶
[1] Docker - Version >= 27.1.1
Instalação por docker¶
Para utilizar o apache hive com docker primeiro exporte para a variável HIVE_VERSION
a versão a ser utilizada.
Em seguida faça o download do driver do postgres e exporte para a variável POSTGRES_LOCAL_PATH o caminho absoluto do arquivo.
Este driver será utilizado para a conexão entre postgres e os serviços.
# Hive version
export HIVE_VERSION=4.0.0
# Postgres Driver
wget https://jdbc.postgresql.org/download/postgresql-42.7.3.jar
export POSTGRES_LOCAL_PATH=/home/user/Downloads/postgresql-42.7.3.jar
# Docker compose
docker compose up -d
# Connect to hive
docker exec -it hiveserver2 beeline -u 'jdbc:hive2://hiveserver2:10000/'
# In case of connection problems:
docker exec -it hiveserver2 /bin/bash
hive
!connect jdbc:hive2://localhost:10000
username: hive (Defined in docker-compose.yml)
password: password (Defined in docker-compose.yml)
# Check if hive is working
show databases
Observações Importantes¶
[1] Ao criar tabelas no apache hive, os nomes dos tipos devem seguir o hive ao invés dos tipos mostrados na documentação do Iceberg. Um exemplo disso é o tipo long
não ser aceito.
[2] Ao criar tabelas particionadas, a coluna da partição deve ser declarada após PARTITION BY
, deve também declarar seu tipo e NÃO PODE CONTER CONSTRAINTS. Do contrário haverá conflito de duas colunas repetidas.
Exemplo de erro:
-- Modo errado
CREATE TABLE usuarios (
Usuario_id INTEGER NOT NULL,
Nome STRING NOT NULL,
Departamento_id INTEGER
)
PARTITIONED BY (Departamento_id NOT NULL)
STORED BY ICEBERG;
-- Modo correto
CREATE TABLE usuarios (
Usuario_id INTEGER NOT NULL,
Nome STRING NOT NULL
)
PARTITIONED BY (Departamento_id INTEGER)
STORED BY ICEBERG;
Importar Dados¶
Tabelas Iceberg apenas aceitam três tipos a serem importados, PARQUET, AVRO e ORC. Sendo utilizado o tipo PARQUET por default.
-- You can specify the default file format (Avro, Parquet, ORC) at the time of the table creation. The default is Parquet:
CREATE TABLE x (i int) STORED BY ICEBERG STORED AS ORC;
Problemas/Dificuldades¶
[1]: Por algum motivo desconhecido, o docker de metadados fica reiniciando impossibilitando a conexão com o hive. O jeito é ficar tentando.