fondo
En el proceso de construcción de una plataforma de big data, la gobernanza de datos es una parte indispensable. Una excelente gobernanza de datos puede garantizar la calidad de los datos, la seguridad de los datos, etc., y puede hacer un uso más eficaz de los recursos.
Para un almacén de datos construido sobre la base de Hive, en términos de gobierno de datos, la información estadística de la tabla de Hive es un dato básico muy importante. Con estos datos, la descripción general de la tabla de Hive se puede entender para respaldar la construcción y administración razonables. de la mesa Hive.
Recopilar estadísticas de la tabla de Hive
plan
Introducción a las funciones de análisis de tablas de Hive
Hive proporciona la función de analizar tablas y particiones, y puede almacenar la información estadística analizada en metadatos. Esta función puede ejecutar automáticamente la tabla de análisis o ejecutar manualmente la tabla de análisis.
El análisis automático es principalmente para tablas recién creadas, que se pueden habilitar a través de la configuración. Para obtener detalles de configuración, consulte Propiedades de configuración .
Hive habilita la recopilación de estadísticas a nivel de tabla de forma predeterminada y recopila y actualiza automáticamente las estadísticas durante las operaciones DML (excepto las instrucciones LOAD DATA).
La recopilación de estadísticas a nivel de columna no está habilitada de forma predeterminada.
El análisis de ejecución manual es principalmente para tablas existentes, que se pueden completar ejecutando comandos SQL, los ejemplos son los siguientes:
ANALYZE TABLE Table1 PARTITION(ds='2008-04-09', hr=11) COMPUTE STATISTICS;
Para obtener detalles sobre la función de análisis de tablas de Hive, consulte: StatsDev .
Esquema de recopilación de estadísticas de la tabla Hive
En la aplicación Hive, algunas tablas usan Hive DML para operar datos. Este tipo de tabla puede recopilar automáticamente información estadística, y algunas tablas usan DML que no es de Hive para operar datos, como tablas externas. Este tipo de tabla debe analizarse manualmente Estadísticas recogidas.
Después de que la tabla de Hive recopila información estadística, actualmente hay dos formas de recopilar información estadística:
- Método 1: recopilar información estadística a través de los metadatos de Hive
- Método 2: Obtenga información estadística a través del comando Hive DESCRIBE , analice y almacene los datos
En ese momento, se consideró que si se utiliza el primer método, debe interactuar directamente con la base de datos de metadatos, lo que puede causar efectos adversos en la base de datos de metadatos. En la segunda forma, no interactuará directamente con la base de datos de metadatos, lo que puede ser más seguro.
Finalmente, se decide utilizar el segundo método para la recolección de información estadística.
Descripción de los indicadores de recaudación:
índice | DESCRIBE Estadísticas | ilustrar |
---|---|---|
núm_archivos | numArchivos | Número de archivos |
núm_particiones | númParticiones | número de particiones |
núm_filas | número de filas | Número de líneas |
raw_data_size | rawDataSize | Tamaño de datos original, unidad B. Los datos en la tabla de formato Parquet son inexactos y Hive4.0 los corrige |
tamaño total | tamaño total | Tamaño total del archivo en HDFS, unidad B, |
lograr
Los pasos principales
- Especifique la tabla que debe analizarse manualmente y realice el análisis
- Obtener la lista de bases de datos de Hive
- Obtenga la lista de tablas de cada base de datos en Hive
- Obtenga el resultado del comando DESCRIBE para cada tabla y analice la información estadística
Ejemplo de código central
Estructura de la tabla:
-- 存储 DESCRIBE 指令结果
CREATE TABLE dg.dg_table_desc
(
db_name STRING COMMENT 'database name',
tbl_name STRING COMMENT 'table name',
desc_date STRING COMMENT '描述日期',
desc_row_number INT COMMENT '清洗后的describe结果数据行号',
desc_col_name STRING COMMENT 'describe table col_name',
desc_data_type STRING COMMENT 'describe table data_type',
desc_comment STRING COMMENT 'describe table comment'
)
COMMENT '表描述信息'
STORED AS PARQUET
TBLPROPERTIES ('parquet.compression' = 'SNAPPY');
-- 存储统计信息
CREATE TABLE dg.dg_table_stats
(
db_name STRING COMMENT 'database name',
tbl_name STRING COMMENT 'table name',
stat_date STRING COMMENT '统计日期',
num_files BIGINT COMMENT 'numFiles,表文件数量',
num_partitions BIGINT COMMENT 'numPartitions,表分区数量',
num_rows BIGINT COMMENT 'numRows,表行数',
raw_data_size BIGINT COMMENT 'rawDataSize,原始数据大小,单位B。Parquet格式表的此数据不准,hive4.0修复',
total_size BIGINT COMMENT 'totalSize,总文件大小,单位B'
)
COMMENT '表统计信息'
STORED AS PARQUET
TBLPROPERTIES ('parquet.compression' = 'SNAPPY');
Use pyhive para conectarse a la colmena:
# 获取spark runtime conf
principal = spark.conf.get('spark.yarn.principal', default=None)
keytab = spark.conf.get('spark.yarn.keytab', default=None)
queue = spark.conf.get('spark.yarn.queue', default=None)
with krbContext(using_keytab=True, principal=principal, keytab_file=keytab):
hive_conf = {
}
if queue:
hive_conf['mapreduce.job.queuename'] = queue
hive_conn = hive.connect(
host=args.hiveserver2_host,
port=args.hiveserver2_port,
auth='KERBEROS',
configuration=hive_conf,
kerberos_service_name='hive'
)
cursor = hive_conn.cursor()
# 操作hive
pass
# 关闭连接
cursor.close()
hive_conn.close()
Ejecute la tabla de análisis manualmente:
cursor.execute(f'analyze table {
db_tbl} partition({
partition}) compute statistics')
Obtenga una lista de las bases de datos de Hive:
cursor.execute('show databases')
dbs = []
for db_i in cursor.fetchall()
dbs.append(db_i[0])
Obtenga la lista de tablas de cada base de datos en Hive:
cursor.execute(f'use {
db}')
cursor.execute('show tables')
tbls = []
for tbl_i in cursor.fetchall():
tbls.append(tbl_i[0])
Obtenga el resultado del comando DESCRIBE para cada tabla
def transform_desc_row(desc_row):
row = []
for i in desc_row:
if i is None:
row.append(None)
else:
i = i.strip()
row.append(None if i == '' else i)
return row
cursor.execute(f'describe formatted {
db_tbl}')
rn = 1
for i in cursor.fetchall():
col_name, data_type, comment = transform_desc_row(i)
if any([col_name, data_type, comment]):
data.append({
'db_name': db,
'tbl_name': tbl,
'desc_date': desc_date,
'desc_row_number': rn,
'desc_col_name': col_name,
'desc_data_type': data_type,
'desc_comment': comment
})
rn += 1
Estadísticas de análisis:
WITH new_desc AS
(SELECT db_name,
tbl_name,
desc_date,
desc_data_type,
desc_comment
FROM ${dg}.dg_table_desc
WHERE desc_date >= '${start_dt}'
AND desc_date <= '${end_dt}'
AND desc_data_type IN ('numFiles',
'numPartitions',
'numRows',
'rawDataSize',
'totalSize'))
INSERT OVERWRITE TABLE ${dg}.dg_table_stats
SELECT db_name,
tbl_name,
stat_date,
num_files,
num_partitions,
num_rows,
raw_data_size,
total_size
FROM ${dg}.dg_table_stats
WHERE stat_date < '${start_dt}'
UNION ALL
SELECT db_name,
tbl_name,
desc_date,
max(if(desc_data_type = 'numFiles', cast(desc_comment AS BIGINT), 0)) AS num_files,
max(if(desc_data_type = 'numPartitions', cast(desc_comment AS BIGINT), 0)) AS num_partitions,
max(if(desc_data_type = 'numRows', cast(desc_comment AS BIGINT), 0)) AS num_rows,
max(if(desc_data_type = 'rawDataSize', cast(desc_comment AS BIGINT), 0)) AS raw_data_size,
max(if(desc_data_type = 'totalSize', cast(desc_comment AS BIGINT), 0)) AS total_size
FROM new_desc
GROUP BY db_name,
tbl_name,
desc_date;
solicitud
Las aplicaciones actualmente pensadas son las siguientes.
Análisis de archivos pequeños
Al calcular el tamaño de archivo promedio y estimar los archivos pequeños en la tabla de Hive, se optimiza la estrategia de almacenamiento de Hive.
Tamaño de archivo promedio = tamaño_total / num_files.
analisis incremental
Al recopilar datos en stock, puede analizar el incremento de la tabla de Hive dentro de un período determinado (incremento en la cantidad de archivos, incremento en la cantidad de filas, incremento en el tamaño total del archivo, etc.).
Por ejemplo, en el análisis incremental diario, el índice incremental se puede calcular comparando los datos de información estadística de dos días adyacentes en la tabla de Hive.
A través de indicadores de análisis incremental, se puede ayudar aún más a la construcción de la gestión del ciclo de vida de los datos.