top of page

Apache Iceberg, Hadoop y Hive: Abra su Datalake (Lakehouse) -> Parte I

Actualizado: 22 jun

En una publicación anterior, hice un breve resumen de los criterios que distinguen un datalake de un lakhouse. La gestión y organización de datos fue la clave para definir un lakhouse, así como la falta de puntos que lo hagan ideal para un datalake, además de una mayor velocidad de entrada de datos. Ahora he explicado cómo hacer que cualquiera de estos patrones, datalake o lakhouse, sea accesible para los usuarios. Voy a dividir este tema en dos partes: la primera se centrará en la infraestructura y la segunda en el contenido y el acceso a los datos.
Lago de datos y Hive
Datalake and Hive

A pesar de las diferencias, al implementar su infraestructura, puede dar pasos importantes hacia una arquitectura de lago o datalake. Obviamente, no gestiona ninguno de los procesos adicionales que componen una práctica de gestión de datos, pero puede posicionarse para tomar esa dirección.


Mis publicaciones anteriores sobre Apache Iceberg destacaron las funciones de gestión de datos de Iceberg, especialmente la gestión de esquemas. Así que comencé mi arquitectura de minimodelo aprovechando Iceberg.


Para mi plataforma de procesamiento de datos, me quedo con el código abierto. Sin embargo, no creo que existan mejores productos comerciales. La decisión sobre la plataforma fue algo más compleja. He usado e implementado DASK y Apache Spark como motores de procesamiento capaces de procesar en paralelo en CPU (muy recomendable por su precio) y GPU. Obviamente, es necesario conseguir bibliotecas de proveedores de GPU para extender cualquiera de ellos, pero el procesamiento de datos supone un desperdicio de GPU; no son adecuadas para la tarea.


Decidí usar Apache Spark debido a su amplia comunidad y al soporte de proveedores. El tiempo de implementación y las operaciones es muy rápido cuando el número de nodos es de un solo dígito, a menos que se utilice un servicio de un proveedor de nube con capacidad de escalado rápido. Spark tampoco requiere codificar funciones de Python para habilitar el paralelismo. Dado que estaba utilizando Iceberg (y Hadoop), la integración con Spark debería ser más fluida (creo).


Finalmente, para permitir que los usuarios accedan a los datos mediante consultas, opté por Apache Hive y Drill debido a su integración. Existen muchas otras herramientas de código abierto y productos comerciales que podrían ser más adecuados, según sus necesidades específicas, pero esto le permitirá comenzar sin costos de licencia.


A continuación se muestra una representación de esas opciones con flechas que representan los flujos de datos (idealmente):

Flujo de datos esperado
Expected Data Flow

Datalake: Configuración de Apache Hadoop y Apache Iceberg

Se requiere la instalación de JDK v8 o posterior para Hadoop. Usé homebrew para instalar openjdk@17, ya que era la versión compatible con todos los productos Apache mencionados anteriormente.


Dependiendo de la plataforma que uses, puedes optar por la instalación manual mediante descarga o mediante un gestor de paquetes. También usé homebrew para instalar Hadoop:

brew install hadoop
cd "/opt/homebrew/Cellar/hadoop/3.3.6/libexec/etc/hadoop"

vi core-site.xml 

Ya lo había hecho como parte de la instalación de Iceberg, según mi publicación sobre ese tema, pero básicamente, tu archivo core-site.xml debería ser similar a uno de la lista a continuación. He resaltado en negrita los elementos a los que se debe prestar especial atención y, dado que tengo una configuración local, permití la autenticación anónima. En la mayoría de los casos, la autenticación debería estar habilitada o ser obligatoria. El requisito principal es tener las ubicaciones y el espacio disponibles en el sistema de archivos para instalar Hadoop.

sitio principal.xml

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
</property>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/Volumes/ExtShield/opt/hdfs/tmp</value>
    <description>A base for other temporary directories</description>             
  </property>
<property>
      <name>hadoop.http.filter.initializers</name>
      <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
      <description>
                    Authentication for Hadoop HTTP web-consoles
                    add to this property the org.apache.hadoop.security.AuthenticationFilterInitializer initializer class.
      </description>
</property>
<property>
      <name>hadoop.http.authentication.type</name>
      <value>simple</value>
      <description>
                    Defines authentication used for the HTTP web-consoles. 
                    The supported values are: simple | kerberos | #AUTHENTICATION_HANDLER_CLASSNAME#. 
                    The dfeault value is simple.
      </description>
</property>
<property>
      <name>hadoop.http.authentication.token.validity</name>
      <value>36000</value>
      <description>
                    Indicates how long (in seconds) an authentication token is valid before it has to be renewed. 
                    The default value is 36000.
      </description>
</property>
<property>
      <name>hadoop.http.authentication.standard.config.path</name>
      <value>/Users/claude_paugh/hadoop/auth.conf</value>
      <description>
                    The signature secret file for signing the authentication tokens. 
                    The same secret should be used for all nodes in the cluster, JobTracker, NameNode, DataNode and TastTracker. 
                    The default value is $user.home/hadoop-http-auth-signature-secret. 
                    IMPORTANT: This file should be readable only by the Unix user running the daemons.
      </description>
</property>
<property>
      <name>hadoop.http.authentication.simple.anonymous.allowed</name>
      <value>true</value>
      <description>
                     Indicates if anonymous requests are allowed when using ‘simple’ authentication. 
                     The default value is true
      </description>
</property>
<property>
      <name>hadoop.http.authentication.signature.secret.file</name>
      <value>/Users/claude_paugh/hadoop/hadoop-http-auth-signature-secret</value>
      <description>
                    The signature secret file for signing the authentication tokens. 
                    The same secret should be used for all nodes in the cluster, JobTracker, NameNode, DataNode and TastTracker. 
                    The default value is $user.home/hadoop-http-auth-signature-secret. 
                    IMPORTANT: This file should be readable only by the Unix user running the daemons.
      </description>
</property>
<property>
	<name>iceberg.engine.hive.enabled</name>
	<value>true</value>
</property>
</configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
     <name>dfs.replication</name>
     <value>1</value>
  </property>
  <property>
     <name>dfs.permissions</name>
     <value>false</value>
  </property>
  <property>
     <name>dfs.namenode.name.dir</name>
     <value>file:/Volumes/ExtShield/opt/hdfs/namenode/data</value>
  </property>
    <property>
     <name>dfs.namenode.checkpoint.dir</name>
     <value>file:/Volumes/ExtShield/opt/hdfs/namenode/checkpoint</value>
  </property>
  <property>
     <name>dfs.datanode.data.dir</name>
     <value>file:/Volumes/ExtShield/opt/hdfs/datanode/data</value>
  </property>
</configuration>

sitio mapred.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
 <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
    <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
</configuration>

sitio-de-hilados..xml

<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>

La lista anterior de archivos de configuración refleja la configuración que también he estado usando con Apache Iceberg. A continuación, configuré el script .bashrc en mi directorio personal para incluir las variables de Hadoop. Si el archivo .bashrc no se ejecuta al abrir la sesión de shell, deberá ejecutarlo manualmente mediante " source ~/.bashrc ". Las variables incluidas son necesarias para el funcionamiento (inicio/apagado, tareas) de los productos Iceberg/Hadoop, Hive y Spark:

.bashrc - Sólo Hadoop

export PYTHON_BIN="/usr/local/bin"
export JAVA_HOME="/opt/homebrew/opt/openjdk@21"
export PYTHONPATH=$PYTHON_BIN
eval "$(/opt/homebrew/bin/brew shellenv)"
export PYTHONPATH=$PYTHONPATH:/Users/claude_paugh/airflow/arf/site-packages/trading-0.1.0b0.dist-info

export HDFS_NAMENODE_USER="claude_paugh"
export HDFS_DATANODE_USER="claude_paugh"
export HDFS_SECONDARYNAMENODE_USER="claude_paugh"
export HDF5_USE_FILE_LOCKING="FALSE"

export HADOOP_HEAPSIZE=2048
export HADOOP_HOME="/opt/homebrew/Cellar/hadoop/3.4.1/libexec"
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_CLIENT_OPTS="-Di-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

export PATH=$PATH:$PYTHONPATH:$JAVA_HOME:$HADOOP_HOME:$HADOOP_HOME/bin

Puede iniciar y apagar Hadoop usando $HADOOP_HOME/sbin/start-all.sh y stop-all.sh en la misma ubicación. Si usa las bibliotecas de Python como yo, deberá instalar el paquete pyiceberg mediante pip o conda. Si " start-all.sh " se ejecuta correctamente, acceda a la URL http://localhost:9870/ en su navegador y debería ver algo como lo siguiente:

interfaz de usuario de inicio de Hadoop
Hadoop UI

Anteriormente había descargado el JAR para Apache Iceberg, por lo que en este punto puedo agregar el jar de Iceberg a mi classpath (o $HADOOP_HOME/lib ), y debería ser completamente funcional Iceberg + Hadoop.


Configurar Apache Spark

Mi siguiente paso fue configurar Spark de forma independiente. Decidí probar la versión 4.0.0 y, de nuevo, usé Homebrew para instalarla . Funcionaba correctamente con mi instalación de Hadoop/Iceberg, pero al instalar Apache Hive 4.0.1, empecé a tener problemas intermitentes, como ya habían visto otros usuarios, con el reconocimiento del catálogo. Así que opté por Spark 3.5.6, usando de nuevo Homebrew. Al igual que en la instalación de Hadoop anterior, hay... inicio-todo.sh y stop-all.sh en el directorio $SPARK_HOME/sbin . Tras el arranque, debería poder acceder a http://127.0.0.1:8080/ y ver esto:

interfaz de usuario de Spark
Spark Standalone UI

También creé y personalicé mi nf $SPARK_HOME/conf/ spark-defaults.co , que se lee cuando se inicia Spark, y contenía lo siguiente:

spark.jars.packages                                             org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.9.1
spark.sql.extensions                                           org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.hive.metastore.uri                                    thrift://localhost:9083
spark.sql.warehouse.dir                                         hdfs://localhost:9000/user/hive/warehouse
spark.sql.catalogImplementation                                 hive
spark.sql.catalog.spark_catalog                                 org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.spark_catalog.type                            hive
spark.sql.catalog.spark_catalog.warehouse                       hdfs://localhost:9000/user/spark/warehouse

Los valores se basan en el uso y la integración de Hive. También creé (a partir de una plantilla) y modifiqué el archivo spark-env.sh. script en el directorio $SPARK_HOME/conf para contener lo siguiente:

export SPARK_MASTER_HOST=127.0.0.1
export SPARK_MASTER_PORT=7077
 
# Options read in any cluster manager using HDFS
export HADOOP_CONF_DIR="$HADOOP_HOME/etc/hadoop"
export HADOOP_HOME=$HADOOP_HOME

# Pyspark
PYSPARK_DRIVER_PYTHON=python
PYSPARK_PYTHON=python

En este punto, ya tenía un entorno Spark funcional y probé si las shells de Scala y PySpark se iniciaban desde la línea de comandos (CLI), lo cual se realizó correctamente, y ejecuté algunas sentencias. Luego, realicé una instalación de pip para PySpark, ya que no planeaba usar la shell durante las pruebas. Probé el resto de mi instalación de Spark ejecutando un script simple que abría una SparkSession y leía un archivo delimitado en un dataframe desde una ubicación HDFS, con PySpark importado en el script. También agregué las siguientes variables al archivo .bashrc :

export SPARK_REMOTE="sc://localhost"
export SPARK_HOME="/Volumes/ExtShield/opt/spark-3.5.6-bin-hadoop3/libexec"
export PYTHONPATH=$HADDOOP_HOME:$SPARK_HOME/jars:$PYTHONP$
export PATH=$PATH:$HADOOP_HOME:$SPARK_HOME:$HADOOP_HDFS_HOME

Configurar Apache Hive

Como mencioné anteriormente, comencé con Apache Spark 4.0.0 y Apache Hive 4.0.1, pero después de algunos problemas, bajé la versión de Spark a la 3.5.6 e instalé también la versión 4.0.0 de Apache Hive. Puedes encontrar las versiones anteriores de Hive aquí . Descargué el archivo apache-hive-4.0.0-bin.tar.gz y lo moví a la ubicación de destino. Luego, en una consola de mi MacBook, ejecuté:

gunzip apache-hive-4.0.0-bin.tar.gz
tar -xvf apache-hive-4.0.0-bin.tar 

Luego, agregué las siguientes variables de entorno a mi .bashrc :

export HIVE_OPTS="-hiveconf mapreduce.map.memory.mb=8192 -hiveconf mapreduce.reduce.memory.mb=5120"
export HIVE_HOME="/Volumes/ExtShield/opt/apache-hive-4.0.0-bin"
export HIVE_CONF_DIR=$HIVE_HOME/conf
export HIVE_SERVER2_THRIFT_BIND_HOST="localhost"
export HIVE_SERVER2_THRIFT_PORT="10001"
export PYTHONPATH --> add $HIVE_HOME/lib
export PATH --> add $HIVE_HOME

Los límites de memoria sirven para evitar errores de "memoria insuficiente". El resto se explica por sí solo, según la documentación de Hive. Las variables que hacen referencia a "HIVE_SERVER2" son necesarias para la próxima instalación.


Anteriormente había usado una base de datos PostgreSQL remota para el catálogo de Iceberg, así que seguí el mismo camino con Hive. Reutilizando la instalación de Postgres de la implementación, copié el controlador JDBC de Postgres a la ubicación $HIVE_HOME/lib para que se añadiera a la ruta de clases de Hive.


Comencé con la documentación más reciente de Hive y el Manual del administrador. Luego, descargué la versión 4.0.0 de Hive para la instalación. Seguí las instrucciones, modifiqué mi archivo .bashrc y mi configuración según lo indicado y procedí a instalar Hive Metastore .


Como indiqué anteriormente, iba a utilizar un Metastore remoto con PostgreSQL, así que creé manualmente la base de datos Postgres usando una conexión JDBC usando DataGrip y la llamé metacatalog . Luego creé un archivo hive-site.xml a partir del archivo de plantilla proporcionado y comencé a actualizar la configuración, sustituyendo Postgres por MySQL (en la documentación del sitio web). También observará que incluí algunos parámetros utilizados para configurar HiveServer2 . Los detalles se encuentran a continuación:

Parámetro de configuración

Valor de configuración

Comentario

javax.jdo.option.URL de conexión

jdbc:postgresql://10.0.0.30:5439/metacatalog?ssl=false;create=false

Los metadatos se almacenan en un servidor PostgreSQL

javax.jdo.option.NombreDelControladorDeConexión

Clase de controlador JDBC

javax.jdo.option.NombreUsuarioConexión

<username>

nombre de usuario para conectarse a Postgres

javax.jdo.option.ContraseñaDeConexión

<password>

contraseña para conectarse a Postgres

colmena.metastore.almacén.dir

Ubicación predeterminada para las tablas de Hive (Hadoop)

Nombre de host al que se vincula el servicio de metastore. Si está vacío, se usa "localhost". Esta configuración está disponible a partir de Hive 4.0.0.

colmena.metastore.uris

ahorro:// localhost:9083

Host y puerto del servidor de metatienda Thrift. Si se especifica hive.metastore.thrift.bind.host , el host debe ser el mismo que el de esa configuración. Más información en los parámetros de configuración de detección dinámica de servicios.

Estoy seguro de que todos sabrán que almacenar nombres de usuario y contraseñas en el archivo hive-site.xml en texto plano no es aceptable en la mayoría de las configuraciones de seguridad. Supongo que la mayoría de las organizaciones usarán SAML 2.0 e inicio de sesión único.


A continuación, inicié Hive Metastore como un servicio en segundo plano después de los cambios de configuración.

$HIVE_HOME/bin/hive --service metastore &

Originalmente intenté iniciar el metastore con la opción de configuración " create=true " en la URL de JDBC, pero solo tuve un éxito parcial. Así que pasé a " create=false " y usé la herramienta de esquema para realizar una implementación manual. Logré iniciar el servicio e implementar las tablas del catálogo de Hive con la herramienta:

metacatálogo de Hive de Postgres
Postgres Hive Meta-catalog

En la versión del catálogo que viene con Hive 4.0.0, debería haber 83 tablas en la base de datos, suponiendo que estuviera vacía al inicio. Tras iniciar el servicio de metastore con los cambios en los parámetros tras usar la herramienta de esquema, todo estaba limpio en los registros de inicio, así que creo que continué con la implementación del servidor Hive.


Ya había incluido algunos de los parámetros anteriores para HiveServer2, pero aún necesitaba realizar algunos cambios más en hive-site.xml para completar la tarea. Primero, quería ejecutar en modo "HTTP" en lugar de binario, así que actualicé hive.server2.transport.mode l en el xml a " http ". Luego, agregué los valores mínimos requeridos al archivo hive-site.xml, incluyendo los valores para ejecutar en "modo http" (tabla en el enlace), y también hice lo siguiente:

  1. Deshabilitar SSL

  2. Se utilizó la URL JDBC con parámetros http: jdbc:hive2:// localhost:10001/default;transportMode=http;httpPath=cliservice

  3. Configuración de registro

  4. Autenticación anónima

  5. configuración del directorio scratch para Hive


Luego comencé el servicio:

$HIVE_HOME/bin/hive --service hiveserver2

Al visitar http://localhost:10002 , veo lo siguiente


servidor de colmena2
HiveServer2 Home UI

En este punto, parecía que al menos estaba en ejecución, así que instalé y abrí DBeaver para validar la funcionalidad de Hive. Creé una conexión JDBC a Hive usando DBeaver, añadiendo una fuente de datos de Hive sin autenticación, usando la URL anterior:

Hive JDBC Connection
Hive JDBC Connection

Me conecté y vi lo siguiente:

Connected to Hive
Connected to Hive

URL abierta para HiveServer2:

Hive UI Output
Hive UI Output

Había validado una conexión a la base de datos de Hive y, a continuación, quería crear una tabla para validar la integración de Hive + Iceberg + Hadoop. Encontré la instrucción "create table" que usé en las publicaciones sobre Apache Iceberg e hice una modificación sencilla para incluir el formato de fila serde para Hive/Iceberg:


Ejecuté el script:

tabla creada
Created Table
tabla del catálogo de colmena
Hive Catalog of Table





















Salida de la interfaz de usuario de Hive : al hacer clic en el enlace de desglose, obtendrá planes de ejecución y registros operativos para la ejecución de la declaración:

Salida de la interfaz de usuario de Hive para crear una tabla
Hive UI Output for Create Table

Carpeta Hadoop que contiene la carpeta de metadatos para Apache Iceberg:

Carpeta Hadoop para tabla
Hadoop Folder for table
Archivo metadata.json de Iceberg en Hadoop
Iceberg metadata.json file in Hadoop

A continuación, también añadí una conexión a Hive y Hadoop a mi IDE de Pycharm, lo que me permite explorar y ver los atributos extendidos de las tablas al escribir scripts de PySpark. Debes añadir el plugin de Spark si utilizas una versión anterior del IDE; las nuevas versiones lo incluyen instalado si usas una licencia "Pro".


Abra "Big Data Tools" para crear las conexiones:

Herramientas de Big Data de PyCharm
PyCharm Big Data Tools









Esto me da una vista detallada de las especificaciones de la tabla al hacer clic en el icono del botón " Hive Metastore " (izquierda). Deberían aparecer paneles a la derecha de la pantalla después de hacer clic en el botón, que presentan información sobre los atributos de la tabla (páginas 1 y 2):

metatienda de colmena
Hive Metastore
página 1 de atributos de tabla
Table Attribute Page 1















Página 2 de atributos de tabla
Table Attributes Page 2

Luego, cargué un archivo de datos que usé en la serie de artículos de Iceberg con Spark y creé registros en la tabla "test_company_stocks". Explicaré el uso de Spark en la segunda parte de este artículo, pero después de cargarlo, puedo ver que los datos persistieron. Cargué el archivo en una tabla de staging independiente y luego realicé una operación SQL en el IDE: " INSERT INTO.....SELECT * FROM staging_table" para demostrar lo que ocurre.


Después de ejecutar el comando " INSERT " en DBeaver, puede ir inmediatamente a la consola de HiveServer2, hacer clic en la consulta y luego ir a "Registro de operaciones" (suponiendo que lo haya configurado como lo hice anteriormente). Debería ver un resultado como este:

Registro de operaciones para consultas SQL
Operation Log for SQL Query

Si copia y pega la URL resaltada en una pestaña del navegador, debería ver la ventana "Aplicaciones Hadoop". Aquí puede supervisar el trabajo "MapReduce" que traduce los datos de una tabla a otra dentro de Hadoop:

Ventana de aplicación de Hadoop
Hadoop Application Window

Si hace clic en " Herramientas -> Registros " en el menú de la izquierda, podrá ver el progreso del trabajo en los archivos de registro. Para quienes tengan curiosidad, si configura "tmp" o "scratchdir" en ubicaciones específicas para Hive, podrá ver los objetos temporales en el sistema de archivos del sistema operativo o en el sistema de archivos de Hadoop, si eligió esa opción para los archivos temporales.


Una vez finalizado, volví a DBeaver y ejecuté "select * from test_company_stock", y pude ver esto:

Conjunto de resultados de Hive
Result Set from Hive

La carpeta "test_company_stocks" en Hadoop ahora debería tener una subcarpeta llamada "data" con particiones y archivos Parquet, ya que usa Iceberg. En mi caso, así fue, como se muestra a continuación:


Directorio de datos con particiones
Data Directory with Partitions
Archivo de datos de Parquet dentro de la partición
Parquet Data File within Partition
En este punto, estaba satisfecho de que mi infraestructura, sin Apache Drill, estaba en condiciones para iniciar el procesamiento de datos, y Spark + Hive + Iceberg/Hadoop se habían validado. La próxima publicación se centrará en algunos escenarios de procesamiento de datos y en el uso de Apache Drill con el Catálogo de Hive.
bottom of page