Manejo Apache Hive

Una vez instalado nuestro componente de Apache Hive que más que ser una Base de Datos la considero como una Big Table, pero una vez después de instalarla, aprenderemos como usarla, ya que esta Big Table fue creada con el objetivo de realizar almacenamiento, búsquedas y demás en un ambiente de Big Data, los desarrolladores optaron por ponerle un cliente que interpreta los queries a un proceso Map Reduce como ya vimos en la teoría, bien, para llamar la consola de hive basta con escribir en la consola la palabra "hive".

 Una vez dentro ya podemos acceder a todo lo que es hive, empezaremos por listar las Bases de Datos en nuestro ambiente con el query show databases;


Como verán mi ambiente solo cuenta con la "Base de Datos" llamada default y como su nombre dice, esta será la "Base de Datos" que estará seleccionado al inicio de cualquier cliente de hive para que podamos trabajar.

Procederé a crear otra "Base de Datos" en Apache Hive con el siguiente query:

create database nombreBaseDatos;


Después de este comando hemos creado una "Base de Datos" llamada pruebadb en nuestro sistema hive, a continuación me referiré como espacio de trabajo cuando trate de hacer referencia que es una "Base de Datos", después de aclarar esto procederé a seleccionar pruebadb como mi espacio de trabajo con el siguiente query.

use pruebadb;


Después de seleccionar pruebadb como nuestro espacio de trabajo, pondremos que nos liste nuestras tablas en este espacio de trabajo con el siguiente query.

show tables;


Como vemos no contenemos ninguna tabla, procederé a crear una de ejemplo llamada tblPrueba con tres campos llamados nombre, apellido, edad y esto se logra con el siguiente query.

create table tblPrueba (nombre String, apellido String, edad Int);


Para corroborar que la tabla fue creada en el espacio de trabajo utilizamos el comando de listar las tablas.

Como vemos ahora ya se encuentra un elemento llamado tblprueba en nuestro espacio de trabajo pruebadb y para saber la estructura de esta tabla, con el siguiente query.

describe databases;


Como pueden ver el interprete de Hive es muy parecido para manejar los elementos de este componente con SQL, procederemos a insertarle datos con un insert como si fuera SQL esto se realiza con el siguiente query.

insert into tblPrueba values ("kimberley","viera",22),("César","Ramos",25),("Oscar","Moguel",25),("Nancy","Saldaña",21);


Como verán realiza un MR para realizar la inserción en la tabla, ahora realizaremos un select a esta tabla con el siguiente query.

select * from tblPrueba;


Como podemos ver aquí no nos imprimió ningún proceso indicando que hiciera un MR, por último realicemos un count de esta misma tabla con el siguiente query.

select count(*) from tblPrueba;


Como podemos ver aquí también realizo un MR, y tal vez se estén preguntan. ¿En que casos el cliente de hive interpreta el query a MR y en cuáles no?.
Esta es una respuesta muy sencilla, cuando se trata de tratar la información o manipularla se realizará un MR y cuando se trate de mostrarla solo irá imprimiendo tal cuál vaya encontrando la información (El caso del select).
Bueno como verán es muy fácil manipular la consola de hive, cualquier persona con conocimiento de sql puede utilizar esta Big Table, pero los detalles como notar en que caso utiliza un MR o como funciona internamente, poca gente en realidad lo conoce y vamos ir descubriendo más cosas en este post de manejo de Hive.

Tablas Externas

Los ejemplos anteriores fueron con tablas internas, pero en esta sección trabajaremos y trataremos de entender las tablas externas.
Primero tendremos que identificar la diferencia entre una tabla externa y una interna.
Y prácticamente la diferencia es que una tabla interna forma un ente completo su metadato y su dato, mientras que en una tabla externa son independientes, ¿Qué significa esto?, que en una tabla externa si borramos una tabla, el metadato desaparecerá pero la data seguirá alojada en HDFS, diferencia en una tabla interna que se borran ambos.
Y ahorita mostraré un ejemplo práctico para entender la diferencia.

Para empezar descargaremos la siguiente información que es un csv de esta página
https://support.spatialkey.com/spatialkey-sample-csv-data/ fue el único ejemplo que encontré para este ejemplo, cabe destacar que se puede crear una tabla con cualquier separador, las tablas internas de hive usan el carácter \u0001 que es un carácter hexadecimal y tiene por nombre Start of Header (SOH), una vez explicado esto, crearé una tabla externa que se creará a partir de un csv.


Este seria el archivo csv que usaremos para nuestra tabla externa. Ahora procederemos a inspeccionar el Web Browser de hadoop en la dirección de Hive para mostrar que no hay más que una tabla en la estructura de hive.

Ahora procederé a crear una tabla en hive que se llame external_table con el siguiente query en el espacio de trabajo default.

USE default;

CREATE EXTERNAL TABLE IF NOT EXISTS external_table (col1 INT,col2 STRING,col3 STRING,col4 DOUBLE,col5 DOUBLE,col6 DOUBLE,col7 DOUBLE,col8 DOUBLE,col9 DOUBLE,col10 DOUBLE,col11 DOUBLE,col12 DOUBLE,col13 DOUBLE,col14 DOUBLE,col15 DOUBLE,col16 STRING,col17 STRING,col18 DOUBLE)  ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 



Una vez creada la tabla externa checaremos de nuevo el Web Browser de HDFS.


Como podemos ver ya se encuentra la tabla que creamos, pero aún esta vacía, como es una tabla externa puede buscar la información de dos lados, una es de nuestro File System Local y la otra es de alguna parte en HDFS, haré el ejemplo con los dos casos en esta misma tabla, empezaremos con la información local, para eso debemos tener en nuestro clúster el archivo csv anterior como se muestra a continuación.


Como podemos ver el archivo ya se encuentra en mi File System Local y ahora con el siguiente comando en la consola de hive depositaremos esta información en la carpeta external_table que se encuentra en HDFS que pudimos observar en nuestro Web Browser.

LOAD DATA LOCAL INPATH '/home/cluster/Desktop/FL_insurance_sample.csv' INTO TABLE external_table;


Como podemos ver el comando se ha ejecutado exitosamente, en el comando anterior cabe aclarar que la ruta que se encuentra entre las comillas simples es la ruta al archivo en nuestro file system local.
Ahora como podemos observar el archivo ya se encuentra en el directorio de HDFS de la tabla de hive, lo cuál podríamos decir que es lo lógico de la Tabla.


Ahora si hacemos un count a esta tabla obtendremos lo siguiente.


Como podemos ver, ya tenemos información en nuestra tabla y fue cargada desde nuestro file system local maravilloso, pero puede ser que ya tengamos algún archivo en HDFS que queramos usar para tenerla como información de una tabla de hive y para este ejemplo al archivo le cambiaré el nombre de FL_insurance_sample.csv FL_insurance_sample_hdfs.csv y lo depositaré en una carpeta lógica en HDFS llamada prueba_external_table.


Una vez con la información en su lugar correspondiente procederemos a mover esta información a nuestra tabla de hive llamada external_table con el siguiente comando.

LOAD DATA INPATH 'hdfs:/prueba_external_table/FL_insurance_sample_hdfs.csv' INTO TABLE external_table;


El comando termino exitosamente y una vez que termino revisamos la ruta lógica en HDFS con nuestro Web Browser donde depositamos la información que es /prueba_external_table/ como muestra la imagen siguiente el archivo ya no se encuentra en esta ruta físicamente.

¿A que se debe esto?, muy simple el comando anterior mueve la data dentro de la tabla que le estamos indicando en este caso external_table y como la siguiente imagen muestra, nuestro archivo ahora se encuentra en la ruta donde esta alojada la tabla en HDFS.


Y al realizar un count ahora en esta tabla deberíamos tener el doble de información que hace rato.



Como podemos ver ahora contamos con el doble de información en nuestra tabla y le hemos agregado información tanto de un archivo local como de un archivo en HDFS, pero ahora mostraré la cualidad más importante de las tablas externas y como mencione anteriormente en una tabla externa a diferencia de la tabla interna el metadato y la data no estan ligadas,

Como podemos ver en la siguiente imagen cuento con 2 tablas, la que acabamos de crear llamada external_table y la de prueba que es una tabla interna.

Procederé a borrar la tabla de hive con el siguiente comando.

DROP TABLE external_table;



Como podemos ver la tabla ya no no la muestra el interprete de hive, pero, ¿En realidad borramos todo?, si nos dirigimos al Web Browser de HDFS en la ruta lógica donde se encuentra toda la data de hive podremos ver lo siguiente.


Podemos ver la siguiente imagen y no, no es la imagen de hace algunos párrafos atrás, en realidad el interprete de hive cuando se trata de una external table no borra la data y entonces que pasaría si creo una tabla llamada external_table con estructura diferente, descubramoslo!!!

Como vemos no nos devolvio ningún registro y ¿A qué se debe esto?, revisemos el Web Browser.


Ya no hay información la removió y esto se debe a que de alguna manera si guarda relación la metadata y la data en una tabla externa pero de forma débil, ya que al crear una nueva tabla con el mismo nombre pero estructura diferente el decide eliminar la data caso contrarío si hubiera creado la misma tabla con la misma metadata, en ese caso la data se hubiera conservado. Cuando borremos la tabla interna la metadata y la data se eliminan completamente en un mismo flujo.

Particiones

Una vez explicado los conceptos entre tablas internas y externas, procederemos a entender un concepto muy bueno que hoy en día todas las Bases de Datos, llámese RDBMS, NoSQL ó Big Table utilizan este recurso como manera de optimización de tiempos en la lectura u operación de data, ya que hoy en día es menos costoso saber en que parte de la memoria o clúster se encuentra la información y cargarlo a la RAM, que buscar sobre toda la información y encontrar lo que pretendemos gracias a las funciones HASH.

Partes del Lenguaje de Apache Hive.

Hasta este punto ya tenemos un amplio panorama sobre como funciona apache hive, así que creo conveniente saber como llamar a cada uno de los comandos ó queries que utilizamos anteriormente y el interprete de hive puede dividirse en 3 grandes partes, las operaciones SQL, DDL y DML.

SQL

Estas operaciones son las que cualquier persona con un acercamiento a cualquier RDBMS haya tenido, desde sentencias de select, insert, join etc.

DDL

Estas operaciones significa Data Definition Languaje, yo las definiría como todas las sentencias que tengan que ver con el metadato, algunos ejemplos serían los siguientes:

  • CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX
  • DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX
  • TRUNCATE TABLE
  • ALTER DATABASE/SCHEMA, TABLE, VIEW
  • MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS)
  • SHOW DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, VIEWS, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
  • DESCRIBE DATABASE/SCHEMA, table_name, view_name

DML

Por último tenemos Data Manipulation Languaje, yo las definiría como todas las sentencias que tengan que ver con la modificación de la data, algunos ejemplos serían los siguientes:

Algunos de los comandos anteriores como lo es el Update y el Delete son soportadas hasta la versión 0.14 de Apache Hive antes de esta estas operaciones no son funcionales.

Invocación Apache Hive

Por último a invocación me refiero a las formas en que se puede acceder a hive sin que sea de forma programada (código) y yo conozco dos de momento, una es mediante archivos con extensión hql y la otra es en consola, empezaré con la forma de la consola y para empezar echemosle un vistazo a los parámetros de el comando hive en nuestro sistema.


Como podemos ver este punto se enfocará en los parámetros -e y -f de hive y el que hace referencia a la consola es el parámetro -e, así que comencemos a explicar este caso.

Como su descripción dice se manda un SQL a través de la linea de comandos, ¿Qué quiere decir esto?, mostremos esto con un ejemplo.

Parámetro -e



Como podemos ver mande el comando de tipo DDL a través del comando parametro -e de hive, y lo que hace es que levanta una instancia del interprete de hive y ejecuta la sentencia inmediatamente adelante de el parámetro -e de hive que se encuentra entre comillas dobles devolviendo el resultado en consola de la sentencia.

Pero ustedes se preguntarán, ¿Ejecutara todo tipo de sentencia?, la respuesta es si y para mostrarlo ejecutaré una sentencia del tipo DML y SQL para mostrar esta afirmación.

La siguiente ejecución será del tipo SQL.



Como podemos ver el resultado de esa sentencia SQL nos es devuelta en la consola, por último probaré con una sentencia del tipo DML para finalizar con este ejemplo.


Parámetro -f

El parámetro -f tiene la misma funcionalidad del parámetro -e solo que esta vez las sentencias van en un archivo con extención hql, al igual que el parámetro -e el parámetro -f es capaz de interpretar los 3 tipos de sentencias DML,DDL y SQL, para demostrar esto crearé un archivo con extensión hql llamado pruebaHive.hql con las una sentencia de cada tipo el archivo luciría como el siguiente.

Como podemos ver la primera y segunda linea son del tipo DDL, la tercera linea es del tipo DML y la 4 es del tipo SQL, todo esto se guardará en un archivo con el nombre en el recuadro guinda.

Para ejecutarlo basta con poner el siguiente comando en la consola de nuestro clúster.

hive -f pruebaHive.hql

Cómo podemos ver en la imagen anterior es la salida de nuestro archivo hql el cuál cumplió con todos los comandos.

Una característica más es que puede recibir parámetros un archivo hql, como se mostrará en el siguiente ejemplo.

Para este ejemplo crearé un archivo llamado pruebaHiveParametros.hql el cuál contendrá una sentencia DDL, DML y SQL al menos como en el ejemplo anterior, el archivo debe lucir como el siguiente.

Como podemos notar recibirá 3 parámetros el cuál es el nombre de la Base de Datos (Espacio de Trabajo) el nombre de la Tabla y un valor a insertar en dicha tabla, una vez creado este archivo realizamos la prueba con la siguiente sentencia en la consola.

hive -S -hiveconf VAR1=pruebaHQLDB -hiveconf VAR2=paramsTable -hiveconf VAR3=UPIBI -f pruebaHiveParametros.hql

El parámetro -S sirve para que el archivo corra en modo de silencio, ¿Qué significa esto? que no imprima nada más que el resultado de todas las sentencias del archivo.

Cómo podemos notar solo nos imprimió el resultado de la sentencia de tipo SQL que fue el select.

Tipos de Archivos

Por último para terminar con este post sigue una de las partes fundamentales de todo los sistemas distribuidos, la información se puede representar de varias formas pero al final solo llega a una forma final binaria de 0 y 1 gracias a shannon, pero podemos representar la información de varias formas para hacer más rápido su procesamiento, eliminar la información redundante etc, aunque Apache Hive es el medio de almacenamiento más lento en todo el ecosistema de Big Data, en algo es más avanzado y es que el simple hecho de tratar de competir con Bases de Datos NoSQL la hace que este en constante progreso y con ella surgen varios tipo de almacenamiento, en esta parte explicaré sus ventajas de cada uno y no explicaré a detalle cada tipo, ya que lo haré más adelante.

Entre los tipo de archivos que soporta Hive tenemos los siguientes

Text File

Este es un archivo de texto tal cual como lo conocemos.

RCFile

Record Columnar File (RCFile) bueno, la forma de funcionar de este archivo es que un archivo se divide en 2 pasos, el primero es separa el archivo plano en bloques particionando el archivo de forma horizontal y después cada bloque se divide en forma vertical que es dividiendo por cada columna, entonces ahora contamos con un conjunto de fragmentos de información, ahora el poder de este formato es que al conjunto de todos los fragmentos de información los pasa a un par de forma de tal manera que cada par representa lo siguiente.


  • Key: Donde en el key se almacena todo el metadato de un fragmento de información.
  • Value: Es la data de este fragmento de información.
Cómo podemos ver este formato engloba lo mejor de los dos mundos, tanto de la forma columnar como las filas, para satisfacer 

Avro Files

Las filas avro son guardadas en formato json haciendo fácil su traslado y el compartirlo y acceder a el aparte es almacenado en el clúster de forma binaria lo que implica que el tamaño disminuye.

Sequence Files

Son filas en forma binaria por lo tanto son más compactas que los archivos planos, aparte esto da pie  a poder comprimir las filas o no.

ORC Files

Optimized Row Columnar (ORC) aunque los formatos de filas anteriores son muy eficientes y buenos, tienen sus limitaciones y gracias a esto surge este tipo de formato que esta desarrollado para cubrir todas las limitantes  de cada uno de los formatos anteriores.

Para la explicación de este formato les dejaré a liga que proporciona la información sobre este formato https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

Parquet 

Parquet fue creado también para optimizar el manejo de la información y aparte de su velocidad para leer la información y la escritura  esta comprimida la información por lo cuál el almacenamiento disminuye pueden encontrar más información de este formato y el proyecto parquet en la siguiente dirección https://parquet.apache.org/documentation/latest/

Custom INPUTFORMAT and OUTPUTFORMAT

Estos son formatos customizados por uno mismo, ya que nosotros podemos programar nuestras subrutinas para interpretarlos y agregarle estos módulos al núcleo de hive como veremos en el post de programación donde crearemos una UDF customizada.

Comentarios

Publicar un comentario

Entradas más populares de este blog

Replicación y Formas de Paralelización Apache Hadoop

Asignación de un líder Zookeeper