Introducción
Este laboratorio se centra en la configuración y las operaciones básicas de Hive. Está dirigido a estudiantes con conocimientos básicos de SQL y les ayudará a comprender la arquitectura, el despliegue básico y el uso de Hive.
Escriba usted mismo todo el código de ejemplo del documento; en la medida de lo posible, no se limite a copiarlo y pegarlo. Así se familiarizará mejor con el código. Si tiene algún problema, revise la documentación con atención o acuda al foro para pedir ayuda e intercambiar ideas.
Introducción a Hive
En este paso, aprenderá cómo Apache Hive ofrece una interfaz SQL para consultar y analizar grandes conjuntos de datos almacenados en Hadoop. A continuación se describen la arquitectura y las principales características de Hive:
Arquitectura de Hive
- Componentes: Hive incluye
HCatalog, que permite administrar tablas y almacenamiento, yWebHCat, que permite ejecutar tareas de MapReduce, consultas de Pig o interactuar con los metadatos de Hive mediante una API REST. - Características:
- Admite consultas SQL para tareas de almacenamiento de datos, como ETL, análisis de datos y generación de informes.
- Los datos se almacenan en sistemas como HDFS o HBase, y motores de procesamiento como Tez, Spark o MapReduce ejecutan las consultas.
- Admite lenguajes procedimentales, HPL-SQL y consultas de subconsultas, con el soporte de Hive LLAP, YARN y Slider.
Unidades de datos básicas de Hive
- Base de datos: espacio de nombres que evita conflictos entre nombres y mejora la seguridad.
- Tabla: unidad de datos homogénea que sigue un mismo esquema (por ejemplo, la tabla
page_views, con columnas comotimestamp,useridypage_url). - Partición: divide los datos en particiones según determinadas claves para recuperarlos con mayor eficiencia.
- Bucket: divide los datos particionados en buckets según los valores de una función hash para mejorar la eficiencia de las consultas.
Tipos de datos de Hive
- Admite tipos de datos primitivos y complejos. Consulte la documentación de tipos de datos de Hive para obtener más información.
Hive está diseñado para tareas de almacenamiento de datos, no para el procesamiento de transacciones en línea (OLTP). Se centra en la escalabilidad, el rendimiento, la fiabilidad y la tolerancia a fallos. Admite varios formatos de entrada y puede ampliarse mediante conectores para distintos formatos. Comprender la arquitectura, las unidades de datos y los tipos de datos de Hive es esencial para aprovechar sus capacidades en el análisis de big data.
Instalación y despliegue de Hive
En este paso, revisará la instalación y el despliegue de Hive, incluida la estructura de directorios, las variables de entorno, el metastore y los parámetros del sistema.
Primero, cambie al usuario hadoop para realizar las operaciones siguientes. Haga doble clic en el terminal de Xfce del escritorio y ejecute este comando:
su - hadoop
Nota: la contraseña del usuario hadoop es hadoop.
A continuación, use el comando wget para descargar una versión estable de Hive. En este laboratorio usaremos Hive 2.3.3:
sudo wget https://labexfile.oss-us-west-1.aliyuncs.com/courses/144/apache-hive-2.3.3-bin.tar.gz
Después, extraiga el paquete de instalación descargado. Ejecute este comando en el terminal:
tar -zxvf apache-hive-2.3.3-bin.tar.gz
Use los privilegios de sudo para mover el directorio extraído a /opt. Sin esos privilegios, es posible que no pueda escribir en /opt:
sudo mv /home/hadoop/apache-hive-2.3.3-bin /opt/hive-2.3.3
Después de mover el directorio, cambie su propietario y grupo al usuario hadoop. Ejecute este comando en el terminal:
sudo chown -R hadoop:hadoop /opt/hive-2.3.3
Nota: puede abrir otro terminal para realizar las operaciones anteriores con privilegios de sudo.
labex:~/ $ ls -al /opt/
total 24
drwxrwxr-x 10 hadoop hadoop 4096 Mar 3 12:01 hive-2.3.3
...
Configuración de las variables de entorno
En este paso, configurará las variables de entorno de Hive para que HIVE_HOME apunte al directorio de instalación.
Primero, abra con el editor vim el archivo .bashrc del usuario hadoop. Ejecute este comando en el terminal:
vim /home/hadoop/.bashrc
Añada el siguiente contenido al final del archivo. Ajuste PATH según el entorno de este laboratorio. La expresión $PATH conserva el contenido existente; añada :$HIVE_HOME/bin al final de la variable de entorno PATH:
export HIVE_HOME=/opt/hive-2.3.3
export PATH=$PATH:$HIVE_HOME/bin
Cuando termine de editar, guarde el archivo y salga del editor. Después, use el comando source para activar las variables de entorno indicadas.
En este laboratorio, Hive ya está instalado, así que no necesita ejecutar source para activar las variables de entorno. En una instalación real, este paso dependerá de cada caso.
Configuración
En este paso, revisará la configuración preinstalada de Hive y creará los archivos de configuración necesarios para las comprobaciones.
Configuración del metastore
Antes de usar Hive, debe configurar su almacén de metadatos. De forma predeterminada, Hive guarda los metadatos en una base de datos Derby integrada. La ubicación de almacenamiento en disco se define mediante el parámetro javax.jdo.option.ConnectionURL del archivo de configuración de Hive conf/hive-default.xml. De forma predeterminada, esta ubicación es ./metastore_db.
En este laboratorio usaremos MySQL para almacenar los metadatos. Por lo tanto, debe modificar la configuración de Hive.
Cree y abra con el editor vim el archivo de configuración que vamos a preparar:
vim /opt/hive-2.3.3/conf/hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive_metastore1?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hiveuser1</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123qweQWE...</value>
</property>
</configuration>
Después de editar los parámetros de configuración, guarde el archivo y salga del editor.
Creación de la base de datos de MySQL
Inicie el servidor de MySQL con sudo mysql y cree la base de datos hive_metastore:
CREATE DATABASE hive_metastore1;
CREATE USER 'hiveuser1'@'localhost' IDENTIFIED BY '123qweQWE...';
GRANT ALL PRIVILEGES ON hive_metastore1.* TO 'hiveuser1'@'localhost';
FLUSH PRIVILEGES;
exit;
A continuación, descargue el controlador JDBC de MySQL y cópielo en el directorio /opt/hive-2.3.3/lib:
cp /usr/local/hive/lib/mysql-connector-j-8.3.0.jar /opt/hive-2.3.3/lib
Configuración de los parámetros del sistema de Hive
Después de configurar el metastore, debe establecer los parámetros internos de Hive para indicar la ubicación de Hadoop, la ruta de los archivos de configuración internos y otros datos.
Primero, use el comando cp para copiar la plantilla de configuración y permitir que Hive la utilice.
Ejecute este comando en el terminal:
cp /opt/hive-2.3.3/conf/hive-env.sh.template /opt/hive-2.3.3/conf/hive-env.sh
A continuación, abra el archivo hive-env.sh con el editor vim:
vim /opt/hive-2.3.3/conf/hive-env.sh
En la línea 48, establezca HADOOP_HOME con la ruta de instalación de Hadoop:
HADOOP_HOME=/home/hadoop/hadoop
Después de editar los parámetros de configuración, guarde el archivo y salga del editor.
Inicialización del metastore
En este paso, inicializará el metastore de Hive e iniciará los servicios de Hadoop que Hive necesita.
Como los datos que usará más adelante se almacenarán en HDFS, debe iniciar HDFS de antemano. Ejecute estos comandos en el terminal para iniciar HDFS:
start-dfs.sh
start-yarn.sh
Escriba jps para consultar el estado de los servicios:
hadoop:~/ $ jps [17:31:43]
8960 Jps
3153 NodeManager
2823 SecondaryNameNode
3017 ResourceManager
2570 DataNode
2428 NameNode
Si es la primera vez que usa Hadoop, debe eliminar los datos de Hadoop e inicializarlo con hdfs namenode -format.
En este laboratorio, Hive ya está inicializado con la base de datos preinstalada. Si quiere inicializar la instalación de Hive que acaba de descargar, ejecute este comando:
/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed
Si inicializa por primera vez la instalación de Hive que acaba de descargar, cambie la ruta de HIVE_HOME en ~/.bashrc para que apunte a esa instalación y ejecute source. Sin embargo, le recomendamos que no lo haga, porque las pruebas posteriores de Hive se basan en la instalación preconfigurada.
Cuando el mensaje indique que la inicialización ha terminado, use el comando hive para abrir la línea de comandos de Hive. Ejecute este comando en el terminal:
hive
Nota: si escribe hive directamente, accederá al shell de Hive preinstalado. Para entrar en el shell de Hive que acaba de configurar, use la ruta absoluta.
Hive Session ID = 3eee2693-175d-4452-82d2-47f1b639d9d5
Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = 68d0d345-92c3-4eb1-8393-7ee34f56363f
hive>
Operaciones básicas de Hive
En este paso, aprenderá a realizar operaciones básicas con tablas de Hive. También puede consultar todas las instrucciones de Hive en su manual del lenguaje.
Creación de una tabla
Primero, necesita algunos datos. En esta parte del laboratorio usaremos un archivo de registro que simula el de un servidor NginX y permite analizar las visitas a las páginas de un sitio web.
Vuelva a abrir un terminal y ejecute estos comandos para descargar los datos de ejemplo:
su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv
A continuación, cargue el archivo en HDFS:
hdfs dfs -mkdir -p /user/data/staging/page_view
hdfs dfs -put /home/hadoop/log_example.csv /user/data/staging/page_view
Una vez que tenga los datos, cree una tabla. Para crear la tabla page_view con los datos anteriores, ejecute esta instrucción en la línea de comandos de Hive:
CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;
En este ejemplo, cada columna tiene asignado un tipo de datos apropiado. También se pueden añadir comentarios a nivel de columna y de tabla. Además, la cláusula PARTITIONED BY define columnas de partición distintas de las columnas de datos. Las columnas de partición no se almacenan junto con las columnas de datos. Cuando se especifican columnas de partición de esta forma, se utiliza un carácter de nueva línea como separador entre filas.
Si los datos no tienen el formato anterior, puede especificar el separador de campos, como se muestra en este ejemplo:
La siguiente instrucción es solo una demostración. No la ejecute en el shell de hive.
CREATE TABLE page_view1(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
STORED AS SEQUENCEFILE;
Como el separador de filas lo determina el separador del sistema Hadoop y no Hive, no se puede cambiar manualmente.
Por lo general, los datos de las columnas de una tabla se almacenan en buckets, lo que permite realizar consultas de muestreo de conjuntos de datos con mayor eficiencia. Sin buckets, aunque se pueda muestrear una tabla al azar, el muestreo no será eficiente durante el escaneo de todos los datos. El siguiente ejemplo muestra cómo habilitar el almacenamiento en buckets para la tabla page_view, usando la columna userid.
La siguiente instrucción es solo una demostración. No la ejecute en el shell de hive.
CREATE TABLE page_view2(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;
En el ejemplo anterior, una función hash distribuye los valores de la columna userid en 32 buckets. Dentro de cada bucket, los datos se ordenan de forma ascendente según viewTime. Esta organización permite muestrear de forma eficiente las columnas agrupadas, en este caso userid. La ordenación también permite a los administradores de datos evaluar las consultas con mayor eficiencia gracias a una mejor estructura de los datos.
La siguiente instrucción es solo una demostración. No la ejecute en el shell de hive.
CREATE TABLE page_view3(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Friends ARRAY<BIGINT>, properties MAP<STRING, STRING>,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;
En el ejemplo anterior, el formato de cada fila de la tabla se define mediante los nombres y tipos de los campos, de forma similar a las definiciones de tipos de otros lenguajes de programación. Tenga en cuenta que los nombres de las tablas y las columnas no distinguen entre mayúsculas y minúsculas. IP Address of the User y la instrucción COMMENT que aparece más abajo indican que se pueden añadir comentarios tanto a las columnas como a las tablas. Además, la cláusula PARTITIONED BY define columnas de partición distintas de las columnas de datos. Como se ha indicado antes, estas columnas no almacenan los datos. La cláusula CLUSTERED BY especifica qué columna se usa para crear los buckets y cuántos se crean. La cláusula ROW FORMAT DELIMITED especifica cómo se almacenan las filas de una tabla de Hive. En los formatos delimitados, esta instrucción define el separador de campos, el separador de los elementos de una colección (array o mapa) y el separador de las claves de un mapa. Los números se expresan mediante codificación ASCII. STORED AS SEQUENCEFILE indica que los datos se almacenan en HDFS en formato binario, concretamente como archivos SequenceFile de Hadoop. En este caso, los valores de las cláusulas ROW FORMAT y STORED AS son los valores predeterminados que utiliza Hive. Por eso no los especificamos en la instrucción inicial de creación de la tabla.
Consulta de tablas y particiones
Para mostrar las tablas existentes en el almacén de datos, use esta instrucción:
SHOW TABLES;
Si hay muchas tablas, la instrucción anterior devolverá muchos resultados. Puede limitar la búsqueda especificando un prefijo. Por ejemplo, para mostrar las tablas cuyo nombre comienza por page, use esta instrucción:
SHOW TABLES 'page.*';
Esta instrucción utiliza las mismas reglas de coincidencia que las expresiones regulares. El punto (.) representa un comodín.
Para mostrar las particiones de una tabla, use la siguiente instrucción. Si la tabla no está particionada, no se devolverá ningún resultado:
SHOW PARTITIONS page_view;
Para mostrar las columnas de una tabla y sus tipos, use la instrucción DESCRIBE:
DESCRIBE page_view;
Para mostrar las columnas y las demás propiedades de la tabla, añada la palabra clave EXTENDED. Esta instrucción imprime mucha información y suele usarse para depurar:
DESCRIBE EXTENDED page_view;
Modificación de una tabla
Para cambiar el nombre de una tabla existente, use ALTER TABLE con RENAME TO. Si ya existe una tabla con el nuevo nombre, se devolverá un error. Las siguientes instrucciones son solo ejemplos; no las ejecute, porque en el paso siguiente usará la tabla page_view que creó:
ALTER TABLE page_view RENAME TO new_page_view;
Consulte el resultado:
hive> ALTER TABLE page_view RENAME TO new_page_view;
OK
Time taken: 0.124 seconds
hive> show tables;
OK
new_page_view
...
Time taken: 0.021 seconds, Fetched: 4 row(s)
También puede cambiar el nombre de las columnas de una tabla existente. Sin embargo, debe mantener el mismo tipo de columna e incluir un registro en cada una de las columnas existentes:
ALTER TABLE new_page_view REPLACE COLUMNS (viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ipaddr STRING COMMENT 'IP Address of the User');
También puede añadir nuevas columnas a una tabla existente:
ALTER TABLE new_page_view ADD COLUMNS (new_column INT COMMENT 'a new int column');
Tenga en cuenta que los cambios del esquema, como añadir una columna, conservan el esquema de las particiones antiguas de la tabla. Así se evita que la tabla se convierta en una tabla particionada. Las consultas que accedan a estas columnas en las particiones antiguas devolverán implícitamente valores nulos o los valores predeterminados especificados.
Eliminación de tablas y particiones
Hive está diseñado como un almacén de datos, por lo que la eliminación de datos se trata siempre con cautela. Por eso, eliminar una tabla puede resultar algo engorroso. Al usar el comando DROP en una tabla, también se eliminan implícitamente los índices creados para ella.
El siguiente ejemplo elimina una tabla. No lo ejecute en este laboratorio:
DROP TABLE new_page_view;
Carga y consulta de datos
En este paso, cargará datos preparados en una tabla particionada de Hive y consultará el resultado.
Carga de datos
Hay varias formas de cargar datos en una tabla de Hive. Puede crear tablas externas que apunten a ubicaciones específicas de HDFS. En este caso, puede usar los comandos put o copy de HDFS para copiar el archivo de datos a la ubicación indicada y crear una tabla que apunte a ella. La tabla contendrá toda la información pertinente sobre el formato de las filas.
Una vez creada la tabla externa, puede transformar los datos e insertarlos en cualquier otra tabla de Hive. Al principio, cargamos el archivo log_example.csv en HDFS y le cambiamos el nombre a page_view. Para cargarlo en la partición correspondiente de la tabla page_view, use el siguiente procedimiento.
Primero, cree una tabla externa y asóciela con el archivo indicado:
CREATE EXTERNAL TABLE page_view_stg(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User',
Country STRING COMMENT 'country of origin')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '\n' STORED AS TEXTFILE
LOCATION '/user/data/staging/page_view';
A continuación, cree la tabla page_view, donde se almacenarán los datos finales:
CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;
Este pequeño conjunto de datos de práctica no necesita un trabajo distribuido de YARN. Configure el ejecutor local de trabajos de Hadoop para esta sesión de Hive; así, la inserción se ejecutará de forma fiable en la máquina virtual del laboratorio:
SET mapreduce.framework.name=local;
Por último, inserte los datos de la tabla externa en la tabla page_view:
FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view
PARTITION(dt='2015-05-17', country='us')
SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, pvs.ip
WHERE pvs.country = 'us';
El trabajo local debería terminar en unos segundos y cargar en la partición page_view las filas que coincidan.
...
Loading data to table default.page_view partition (dt=2015-05-17, country=us)
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: ... HDFS Write: ... SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
Time taken: ... seconds
Consulta sencilla
Después de insertar los datos, puede ejecutar una consulta sencilla, similar a una instrucción SQL habitual. Escriba esta instrucción en la interfaz de línea de comandos de Hive:
SELECT * FROM page_view WHERE userid = 0 LIMIT 10;
La información devuelta corresponde a los registros consultados:
hive> select * from page_view;
OK
NULL 490 /downloads/product_1 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 490 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 3316 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
...
Detener los servicios
En este paso, saldrá de Hive y detendrá los servicios de Hadoop. También puede consultar estos recursos para seguir aprendiendo:
Cuando termine de usar Hive, ejecute el comando quit para salir de su interfaz de línea de comandos:
quit;
No olvide detener también el servicio HDFS. Ejecute estos comandos en el terminal:
stop-yarn.sh
stop-dfs.sh
Resumen
En esta sesión se presentan la arquitectura, la instalación y el despliegue de Hive, así como las instrucciones básicas de HQL. También aprenderá a importar datos de ejemplo.
Los principales temas tratados son:
- Arquitectura de Hive
- Unidades de datos básicas de Hive
- Despliegue de Hive
- Lenguaje HQL de Hive
En general, Hive es un paquete de software para almacenes de datos cuyas funciones se pueden explorar más a fondo. Mantenga el hábito de consultar activamente los materiales técnicos y continúe aprendiendo con los siguientes cursos.



