Data Team MICApache Hive Metastore es un catálogo central de metadatos para almacenamiento distribuido. Gestiona la definición de tablas, esquemas y particiones para datos almacenados en Ceph/S3. Trino (catálogo hive), Spark y otros procesadores consultan HMS para descubrir y acceder a las tablas del Data Lake.
Conectarse vía Trino al catálogo Hive
# Configurar conexión a Trino (catálogo Hive integrado)
$ trino --server <tu-url> \
--user <tu_usuario> \
--catalog hive
Verificar conexión a HMS
-- Ver todos los esquemas en el catálogo Hive
SHOW SCHEMAS FROM hive;
-- Ver tablas en un schema específico
SHOW TABLES FROM hive.default;
-- Consultar metadatos de una tabla
DESCRIBE hive.default.clientes;
DESCRIBE FORMATTED hive.default.clientes;
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("HiveApp") \
.config("spark.sql.warehouse.dir", "s3a://data-analytics/warehouse/") \
.config("hive.metastore.uris", "<metastore-url>") \
.enableHiveSupport() \
.getOrCreate()
# Consultar tabla registrada en HMS
df = spark.sql("SELECT * FROM hive.default.clientes LIMIT 10")
-- Tabla gestionada: HMS controla datos y metadatos
CREATE TABLE hive.default.clientes_temp (
customer_id BIGINT,
nombre VARCHAR,
email VARCHAR,
fecha_creacion DATE
)
STORED AS PARQUET;
-- Tabla externa: metadatos en HMS, datos en Ceph
CREATE EXTERNAL TABLE hive.default.ventas_raw (
sale_id BIGINT,
customer_id BIGINT,
monto DECIMAL(10, 2),
fecha DATE
)
STORED AS PARQUET
LOCATION 's3a://data-raw/ventas/';
-- Tabla particionada por fecha
CREATE EXTERNAL TABLE hive.default.transacciones (
transaction_id BIGINT,
customer_id BIGINT,
monto DECIMAL(10, 2)
)
PARTITIONED BY (
year INT,
month INT,
day INT
)
STORED AS PARQUET
LOCATION 's3a://data-analytics/transacciones/';
-- Ver particiones de una tabla
SHOW PARTITIONS hive.default.transacciones;
-- Ver particiones específicas
SHOW PARTITIONS hive.default.transacciones
WHERE year=2026 AND month=3;
-- Agregar partición manualmente
ALTER TABLE hive.default.transacciones
ADD PARTITION (year=2026, month=3, day=14)
LOCATION 's3a://data-analytics/transacciones/2026/03/14/';
-- Agregar múltiples particiones
ALTER TABLE hive.default.transacciones
ADD IF NOT EXISTS
PARTITION (year=2026, month=3, day=12) LOCATION '...'
PARTITION (year=2026, month=3, day=13) LOCATION '...';
-- Sincronizar HMS con archivos en S3
-- Detecta particiones que existen en S3 pero no en HMS
MSCK REPAIR TABLE hive.default.transacciones;
-- Modo check (solo listar, sin agregar)
MSCK REPAIR TABLE hive.default.transacciones CHECK PARTITIONS;
-- Agregar columna
ALTER TABLE hive.default.clientes
ADD COLUMNS (segmento VARCHAR, fecha_actualizacion TIMESTAMP);
-- Cambiar tipo de columna (solo para tipos compatibles)
ALTER TABLE hive.default.clientes
CHANGE COLUMN email email_principal VARCHAR;
-- Renombrar tabla
ALTER TABLE hive.default.clientes
RENAME TO hive.default.clientes_activos;
-- Ver propiedades personalizadas de tabla
SHOW TBLPROPERTIES hive.default.clientes;
-- Ver propiedades de partición
SHOW PARTITIONS hive.default.transacciones;
SHOW PARTITIONPROPERTIES hive.default.transacciones PARTITION(year=2026, month=3);
-- Agregar propiedades a tabla (metadata)
ALTER TABLE hive.default.clientes
SET TBLPROPERTIES (
'owner'='data-engineering',
'description'='Tabla maestra de clientes',
'last_modified_by'='spark-job',
'pii'='true'
);
-- Propiedades de partición
ALTER TABLE hive.default.transacciones
PARTITION (year=2026, month=3, day=14)
SET LOCATION 's3a://data-analytics/transacciones/2026/03/14/';
-- Listar todas las tablas de un schema
SELECT * FROM information_schema.tables
WHERE table_schema = 'default';
-- Columnas de una tabla
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'default' AND table_name = 'clientes';
-- Tamaño estimado de tabla
SELECT
table_name,
size_in_bytes,
num_files
FROM information_schema.table_stats
WHERE table_schema = 'default';
-- Calcular estadísticas (tamaño, filas, distribución)
ANALYZE TABLE hive.default.clientes COMPUTE STATISTICS;
-- Estadísticas por columna (para query optimization)
ANALYZE TABLE hive.default.transacciones
COMPUTE STATISTICS FOR COLUMNS customer_id, monto;
-- Ver estadísticas guardadas
SHOW STATS FOR TABLE hive.default.clientes;
# Crear tabla externa desde archivos Ceph
spark.sql("""
CREATE EXTERNAL TABLE IF NOT EXISTS hive.default.ventas_s3 (
sale_id BIGINT,
customer_id BIGINT,
monto DOUBLE,
fecha DATE
)
STORED AS PARQUET
LOCATION 's3a://data-raw/ventas/2026/'
""")
# Reparar particiones después de cargar datos
spark.sql("MSCK REPAIR TABLE hive.default.ventas_s3")
-- Consultar tabla Hive + tabla Iceberg
SELECT
h.sale_id,
h.monto,
i.customer_segment
FROM hive.default.ventas h
LEFT JOIN iceberg.analytics.clientes i
ON h.customer_id = i.customer_id;
# Después de cargar datos en Ceph
# Reparar tabla para que HMS detecte nuevas particiones
spark.sql("MSCK REPAIR TABLE hive.default.transacciones ADD PARTITIONS")
# O agregar manualmente si se conocen las particiones
spark.sql("""
ALTER TABLE hive.default.transacciones
ADD PARTITION (year=2026, month=3, day=14)
LOCATION 's3a://data-raw/transacciones/2026/03/14/'
""")
| Práctica | Descripción |
|---|---|
| Schemas | Usar hive.raw, hive.staging, hive.analytics según capa. Nunca usar default. |
| Tablas externas | Preferir externas para datos en Ceph/S3. Managed solo para datos intermedios. |
| Particionamiento | Particionar por year/month/day. Máximo 10K particiones por tabla. |
| Nombres | Convención: <area>_<entidad>_<tipo>, ej. comercial_clientes_raw, telco_cdr_staging. |
| MSCK REPAIR | Ejecutar después de cargar datos en S3 para sincronizar particiones con HMS. |
| Propiedades | Siempre establecer owner, description, pii en tablas sensibles. |
| Estadísticas | Ejecutar ANALYZE en tablas críticas (antes de joins grandes). |
| Limpieza | Eliminar particiones obsoletas regularmente: ALTER TABLE ... DROP PARTITION. |
| Problema | Causa | Solución |
|---|---|---|
| Partición no aparece en HMS | Datos en S3 pero no registrados | MSCK REPAIR TABLE |
| Error "Table not found" | Tabla en schema incorrecto | Verificar schema: SHOW TABLES FROM schema_name |
| Slow queries | Estadísticas desactualizadas | ANALYZE TABLE ... COMPUTE STATISTICS |
| Partición duplicada | Agregar sin IF NOT EXISTS |
Usar DROP PARTITION antes de agregar |
| HMS no responde | Conexión thrift fallida | Verificar <tu-url> |