Introducción
Este laboratorio se centra en la configuración y las operaciones básicas de Hive. Está diseñado para estudiantes con cierta base de SQL que quieran comprender la arquitectura, la implementación básica y el uso de Hive.
Introduzca usted mismo todo el código de ejemplo del documento; evite copiarlo y pegarlo siempre que sea posible. Así se familiarizará mejor con el código. Si tiene algún problema, revise detenidamente la documentación o visite el foro para pedir ayuda e intercambiar información.
Introducción a Hive
En este paso aprenderá cómo Apache Hive proporciona una interfaz SQL para consultar y analizar grandes conjuntos de datos almacenados en Hadoop. A continuación se ofrece una descripción general de la arquitectura y las funciones principales de Hive:
Arquitectura de Hive
- Componentes: Hive incluye
HCatalogpara administrar tablas y almacenamiento, yWebHCatpara ejecutar tareas de MapReduce, consultas de Pig o interactuar con los metadatos de Hive mediante una API REST. - Funciones:
- 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 las operaciones de consulta se ejecutan mediante motores de cálculo como Tez, Spark o MapReduce.
- Admite lenguajes procedurales, HPL-SQL y la recuperación mediante subconsultas con compatibilidad para Hive LLAP, YARN y Slider.
Unidades de datos básicas de Hive
- Base de datos: espacio de nombres que evita conflictos de nombres y mejora la seguridad.
- Tabla: unidad de datos homogénea con el mismo esquema, como la tabla
page_views, que puede incluir columnas como timestamp, userid y page_url. - Partición: divide los datos en particiones según claves para recuperarlos de forma eficiente.
- 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 sobre 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 errores. Admite diversos formatos de entrada y puede ampliarse mediante conectores en 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 e implementación de Hive
En este paso revisará la instalación y la implementación de Hive, incluida su estructura de directorios, las variables de entorno, el metastore y los parámetros del sistema.
Primero debe cambiar al usuario hadoop para realizar las operaciones siguientes. Haga doble clic en la terminal de Xfce del escritorio e introduzca estos comandos:
su - hadoop
Consejo: la contraseña del usuario hadoop es hadoop.
A continuación, use el comando wget para descargar la versión estable más reciente de Hive. En este laboratorio se ha elegido la versión 2.3.3 de Hive:
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. Introduzca el siguiente comando en la terminal:
tar -zxvf apache-hive-2.3.3-bin.tar.gz
Use privilegios de sudo para mover el directorio extraído al directorio /opt. Si no usa privilegios de sudo, 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. Introduzca el siguiente comando en la terminal:
sudo chown -R hadoop:hadoop /opt/hive-2.3.3
Consejo: puede abrir otra 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 a su directorio de instalación.
Primero, abra el archivo .bashrc del usuario hadoop con el editor vim. Introduzca el siguiente comando en la terminal:
vim /home/hadoop/.bashrc
Añada el contenido siguiente al final del archivo. Debe modificar PATH según la situación concreta del entorno del laboratorio. La expresión $PATH hace referencia al contenido existente. Añada :$HIVE_HOME/bin directamente 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 el archivo, guárdelo y salga del editor. Después, use el comando source para activar las variables de entorno anteriores.
En este laboratorio, Hive ya está preinstalado, por lo que no necesita ejecutar source para activar la variable de entorno. En una instalación real, este paso se realiza según corresponda.
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 utilizar Hive oficialmente, debe configurar su almacén de metadatos. De forma predeterminada, Hive almacena la información de metadatos en una base de datos Derby integrada. La ubicación de almacenamiento en el disco la determina el elemento de configuración javax.jdo.option.ConnectionURL del archivo de configuración conf/hive-default.xml. De forma predeterminada, esta ubicación es ./metastore_db.
Sin embargo, en este laboratorio usaremos MySQL para almacenar los metadatos. Por lo tanto, debe modificar el archivo de 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 elementos de configuración anteriores, guarde el archivo y salga del editor.
Crear 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;
Después, 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 elementos de configuración internos de Hive para identificar la ubicación de Hadoop, la ruta de los archivos de configuración internos, etc.
Lo primero que debe hacer es usar el comando cp para crear una copia de la plantilla de configuración y activarla.
Introduzca el siguiente comando en la terminal:
cp /opt/hive-2.3.3/conf/hive-env.sh.template /opt/hive-2.3.3/conf/hive-env.sh
Después, 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 en la ruta de instalación de Hadoop:
HADOOP_HOME=/home/hadoop/hadoop
Después de editar los elementos de configuración anteriores, 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 utilizará más adelante se almacenarán en HDFS, debe iniciar HDFS previamente. Introduzca los siguientes comandos en la 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 usa Hadoop por primera vez, debe eliminar los datos de Hadoop e inicializarlo con hdfs namenode -format.
En este laboratorio, Hive ya está preinicializado con la base de datos correspondiente. Si quiere inicializar el Hive que acaba de descargar, use el comando siguiente:
/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed
Si inicializa por primera vez el Hive que acaba de descargar, tendrá que cambiar en ~/.bashrc la ruta de HIVE_HOME por la ruta del Hive que acaba de instalar y ejecutar source. Sin embargo, le recomendamos no hacerlo, porque las comprobaciones posteriores de Hive se basan en el Hive preinstalado.
Cuando el mensaje del prompt indique que la inicialización ha terminado, puede usar el comando hive para entrar en su línea de comandos. Introduzca el siguiente comando en la terminal:
hive
Consejo: al escribir hive directamente, entrará en el shell de Hive preinstalado. Añada la ruta absoluta para entrar en el shell de Hive que acaba de configurar.
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á las operaciones básicas con tablas de Hive. También puede consultar todas las instrucciones de Hive en su manual de lenguaje.
Crear una tabla
Primero necesita obtener algunos datos. Los datos usados en esta sección del laboratorio son principalmente un archivo de registro que simula un servidor NginX y que puede utilizarse para analizar las visitas a las páginas del sitio web.
Abra otra terminal e introduzca los siguientes comandos para descargar los datos de ejemplo:
su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv
Después, 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 disponibles los datos, lo primero es crear la tabla. Para crear una tabla page_view con los datos anteriores, introduzca la siguiente 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 de la tabla tiene asignado un tipo adecuado. También puede añadir comentarios en el nivel de columna y de tabla. Además, la cláusula PARTITIONED BY define una columna de partición distinta de las columnas de datos. La columna de partición no se almacena junto con las columnas de datos. Cuando especifica una columna de partición de esta forma, se usa un carácter de nueva línea como separador de cada fila.
Si los datos no tienen el formato anterior, puede parametrizar el separador de campos como se muestra en el ejemplo siguiente:
La siguiente instrucción solo sirve como demostración y no debe introducirse 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 líneas lo determina el separador del sistema Hadoop y no Hive, no podemos cambiarlo manualmente.
Normalmente, la tabla cuyos datos de columnas están determinados se almacena en buckets, lo que facilita el muestreo eficiente de las consultas del conjunto de datos. Sin buckets, aunque se pueda completar el muestreo aleatorio de la tabla, no se consigue un muestreo eficiente durante el escaneo de todos los datos. El ejemplo siguiente muestra cómo habilitar el almacenamiento en buckets para la tabla page_view usando la columna userid.
La siguiente instrucción solo sirve como demostración y no debe introducirse 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, la columna userid de la tabla se agrupa en 32 buckets mediante una función hash. Dentro de cada bucket, los datos se ordenan de forma ascendente por viewTime. Esta forma de organizar los datos permite muestrear eficazmente las columnas agrupadas —en este caso, la columna userid— y la ordenación permite a los administradores de datos evaluar las consultas de forma más eficiente mediante estructuras de datos mejor organizadas.
La siguiente instrucción solo sirve como demostración y no debe introducirse 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 nombres y tipos de 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 de las columnas no distinguen entre mayúsculas y minúsculas. IP Address of the User y la instrucción COMMENT indican que puede añadir comentarios tanto en el nivel de columna como en el de tabla. Además, la cláusula PARTITIONED BY define columnas de partición distintas de las columnas de datos. Como se ha mencionado, en realidad no almacenan los datos. La cláusula CLUSTERED BY especifica qué columna se usará y cuántos buckets se crearán. La cláusula ROW FORMAT DELIMITED especifica cómo se almacenan las filas en una tabla de Hive. En los formatos delimitados, esta instrucción especifica el símbolo de terminación de un campo, el símbolo de terminación de un elemento de una colección —una matriz o un mapa— y el símbolo de terminación de una clave de mapa; los números están expresados mediante codificación ASCII. STORED AS SEQUENCEFILE indica que los datos se almacenan en HDFS en formato binario, concretamente como un tipo SequenceFile de Hadoop. En este caso, la configuración de las cláusulas ROW FORMAT y STORED AS coincide con los valores predeterminados que Hive usa actualmente. Por eso no los escribimos explícitamente en la instrucción que creó la tabla al principio.
Consultar tablas y particiones
Para mostrar las tablas existentes en el almacén, use la siguiente instrucción:
SHOW TABLES;
Si hay muchas tablas, la instrucción anterior devolverá mucha información. Puede limitar los resultados especificando un prefijo. Por ejemplo, para mostrar las tablas cuyo prefijo sea page, use la siguiente instrucción:
SHOW TABLES 'page.*';
Las reglas de coincidencia de esta instrucción son las mismas que las de la sintaxis de las expresiones regulares, y 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á ninguna información:
SHOW PARTITIONS page_view;
Para mostrar las columnas y sus tipos de una tabla, use la instrucción DESCRIBE:
DESCRIBE page_view;
Para mostrar las columnas de la tabla y todas las demás propiedades, añada la palabra clave EXTENDED. Esto imprimirá mucha información y normalmente se usa para depurar:
DESCRIBE EXTENDED page_view;
Modificar una tabla
Para cambiar el nombre de una tabla existente, use la instrucción 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 el paso siguiente utiliza 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, es importante tener en cuenta que debe usar 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');
Además, puede añadir columnas nuevas 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, conservarán el esquema de la partición antigua de la tabla para evitar que se convierta en una tabla particionada. Todas las consultas que accedan a estas columnas y se ejecuten sobre la partición antigua devolverán implícitamente valores nulos o los valores predeterminados especificados para esas columnas.
Eliminar tablas y particiones
Como Hive está diseñado para funcionar como un almacén de datos, la destrucción de datos siempre es una operación negativa. Por eso, eliminar una tabla resulta algo más complejo. El uso del comando DROP sobre una tabla también elimina implícitamente los índices creados en ella.
El ejemplo siguiente elimina una tabla. No lo ejecute en este laboratorio:
DROP TABLE new_page_view;
Cargar y consultar datos
En este paso cargará datos preparados en una tabla particionada de Hive y consultará el resultado.
Cargar 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 el comando put o copy de HDFS para copiar el archivo de datos en la ubicación especificada y crear una tabla que apunte a esa ubicación. Esta tabla contendrá toda la información relevante del formato de línea.
Una vez creada, puede transformar los datos e insertarlos en cualquier otra tabla de Hive. Al principio cargamos el archivo log_example.csv en HDFS y lo asociamos con page_view. Para cargarlo en la tabla page_view de la partición correspondiente, use el comando siguiente.
Primero, cree una tabla externa y asóciela con el archivo especificado:
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';
Después, cree una tabla page_view para almacenar definitivamente los datos:
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 de trabajos local de Hadoop para esta sesión de Hive, de modo que la inserción se ejecute correctamente dentro de 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 finalizar en unos segundos y cargar las filas coincidentes en la partición de page_view.
...
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 realizar una consulta sencilla. Es similar a una instrucción SQL habitual. Introduzca la siguiente 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 después de consultar los siguientes recursos para continuar aprendiendo:
- Interfaz de línea de comandos de Hive
- Lenguaje de definición de datos de Hive
- Lenguaje de manipulación de datos de Hive
Cuando termine de usarlo, puede utilizar el comando quit para salir de la interfaz de línea de comandos de Hive:
quit;
Por supuesto, no olvide detener el servicio de HDFS. Introduzca el siguiente comando en la terminal:
stop-yarn.sh
stop-dfs.sh
Resumen
En esta sesión se presentan la arquitectura, la instalación y la implementación de Hive, así como las instrucciones básicas de HQL. También hemos aprendido a importar datos mediante el conjunto de datos de ejemplo.
Los puntos principales son:
- Arquitectura de Hive
- Unidad de datos básica de Hive
- Cómo implementar Hive
- Lenguaje HQL de Hive
En general, como paquete de software para almacenes de datos, las funciones de Hive requieren una exploración más profunda. Mantenga el hábito de revisar activamente los materiales técnicos y continúe con los cursos siguientes.



