Apache Hive

Publicado por

Índice

  1. Introducción
  2. Características
  3. Arquitectura
  4. HCatalog
  5. HiveQL
  6. Optimización

1. Introducción

Como no iba a ser posible enseñar rápidamente a los ingenieros y analistas las habilidades para que pudieran explotar los datos en Hadoop. Tampoco querían que los analistas dependieran de conocimientos en MapReduce.

Apache Hive fue creado con  dos objetivos, que fuera un lenguaje declarativo basado en SQL y que permitiera a los ingenieros desarrollar sus propios scripts y programas cuando con SQL no fuera suficiente. También fue creado para almacenar  de manera centralizada metadatos sobre todos los datasets de la organización,  y que fueran más accesibles para toda la compañía, un requisito imprescindible para orientarse al dato.

Hive es una infraestructura de almacenamiento basada en Hadoop que ha sido diseñada para la agrupación, consulta y análisis de grandes volúmenes de datos almacenados en sistemas distribuidos.  Hive no esta diseñado para utilizarse en sistemas de procesamiento online, esta enfocado a realizar tareas  de data warehouse.

Las consultas SQL tradicionales tienen que ser implementadas con la API Java MapReduce para ejecutar aplicaciones SQL y consultar sobre datos distribuidos. Hive proporciona una interfaz llamada HiveQL que traduce el lenguaje HQL (interfaz parecida a SQL) en trabajos map-reduce, Tez o tareas de Spark para evitarnos el trabajo de programarlo nosotros a nivel de API Java.

2. Características

  1. Indexación para acelerar las consultas. Sobre todo índice de bitmaps
  2. Diferentes tipos de almacenamiento: txt, RCFile, HBase, ORC, etc
  3. Almacenamiento de metadatos en bases relacionales
  4. Operaciones sobre datos comprimidos almacenados en HDFS
  5. Funciones definidas por el usuario (UDFs)

Inicialmente Hive esta configurado para almacenar sus metadatos en Apache Derby aunque puede utilizarse una MySQL o una Postgres.

3. Arquitectura

Los componentes principales son los siguientes:

  • Metastore: guarda los metadatos para cada una de las tablas, así como sus esquemas y localización. También incluye una partición de metadatos que ayuda al Driver a rastrear el avance de los conjuntos de datos distribuidos sobre el cluster. Los metadatos son almacenados en un RDBMS tradicional.  Se realiza una copia de seguridad regularmente en un servidor remoto para que pueda ser utilizado en caso de que haya perdida de datos.
  • Driver: recibe y coordina las sentencias HiveQL. Comienza la ejecución de las sentencias creando sesiones y controla el ciclo de vida y progreso de la ejecución. Almacena los metadatos necesarios generados durante la realización de la instrucción HiveQL. El driver también actúa como punto de recolección de datos después de la realización de una tarea reduce.
  • Compiler: realiza la compilación de la consulta HiveQL dando como resultado un plan de ejecución. Este plan contiene las tareas y los pasos necesarios para realizar un job MapReduce y obtener un resultado. El compilador convierte la consulta a un árbol de sintaxis abstracta (AST: Abstract syntax tree). Después de comprobar la compatibilidad y errores de compilación del AST lo convierte en un grafo acíclico directo (DAG: Directed Acyclic Graph). El DAG divide los operadores para la etapas MapReduce basándonse en la consulta de entrada y en los datos.
  • Optimizer: realiza algunas transformaciones al plan de ejecución para obtener un DAG optimizado. Puede dividir las tareas o aplicar una transformación a los datos antes de que se envíen a las operaciones de reduce para mejorar en rendimiento y escalabilidad.
  • Motor de ejecución: realiza las tareas acorde al DAG, interactúa con el Resource Manager para planificar las tareas que se van a lanzar. Se ocupa de que el orden sea correcto y si una tarea depende del resultado de otra, ésta no se lance antes de tiempo.
  • CLI: HiveServer2 (desde Hive 0.11) tiene su propio CLI llamado Beeline, que es un cliente JDBC basado en SQLLine. En los nuevos desarrollos enfocados en HiveServer2 se deprecara Hive CLI en favor de Beeline.

hive_architecture

4. HCatalog

Es una capa de administración de tablas y almacenamiento para Hadoop que permite a los usuarios utilizar diferentes herramientas de procesamiento de datos (Pig, MapReduce) para que sea más fácil leer y escribir datos.

La abstracción de HCatalog permite a los usuarios tener una visión relacional del entorno de Hadoop haciendo que no haya que preocuparse por el formato en el que se encuentren los datos, RCFile, text file, SequenceFile o ORC.

HCatalog soporta la lectura y escritura de cualquier tipo de archivos para los que se pueda escribir un SerDe (Serialization-Deseralization). Por defecto soporta los formatos RCFile, CSV, JSON,SequenceFile y ORC. Para utilizar un formato personalizado hay que proporcionar el InputFormat, OutputFormat y el SerDe.

hcat-product

HCatalog esta construido sobre el metastore de Hive e incorpora las DLLs de Hive. Tiene una interface para que Pig y MapReduce pueden leer y escribir datos. Utiliza el CLI de Hive para consultar definiciones  de datos y  exploración de metadatos.

La interfaz  para Pig consiste en dos partes: HCatLoader y HCatStorer y para MapReduce son otras dos HCatInputFormat y HCatOutputFormat. HCatalog también proporciona una API REST llamada WebHCat.

5. HiveQL

Las estructuras de datos que se manejan en HiveQL en orden de granularidad son:

  • Databases: espacio de gestión para evitar conflictos entre los nombres de las tablas, vistas, particiones, columnas, etc. También pueden ser utilizadas para reforzar la seguridad de un grupo de usuarios.
  • Table: unidades de datos homogéneas entre si que comparten esquema. Los esquemas definen el nombre y tipo del atributo o columna.
  • Partitions: cada tabla puede tener una o más particiones que determina como se guardan los datos. Aparte de ser unidades de almacenamiento, también permite a los usuarios identificar eficazmente las filas que necesita.
  • Buckets: los datos en una partición pueden ser divididos en paquetes utilizando una función hash sobre el valor de alguna columna. Esto se utiliza, por ejemplo, para el muestreo de datos.

Tablas gestionadas y externas

Por defecto Hive crea tablas gestionadas, donde los ficheros, metadatos y estadísticas son administrados por procesos internos de Hive. Una tabla gestionada es guardada en la propiedad hive.metastore.warehouse.dir o en el directorio hdfs://namenode_server/user/apps/hive/warehouse/databasename.db/tablename/. Si una tabla gestionada es borrada, los datos y los metadatos asociados a la tabla o partición son borrados. Si la opción PURGE no se especifica, los datos son enviados a una carpeta papelera durante un periodo de tiempo.

Hay que utilizar tablas gestionadas cuando Hive deba administrar el ciclo de vida de la tabla o cuando se generen tablas temporales.

Una tabla externa tienes sus metadatos o esquemas en ficheros externos. Las tablas externas son archivos que pueden ser accedidos y administrados por procesos desde fuera de Hive. Las tablas externas pueden acceder a datos guardados en diferentes localizaciones. Si la estructura o el particionamiento de una tabla cambia, el comando MSCK REPAIR TABLE table_name puede ser utilizado para actualizar los archivos.

Utilizar tablas externas cuando los archivos estén presentes o remotamente, y que sean archivos que deban mantenerse aunque se borre la tabla.

Se puede saber el tipo de la tabla utilizando el comando:
DESCRIBE FORMATTED table_name, que mostrará si es MANAGED_TABLE o EXTERNAL_TABLE.

Así es una consulta con HiveQL

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
 FROM table_reference
 [WHERE where_condition]
 [GROUP BY col_list]
 [HAVING having_condition]
 [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
 [LIMIT number]

UDF (User Defined Function): son funciones definidas por el usuario (en Java) que sirven para extender la funcionalidad de Hive siendo evaluadas en las instrucciones de HiveQL.

UDAF (User Defined Agregated Functions): Se utilizan cuando se quiere procesar datos a nivel de columna en vez de a nivel de fila. Una invocación  UDAF que tenga una cláusula over tendrá una especificación de ventana efectiva aplicada a ella.

COUNT(DISTINCT a) OVER (PARTITION BY c) FROM T;

SELECT a, SUM(b) OVER (PARTITION BY c, d ORDER BY e, f) FROM T;

SELECT a, AVG(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN 3 
PRECEDING AND 3 FOLLOWING) FROM T;

UDTF (User Defined Tabular Functions): son funciones que se aplican sobre columnas compuestas por estructuras complejas para desnormalizar la información, así la función creará varias filas por cada valor. Un ejemplo de este tipo de funciones son <code>explode()</code> y <code>posexplode()</code>.

6. Optimización

  1. Particiones
  2. Ficheros ORC o Parquet
  3. Buckets
  4. Desnormalización
  5. MapJoin
  6. Utilizar Tez

a. Particiones

La operación de E/S es el principal cuello de botella de rendimiento para ejecutar consultas sobre Hive. El rendimiento se puede mejorar si se puede reducir la cantidad de datos que deben leerse. De forma predeterminada, las consultas de Hive examinan tablas completas. Esto es excelente para las consultas de recorridos de tabla; sin embargo, para las consultas que sólo necesitan analizar una pequeña cantidad de datos (por ejemplo, consultas con filtrado), esto crea una sobrecarga innecesaria.

Particionar una tabla significa guardar los datos en subdirectorios categorizados por los valores de una columna, esto permite a Hive excluir datos innecesarios cuando tiene que realizar una consulta.

La creación de particiones de Hive se implementa mediante la reorganización de los datos sin procesar en nuevos directorios teniendo cada partición su propio directorio.

  • No cree particiones insuficientes: la creación de particiones en columnas con solo unos pocos valores puede generar muy pocas particiones.
  • No cree particiones excesivas: en el otro extremo, la creación de una partición en una columna con un valor único hará provocará un gran esfuerzo en el namenode del clúster ya que tendrá que controlar muchos directorios.
  • Evitar el sesgo de datos: elegor la clave de creación de particiones con cuidado de manera que todas las particiones tengan el mismo tamaño.
CREATE TABLE line_item_part(...)
PARTITIONED BY(L_SHIPDATE STRING)
STORED AS TEXTFILE;

Cuando se cree la tabla con particiones, éstas pueden ser estáticas o dinámicas. Las estáticas indican que la partición ya se ha realizado en los directorios adecuados y pueden pedir a Hive alguna de esas particiones.

Utilizamos particiones dinámicas cuando solo sabemos los valores que va a tener una columna en tiempo de ejecución. Dejamos a Hive que particione los datos automáticamente. Para disponer de particiones dinámicas es necesario habilitar:

SET hive.exec.dynamic.partition=true;

Las particiones dinámicas pueden penalizar cuando escribamos porque se pueden generar muchas particiones en un corto periodo de tiempo.

hive> show partitions part_table;
OK
d=abc

hive> DESCRIBE formatted part_table partition (d='abc');

b. Ficheros ORC o Parquet

El formato ORC (Optimized Row Columnar) es una manera muy eficaz de almacenar datos de Hive. En comparación con otros formatos, ORC tiene las siguientes ventajas:

  • Compatibilidad con tipos complejos incluidos DateTime y semiestructurados
  • Hasta un 70 % de compresión
  • Indiza cada 10.000 filas, lo que permite omitir filas
  • Un gran descenso en la ejecución del tiempo de ejecución

Fue diseñado con el objetivo de suplir la limitaciones de otros formatos de Hive. Utilizar archivos ORC mejora el rendimiento de Hive leyendo, escribiendo y procesando datos. El formato ORC esta disponible desde Hive 0.11.

c. Buckets

Las tablas bucketizadas son muy eficientes, por ejemplo, para el sampling; así cuando se realice un join, el tiempo de ejecución empleado será menor por su manera de organizar los datos. Para especificar que que queremos una tabla bucketizada por un campo la instrucción será:

CREATE TABLE user_info_bucketed(user_id BIGINT, firstname STRING, ...)
COMMENT 'A bucketed copy of user_info'
PARTITIONED BY(ds STRING)
CLUSTERED BY(user_id) INTO 256 BUCKETS;

Hay que tener en cuenta una propiedad de Hive para poder insertar datos en la tabla:

set hive.enforce.bucketing = true

¿Como distribuye Hive las filas entre los buckets? En general, el número de buckets es determinado por la expresión: hash_function(bucketing_column) mod num_buckets

d. Desnormalización de tablas: generar un tablón que contenga al resto de tablas, así evitaremos penalizar cuando tengamos que cruzar tablas con un join, ya que todos los datos se encontrarán en la misma tabla.

e. Optimización de joins a través de MapJoin 

  • Ordena la información antes de un join para simplificar la operación
  • Utiliza map joins siempre que sea posible

Un Map-Join puede ser utilizado invocando una sugerencia al optimizador.

select /*+ MAPJOIN(time_dim) */ count(*) 
from store_sales join time_dim on (ss_sold_time_sk = t_time_sk) ;

A partir de Hive 0.14 ya no es necesario especificar esta instrucción en la consulta,  ya que el optimizador lo va a realizar automáticamente con las propiedades:

SET hive.auto.convert.join=true;
SET hive.mapjoin.smalltable.filesize=1000000000;  (1GB)

También se pueden activar la optimización automática para los Map-Join con las propiedades:

SET hive.auto.convert.join.noconditionaltask = true;
SET hive.auto.convert.join.noconditionaltask.size = 10000;

f. Utilizar Tez

Por defecto Hive utiliza MapReduce como motor de ejecución. A menudo Tez es utilizado para mejorar en rendimiento.  Para configurarlo es necesario:

SET hive.execution.engine=tez;

Desde el cliente:

SET hive.use.tez.natively=true;

CLI

Para lanzar comandos desde Hive a la shell de Linux tenemos que poner una ! delante de la instrucción

!pwd

Hive puede declarar variables para que sean utilizadas por scripts .hql y pasar valores en tiempo de ejecución.

Casos de uso

Procesamiento de logs. Informe diario.

Medir la actividad de usuario.

Text mining utilizando machine learning.

¿Si fuera un bit por que sitios pasaría ?

Fuentes

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s