Introducción a Hive

 

qué es Hive


Apache Hive es un software que forma parte del ecosistema de Hadoop. Es utilizado para gestionar enormes datasets almacenados bajo el HDFS de Hadoop y realizar consultas (queries) sobre los mismos.

Para esto, Hive implementa una variante al SQL, llamada HQL (Hive QL). Esta variante no soporta la especificación SQL-92 completa, pero sí una gran parte. Realmente, cuando se ejecutan consultas HQL, Hive convierte la consulta HQL a un trabajo MapReduce que es ejecutado para obtener los datos. La finalidad de esto es permitir a usuarios que no cuenten con experiencia en programación de algoritmos MapReduce (que suelen ser bastante laboriosos), pero que sí cuenten con conocimientos de SQL, poder consultar datos.

Un punto a favor de Hive es que trabajar con este es similar a trabajar con bases de datos tradicionales. Desde Hive debemos estructurar los datos agrupándolos en tablas, con sus columnas y tipos de datos asociados. Pintar en estas tablas los datos, luego procesarlos y finalmente analizarlos. No obstante, no hay que olvidar que Hive no es un motor de bases de datos.

El inconveniente que presenta Hive es que, al necesitar procesar la consulta y traducirla a lenguaje Java para crear el MapReduce, la latencia de respuesta es alta. A su vez, como mencionamos, tampoco soporta todo el lenguaje SQL, transacciones ni índices.

Para poder empezar a trabajar con Hive debemos, primero que nada, instalarlo. En este post veremos como hacer esto, y en futuros post comenzaremos aprender sobre otros temas como lenguaje HQL, tipos de datos, funciones predefinidas (built-in) y definidas por el usuario (UDF), etc.

 

Instalación


Instalación Hadoop

Lo primero es tener instalado y corriendo Hadoop en nuestro equipo. Caso contrario, pueden seguir este otro tutorial donde explicar como hacer esto:

 

Instalación Hive

Hecho esto, debemos bajar el instalador de Hive desde su web. Una vez descargado, lo descomprimimos y movemos a la carpeta ‘/usr/local/hive/’:

sudo mv apache-hive-2.1.0-bin /usr/local/hive

Nos aseguramos que el owner de la carpeta y sus contenidos sea el usuario Hadoop:

hadoop@ubuntu:/usr/local$ ls -l /usr/local/hive/
total 140
drwxrwxr-x 3 hadoop mauricio  4096 Nov  5 00:34 bin
drwxrwxr-x 2 hadoop mauricio  4096 Nov  5 12:20 conf
-rw-r--r-- 1 hadoop root         0 Nov  4 23:52 derby.log
drwxrwxr-x 4 hadoop mauricio  4096 Oct 11 02:59 examples
drwxrwxr-x 7 hadoop mauricio  4096 Oct 11 02:59 hcatalog
drwxr-xr-x 3 hadoop root      4096 Nov  5 12:22 iotmp
drwxrwxr-x 2 hadoop mauricio  4096 Oct 11 02:59 jdbc
drwxrwxr-x 4 hadoop mauricio 12288 Nov  5 11:48 lib
-rw-r--r-- 1 hadoop mauricio 29003 Jun  3 07:43 LICENSE
-rw-r--r-- 1 hadoop mauricio   513 Jun  3 07:43 NOTICE
-rw-r--r-- 1 hadoop mauricio  4122 Jun  3 07:43 README.txt
-rw-r--r-- 1 hadoop mauricio 50294 Jun 16 20:43 RELEASE_NOTES.txt
drwxrwxr-x 4 hadoop mauricio  4096 Oct 11 02:59 scripts
drwxr-xr-x 3 hadoop root      4096 Nov  4 23:52 ${system:java.io.tmpdir}

o en caso contrario, cambiamos esto con:

sudo chown -R hadoop /usr/local/hive/

Finalmente, agregamos al archivo ~/.bashrc del usuarios Hadoop las siguientes variables de entorno:

# HIVE
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:/usr/local/Hadoop/lib/*:.
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.

Recordar que cada vez que modificamos el archivos .bashrc debemos actualizar las variables de entorno del sistema con source ~/.bashrc.

Configuración

Ahora debemos configurar una base de datos que utilizará Hive para guardar sus metadatos. Por defecto se utilizar una llamada Derby, pero que solo es apto para entornos de testing. Nosotros instalaremos y configuraremos esta base en MySQL. Entonces, lo primero es instalar MySQL:

sudo apt-get install mysql-server libmysql-java

y creamos el siguiente enlace simbólico:

ln -s /usr/share/java/mysql-connector-java.jar $HIVE_HOME/lib/mysql-connector-java.jar

Ahora nos logueamos en MySQL y creamos una base de datos donde se almacenaran los metadatos que genere Hive. Luego de crear la base de datos, debemos rellenarla con el esquema que se correspondiente que se encuentra en ‘$HIVE_HOME/scripts/metastore/upgrade/mysql/’:

$ mysql -u root -p

mysql> CREATE DATABASE metastore;
mysql> USE metastore;
mysql> SOURCE /usr/local/hive/scripts/metastore/upgrade/mysql/hive-schema-0.14.0.mysql.sql;

y le creamos un usuarios a Hive para que pueda acceder a la base de datos:

mysql> CREATE USER 'hiveuser'@'%' IDENTIFIED BY 'hivepass'; 
mysql> GRANT all on *.* to 'hiveuser'@localhost identified by 'hivepass';
mysql> flush privileges;

Ahora debemos incluir en el archivo /usr/local/hive/conf/hive-site.xml las siguientes lineas que indican a Hive como conectarse con la base de datos:

 <property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value>
   <description>metadata is stored in a MySQL server</description>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionDriverName</name>
   <value>com.mysql.jdbc.Driver</value>
   <description>MySQL JDBC driver class</description>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionUserName</name>
   <value>hiveuser</value>
   <description>user name for connecting to mysql server</description>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionPassword</name>
   <value>hivepass</value>
   <description>password for connecting to mysql server</description>
 </property>

Y ya estamos listos. Con esto deberíamos poder iniciar iniciar Hive… bueno, casi. Cuando he intentado ingresar a Hive me ha salido un error de permisos de escritura que he solucionado (googleando) añadiendo las siguientes lineas al archivos mismo archivo:

<property>
  <name>hive.querylog.location</name>
  <value> /usr/local/hive/iotmp</value>
  <description>Location of Hive run time structured log file</description>
</property>
<property>
  <name>hive.exec.local.scratchdir</name>
  <value>/usr/local/hive/iotmp</value>
  <description>Local scratch space for Hive jobs</description>
</property>
<property>
  <name>hive.downloaded.resources.dir</name>
  <value>/usr/local/hive/iotmp</value>
  <description>Temporary local directory for added resources in the remote file system.</description>
</property>

 

Testing

Vamos a comprobar ahora que la instalación se haya realizado correctamente.

Primero revisamos si Hive responder. Para esto ingresamos hive –version:

$ hive --version
Hive 2.1.0
Subversion git://jcamachguezrMBP/Users/jcamachorodriguez/src/workspaces/hive/HIVE-release2/hive -r 9265bc24d75ac945bde9ce1a0999fddd8f2aae29
Compiled by jcamachorodriguez on Fri Jun 17 01:03:25 BST 2016
From source with checksum 1f896b8fae57fbd29b047d6d67b75f3c

y ahora creamos una base de datos (realmente no es una base de datos lo que estamos creando, pero la podemos tratar como tal):

$ hive

...

hive> create table mauricio_test(id int, name string);
OK
Time taken: 2.424 seconds

Vamos a ver que tenemos en la base de datos de MySQL que creamos previamente:

$ mysql -u root -p

mysql> use metastore;
mysql> select * from TBLS;
+--------+-------------+-------+------------------+--------+-----------+-------+---------------+---------------+--------------------+--------------------+----------------+
| TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER  | RETENTION | SD_ID | TBL_NAME      | TBL_TYPE      | VIEW_EXPANDED_TEXT | VIEW_ORIGINAL_TEXT | LINK_TARGET_ID |
+--------+-------------+-------+------------------+--------+-----------+-------+---------------+---------------+--------------------+--------------------+----------------+
|      1 |  1478359381 |     1 |                0 | hadoop |         0 |     1 | hive          | MANAGED_TABLE | NULL               | NULL               |           NULL |
|      6 |  1478371335 |     1 |                0 | hadoop |         0 |     6 | mauricio_test | MANAGED_TABLE | NULL               | NULL               |           NULL |
+--------+-------------+-------+------------------+--------+-----------+-------+---------------+---------------+--------------------+--------------------+----------------+
2 rows in set (0.00 sec)

 

Listo! Ya tenemos preparado nuestro equipo para trabajar con Hadoop utilizando Hive.

 

Comentarios

0 Comments

Submit a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.