Recopilación y aplicación de información estadística de tablas Hive

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

  1. Especifique la tabla que debe analizarse manualmente y realice el análisis
  2. Obtener la lista de bases de datos de Hive
  3. Obtenga la lista de tablas de cada base de datos en Hive
  4. 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.

Supongo que te gusta

Origin blog.csdn.net/xwd127429/article/details/129792988
Recomendado
Clasificación