Introducción rápida a Hive

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica se centra en la configuración y las operaciones básicas de Hive, y está diseñada para que los estudiantes con un cierto conocimiento de SQL comprendan la arquitectura, la implementación básica y el uso de Hive.

Ingrese todo el código de ejemplo del documento por su cuenta; no solo copie y pegue el código, si es posible. Solo de esta manera podrá familiarizarse mejor con el código. Si tiene problemas, revise detenidamente la documentación o puede ir al foro para obtener ayuda y comunicarse.

Introducción a Hive

Apache Hive es un paquete de software de almacén de datos construido sobre Hadoop para consultar y analizar grandes conjuntos de datos utilizando consultas similares a SQL. Simplifica la agregación de datos, las consultas ad hoc y el análisis de datos masivos al proporcionar una interfaz SQL familiar para los usuarios. A continuación, se presenta una panorámica de la arquitectura y las características principales de Hive:

Arquitectura de Hive

  • Componentes: Hive consta de HCatalog para la gestión de tablas y almacenamiento y WebHCat para ejecutar tareas MapReduce, consultas Pig o interactuar con los metadatos de Hive a través de la API REST.
  • Características:
    • Admite consultas SQL para tareas de almacén de datos como ETL, análisis de datos y reportes.
    • Los datos se almacenan en sistemas de almacenamiento como HDFS o HBase; las operaciones de consulta se ejecutan por motores de cálculo como Tez, Spark o MapReduce.
    • Admite lenguajes procedimentales, HPL-SQL y la recuperación de subconsultas con el soporte de Hive LLAP, YARN y Slider.

Unidades de datos básicas en Hive

  • Base de datos: Espacio de nombres para evitar conflictos de nombres y mejorar la seguridad.
  • Tabla: Unidades de datos homogéneas con el mismo esquema (por ejemplo, la tabla page_views con columnas como timestamp, userid, page_url).
  • Partición: Divide los datos en particiones basadas en claves para una recuperación eficiente de datos.
  • Bucket: Divide los datos particionados en buckets basados en valores de función hash para mejorar la eficiencia de las consultas.

Tipos de datos de Hive

Hive está diseñado para tareas de almacén de datos en lugar de procesamiento de transacciones en línea (OLTP), centrándose en la escalabilidad, el rendimiento, la confiabilidad y la tolerancia a fallos. Admite varios formatos de entrada y se puede extender con conectores en diferentes 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 datos masivos.

Instalación y despliegue de Hive

Esta sección se centra en la descarga y la configuración de directorios, la configuración de variables de entorno, la configuración de la metabase, los parámetros del sistema de Hive y la inicialización de la metabase.

Primero, debe cambiar al usuario hadoop para realizar las operaciones siguientes. Haga doble clic en la terminal Xfce en su escritorio y escriba los siguientes comandos:

su - hadoop

Consejo: la contraseña es 'hadoop' del usuario 'hadoop'

Luego, use el comando wget para descargar la última versión estable de Hive. Aquí hemos 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

A continuación, debe extraer el paquete de instalación descargado. Escriba el siguiente comando en la terminal:

tar -zxvf apache-hive-2.3.3-bin.tar.gz

Utilice el privilegio sudo para mover el directorio extraído al directorio /opt. Si no utiliza el privilegio sudo, es posible que no pueda escribir en el directorio /opt:

sudo mv /home/hadoop/apache-hive-2.3.3-bin /opt/hive-2.3.3

Después de mover el directorio, debe cambiar el propietario del directorio de Hive al usuario hadoop y su grupo de usuarios. Escriba 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 variables de entorno

Una vez configurado el directorio, debe 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 utilizando el editor vim. Escriba el siguiente comando en la terminal:

vim /home/hadoop/.bashrc

Agregue el siguiente contenido al final del archivo. La variable PATH debe modificarse de acuerdo con la situación real del entorno de experimentación actual. La expresión $PATH se utiliza para hacer referencia al contenido existente. Agregue :$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

Guarde el archivo y salga del editor una vez finalizada la edición. Luego, use el comando source para activar las variables de entorno anteriores.

En esta práctica, hemos instalado previamente hive, por lo que no necesita la variable de entorno source, pero en su instalación real, este paso se realiza en función de cada caso.

Configuración de Hive

Este es el proceso de configuración de Hive. En este paso, puede simplemente visualizar sin realizar ninguna acción manual, ya que hemos configurado previamente Hive en el laboratorio y hemos instalado Hive previamente. Puede usar el comando which hive para verificar, pero aún es necesario crear el archivo, ya que este es el requisito para determinar si aprueba la prueba o no.

Configuración de la metabase

Antes de poder usar oficialmente Hive, debe configurar su almacén de metadatos. Por defecto, Hive almacena la información meta en una base de datos Derby integrada. Su ubicación de almacenamiento en el disco está determinada por el parámetro de configuración javax.jdo.option.ConnectionURL en el archivo de configuración de Hive conf/hive-default.xml. Por defecto, esta ubicación es ./metastore_db.

Pero en este laboratorio usaremos MySQL como el almacenamiento para los metadatos. Por lo tanto, debe modificar el archivo de configuración de Hive.

Cree y abra este archivo de configuración que hemos creado con el editor vim:

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 anteriores, guarde el archivo y salga del editor.

Creación de la base de datos MySQL

Inicie el servidor 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;

Luego, descargue el controlador JDBC de MySQL y cópielo al 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 la metabase, debe configurar los parámetros de configuración internos de Hive para identificar la ubicación de Hadoop, la ruta del archivo de configuración interna, etc.

Lo primero que debe hacer es usar el comando cp para hacer una copia del archivo de plantilla de configuración para que surtan efecto.

Escriba 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

Luego, 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 parámetros de configuración anteriores, guarde el archivo y salga del editor.

Inicialización de la metabase

Una vez que se han completado todas las tareas de configuración, puede comenzar a inicializar la metabase.

Dado que los datos que se utilizarán posteriormente se almacenarán en HDFS, debe iniciar HDFS con anticipación. Escriba los siguientes comandos en la terminal para iniciar HDFS:

start-dfs.sh
start-yarn.sh

Debe escribir jps para ver el estado del servicio:

hadoop:~/ $ jps                                                      [17:31:43]
8960 Jps
3153 NodeManager
2823 SecondaryNameNode
3017 ResourceManager
2570 DataNode
2428 NameNode

Si está usando Hadoop por primera vez, debe eliminar los datos de Hadoop e inicializarlos con hdfs namenode -format.

En este laboratorio, hemos inicializado el Hive preinstalado con la base de datos u, por supuesto, si desea inicializar el Hive que acaba de descargar, use el siguiente comando.

/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed

Aquí, si primero inicializa el Hive que acaba de descargar, tendrá que cambiar la ruta de HIVE_HOME en '~/.bashrc' a la ruta del Hive recién instalado y sourcearlo, y mi consejo es no hacerlo, porque nuestras pruebas posteriores de Hive se basan en nuestro Hive preinstalado.

Cuando el mensaje de aviso indique que la inicialización se ha completado, puede usar el comando hive para ingresar a su línea de comandos. Escriba el siguiente comando en la terminal:

hive

Consejo: Escribiendo hive directamente en el shell de Hive preinstalado, agregando la ruta absoluta, estará en el shell de Hive recién configurado.

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

A continuación, aprenderemos algunas operaciones básicas en Hive. Además de algunas de las declaraciones de operación mencionadas en esta sección, todas las declaraciones de Hive se pueden encontrar en su Manual de lenguaje. Puede probar más declaraciones después de terminar esta sección.

Creación de una tabla

Primero, necesita obtener algunos datos. Los datos utilizados en esta sección del experimento son principalmente un archivo de registro que simula el servidor NginX, que se puede utilizar para analizar las vistas de página del sitio web.

Vuelva a abrir una terminal y escriba los siguientes comandos en la terminal para descargar los datos de muestra:

su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv

Luego, cargue el archivo a HDFS:

hdfs dfs -mkdir -p /user/data/staging/page_view
hdfs dfs -put /home/hadoop/log_example.csv /user/data/staging/page_view

Lo primero después de tener los datos es crear la tabla. Si desea crear una tabla page_view para los datos anteriores, debe escribir la siguiente declaració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, se asigna a cada columna de la tabla un tipo adecuado. Además, podemos adjuntar comentarios a los niveles de columna y tabla. Además, la cláusula PARTITIONED BY define una columna de partición que es diferente a la columna de datos. La columna de partición no se almacena con la columna de datos. Cuando especifica una columna de partición de esta manera, se utiliza un carácter de nueva línea como separador para cada fila.

Si los datos no están en el formato anterior, puede parametrizar el separador de campos como se muestra en el siguiente ejemplo:

La siguiente declaración solo es para fines de demostración y no debe escribirse 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;

Dado que el separador de líneas está determinado por el separador en el sistema de Hadoop en lugar de por Hive, no podemos cambiar manualmente el separador de líneas.

Por lo general, la tabla en la que se determinan los datos de columna se almacena en un bucket, lo que facilitará la muestra eficiente de la consulta del conjunto de datos. Si no hay bucket, incluso si se puede completar la muestra aleatoria de la tabla, no se puede lograr una muestra eficiente en el proceso de barrido de todos los datos. El siguiente ejemplo muestra cómo habilitar el almacenamiento en buckets para la tabla page_view en la columna userid.

La siguiente declaración solo es para fines de demostración y no debe escribirse 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 en la tabla se agrega a 32 buckets mediante una función hash. En cada bucket, los datos se ordenan en orden ascendente de viewTime. Este método de organización de datos permite a los usuarios muestrear eficazmente las columnas agregadas (aquí la columna userid), y la característica de clasificación permite a los administradores de datos evaluar las consultas de manera más eficiente a través de mejores estructuras de datos.

La siguiente declaración solo es para fines de demostración y no debe escribirse 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 en la tabla se define en términos de nombres y tipos de campo, bastante similar a las definiciones de tipos en otros lenguajes de programación. Tenga en cuenta que los nombres de tabla y columna no distinguen entre mayúsculas y minúsculas. IP Address of the User y la declaración COMMENT a continuación indican que podemos agregar comentarios a los niveles de columna y tabla. Además, la cláusula PARTITIONED BY define columnas de partición que son diferentes a las columnas de datos. Como se mencionó anteriormente, en realidad no almacenan los datos. La cláusula CLUSTERED BY especifica qué columna utilizar para crear cuántos buckets. La cláusula ROW FORMAT DELIMITED especifica cómo almacenar las filas en una tabla de Hive. Para los formatos delimitados, esta declaración especifica cómo determinar el símbolo de terminación de un campo, cómo determinar el símbolo de terminación de un elemento en una colección (matriz o mapa) y el símbolo de terminación para determinar la clave de terminación del mapa, donde los números están en codificación ASCII. STORED AS SEQUENCEFILE indica que los datos se almacenan en HDFS en formato binario (específicamente el tipo SequenceFile de Hadoop). Entre ellos, las configuraciones en las cláusulas ROW FORMAT y STORED AS son los valores predeterminados que Hive está utilizando actualmente. Por lo tanto, no los escribimos explícitamente en la declaración que creó la tabla al principio.

Exploración de tablas y particiones

Si desea enumerar las tablas existentes en su almacén, puede utilizar la siguiente declaración:

SHOW TABLES;

Si hay muchas tablas, la declaración anterior generará mucha información de retorno. Puede reducir el alcance especificando un prefijo. Por ejemplo, si desea enumerar una tabla con el prefijo page, puede utilizar la siguiente declaración:

SHOW TABLES 'page.*';

Las reglas de coincidencia en esta declaración son las mismas que la sintaxis de expresiones regulares, y el punto (.) representa un comodín.

Si desea enumerar las particiones de una tabla, use la siguiente declaración. Si la tabla no es una tabla particionada, no se devuelven información:

SHOW PARTITIONS page_view;

Si desea enumerar las columnas y los tipos de columna de una tabla, puede utilizar la declaración DESCRIBE:

DESCRIBE page_view;

Si desea enumerar las columnas de la tabla y todas sus otras propiedades, debe agregar la palabra clave EXTENDED. Esto imprimirá mucha información, que generalmente se utiliza para depurar:

DESCRIBE EXTENDED page_view;

Modificación de una tabla

Si desea cambiar el nombre de una tabla existente, use la declaración ALTER TABLE con RENAME TO. Si ya existe una tabla con el nuevo nombre, se devuelve un error:

ALTER TABLE page_view RENAME TO new_page_view;

Ver 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 podemos cambiar los nombres de las columnas de una tabla existente. Sin embargo, es importante tener en cuenta que debe utilizar el mismo tipo de columna y 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 agregar 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 en el esquema (como agregar una columna) conservarán el esquema para la antigua partición de la tabla para evitar que se convierta en una tabla particionada. Todas las consultas que acceden a estas columnas y se ejecutan en la antigua partición devuelven implícitamente valores nulos o los valores predeterminados especificados para esas columnas.

Eliminación de tablas y particiones

Dado que Hive está diseñado como un almacén de datos, la destrucción de datos siempre es negativa. Por lo tanto, la operación de eliminar una tabla es un poco complicada. Usar el comando DROP en la tabla eliminará implícitamente cualquier índice construido en la tabla.

Puede usar los siguientes comandos para eliminar una tabla:

DROP TABLE new_page_view;

Carga y consulta de datos

En Hive, cargar datos y consultar datos son dos operaciones diferentes. Este documento describe cómo cargar datos en una tabla de Hive.

Carga de datos

Hay varios métodos para cargar datos en una tabla de Hive. Los usuarios pueden crear tablas externas que apunten a ubicaciones específicas en HDFS. En este uso, el usuario puede usar el comando put o copy de HDFS para copiar el archivo de datos a la ubicación especificada y crear una tabla que apunte a esa ubicación. Esta tabla contendrá toda la información relevante de formato de línea.

Una vez creada, los usuarios pueden convertir los datos e insertarlos en cualquier otra tabla de Hive. Cargamos el archivo log_example.csv a HDFS al principio y lo renombramos a page_view. Si queremos cargarlo en la tabla page_view de la partición correspondiente, podemos hacerlo con el siguiente comando.

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';

Luego, cree una tabla page_view para el almacenamiento final de 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;

Finalmente, 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';

Puede tardar algunos minutos en que los datos se carguen en HDFS y luego en la tabla page_view.

...
Loading data to table default.page_view partition (dt=2015-05-17, country=us)
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 6.31 sec   HDFS Read: 369021 HDFS Write: 22943 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 310 msec
OK
Time taken: 25.304 seconds

Consulta simple

Después de insertar los datos, podemos hacer una consulta simple. Esto es similar a una declaración SQL común. Escriba la siguiente declaración en la interfaz de línea de comandos de Hive:

SELECT * FROM page_view WHERE userid = 0 LIMIT 10;

La información devuelta son 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
...

Cerrar servicios

Si desea aprender más declaraciones de acción de Hive, puede leer las siguientes extensiones:

Cuando haya terminado de usarlo, puede usar el comando quit para salir de la interfaz de línea de comandos de Hive:

quit;

Por supuesto, no olvide apagar el servicio de HDFS. Escriba el siguiente comando en la terminal:

stop-yarn.sh
stop-dfs.sh

Resumen

En esta sesión se presenta la arquitectura de Hive, su instalación y despliegue, y las declaraciones básicas de HQL. Además, hemos aprendido a importar datos utilizando los datos de muestra.

Los principales puntos mencionados son:

  • Arquitectura de Hive
  • Unidad de datos básica de Hive
  • Cómo desplegar Hive
  • Lenguaje HQL de Hive

En general, como paquete de software de almacén de datos, las funciones de Hive necesitan ser exploradas más detenidamente. Por favor, mantenga el hábito de revisar activamente materiales técnicos y continúe aprendiendo los siguientes cursos.