top of page

Apache Iceberg, Hadoop et Hive : ouvrez votre Datalake (Lakehouse) -> Partie 1

Dernière mise à jour : 22 juin

Dans un article précédent, j'ai brièvement résumé les critères de distinction entre un datalake et un lakehouse. La gestion et l'organisation des données étaient les principaux éléments constitutifs d'un lakehouse, et l'absence d'arguments en faveur d'un datalake, ainsi que la vitesse accrue des entrées de données. J'ai maintenant abordé la manière de rendre ces deux modèles, datalake ou lakhouse, accessibles aux utilisateurs. Je vais diviser ce sujet en deux parties : la première se concentrera sur l'infrastructure, et la seconde sur le contenu et l'accès aux données.
Lac de données et Hive
Datalake and Hive

Malgré ces différences, vous pouvez entreprendre des avancées majeures vers une architecture lakehouse ou datalake lors du déploiement de votre infrastructure. Bien sûr, elle ne prend en charge aucun des processus supplémentaires inhérents à une pratique de gestion des données, mais vous pouvez vous positionner pour prendre cette direction.


Mes précédents articles sur Apache Iceberg soulignaient les fonctionnalités de gestion des données d'Iceberg, notamment en matière de gestion des schémas. J'ai donc commencé mon architecture de mini-modèle en exploitant Iceberg.


Pour ma plateforme de traitement de données, je privilégie l'open source. Mais je ne pense pas qu'il existe de meilleurs produits commerciaux. Le choix de la plateforme était un peu plus complexe. J'ai utilisé et déployé DASK et Apache Spark comme moteurs de traitement parallèles sur CPU (très appréciés pour leur prix) et GPU. Il est évidemment nécessaire d'utiliser les bibliothèques des fournisseurs GPU pour étendre l'un ou l'autre, mais le traitement des données représente un gaspillage de GPU : ils ne sont pas adaptés à cette tâche.


J'ai opté pour Apache Spark , en raison de sa vaste communauté et du support de ses fournisseurs. La mise en place du déploiement et des opérations est très rapide, même avec un nombre de nœuds limité à 10 %, sauf si vous utilisez un fournisseur de cloud capable d'évoluer rapidement. Spark ne nécessite pas non plus de coder des fonctions Python pour activer le parallélisme. Comme j'utilisais Iceberg (et Hadoop), l'intégration avec Spark est intégrée, ce qui devrait faciliter l'intégration (je pense).


Enfin, pour permettre aux utilisateurs d'accéder aux données par requête, j'ai opté pour Apache Hive et Drill en raison de leur intégration. Il existe de nombreux autres outils open source et produits commerciaux qui pourraient être plus pertinents, en fonction de vos besoins spécifiques. Cependant, celui-ci vous permettra de démarrer sans frais de licence.


Voici une représentation de ces choix avec des flèches représentant les flux de données (idéalement) :

Flux de données attendu
Expected Data Flow

Datalake : configuration d'Apache Hadoop et d'Apache Iceberg

L'installation d'un JDK v8 ou plus récent est requise pour Hadoop. J'ai utilisé une version homebrew pour installer openjdk@17, car c'était la version compatible avec tous les produits Apache listés ci-dessus.


Selon la plateforme utilisée, vous pouvez choisir entre une installation manuelle par téléchargement ou via un gestionnaire de paquets. J'ai également utilisé un logiciel homebrew pour installer Hadoop :

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

vi core-site.xml 

J'avais déjà effectué cette opération lors de l'installation d'Iceberg, comme indiqué dans mon article sur ce sujet, mais votre fichier core-site.xml devrait ressembler à l'un des éléments listés ci-dessous. J'ai mis en gras les éléments à surveiller et, comme j'ai une configuration locale, j'ai autorisé l'authentification anonyme. Dans la plupart des cas, l'authentification devrait être activée/obligatoire. Le principal prérequis est de disposer d'emplacements et d'espace système de fichiers suffisants pour installer Hadoop.

core-site.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>

mapred-site.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>

site-fil..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 liste des fichiers de configuration ci-dessus reflète également la configuration que j'utilise avec Apache Iceberg. J'ai ensuite configuré le script .bashrc dans mon répertoire personnel pour inclure les variables Hadoop. Si le fichier .bashrc ne s'exécute pas à l'ouverture de votre session shell, vous devez utiliser « source ~/.bashrc » pour l'exécuter manuellement. Les variables incluses sont nécessaires au fonctionnement (démarrage/arrêt, tâches) des produits Iceberg/Hadoop, Hive et Spark :

.bashrc -- Hadoop uniquement

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

Vous pouvez démarrer et arrêter Hadoop en utilisant les fichiers $HADOOP_HOME/sbin/start-all.sh et stop-all.sh au même emplacement. Si vous utilisez les bibliothèques Python comme moi, vous devrez installer le paquet pyiceberg via pip ou conda. Si le fichier « start-all.sh » fonctionne correctement, accédez à l'URL http://localhost:9870/ dans votre navigateur. Vous devriez obtenir un résultat similaire à celui-ci :

interface utilisateur Hadoop Home
Hadoop UI

J'avais précédemment téléchargé le JAR pour Apache Iceberg, donc à ce stade je peux ajouter le jar Iceberg à mon classpath (ou $HADOOP_HOME/lib ), et je devrais être entièrement fonctionnel Iceberg + Hadoop.


Configurer Apache Spark

L'étape suivante consistait à configurer Spark en mode autonome. J'ai décidé d'essayer la version 4.0.0 et, une fois de plus, j'ai utilisé Homebrew pour l'installer . Cela fonctionnait correctement avec mon installation Hadoop/Iceberg, mais après l'installation d'Apache Hive 4.0.1, j'ai commencé à rencontrer des problèmes intermittents, déjà rencontrés par d'autres, concernant la reconnaissance de catalogue. J'ai donc opté pour Spark 3.5.6, en utilisant à nouveau Homebrew. Comme pour l'installation Hadoop ci-dessus, il existe plusieurs options. démarrer-tout.sh et stop-all.sh dans le répertoire $SPARK_HOME/sbin . Après le démarrage, vous devriez pouvoir accéder à http://127.0.0.1:8080/ et voir ceci :

interface utilisateur Spark
Spark Standalone UI

J'ai également créé et personnalisé mon $SPARK_HOME/conf/ spark-defaults.co nf , qui est lu au lancement de Spark, et il contenait les éléments suivants :

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

Les valeurs sont orientées vers l'utilisation et l'intégration de Hive. J'ai également créé (à partir d'un modèle) et modifié le fichier spark-env.sh. script dans le répertoire $SPARK_HOME/conf pour contenir les éléments suivants :

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

À ce stade, j'avais un environnement Spark fonctionnel et j'ai testé si les shells Scala et Pyspark pouvaient être lancés depuis l'interface de ligne de commande (CLI), ce qui a fonctionné. J'ai ensuite exécuté quelques instructions. J'ai ensuite effectué une installation PIP pour Pyspark, car je ne prévoyais pas d'utiliser le shell pour les tests. J'ai ensuite testé le reste de mon installation Spark en exécutant un script simple qui ouvrait une SparkSession et lisait un fichier délimité dans un dataframe depuis un emplacement HDFS, Pyspark étant importé dans le script. J'avais également ajouté les variables suivantes au fichier .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

Configurer Apache Hive

Comme indiqué précédemment, j'avais démarré avec Apache Spark 4.0.0 et Apache Hive 4.0.1, mais suite à quelques problèmes, j'ai rétrogradé mon Spark à la version 3.5.6 et installé également la version 4.0.0 d'Apache Hive. Vous trouverez les versions historiques de Hive ici . J'ai téléchargé le fichier apache-hive-4.0.0-bin.tar.gz et l'ai déplacé vers mon emplacement cible, puis, dans un shell sur mon MacBook, j'ai exécuté :

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

Ensuite, j'ai ajouté les variables d'environnement suivantes à mon .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

Les limites de mémoire visent à éviter les erreurs de « mémoire insuffisante ». Le reste est explicite, d'après la documentation Hive. Les variables référençant « HIVE_SERVER2 » sont nécessaires à l'installation à venir.


J'avais précédemment utilisé une base de données PostgreSQL distante pour le catalogue Iceberg. J'ai donc suivi la même procédure avec Hive. En réutilisant l'installation Postgres du déploiement, j'ai copié le pilote JDBC Postgres dans le répertoire $HIVE_HOME/lib afin qu'il soit ajouté au classpath Hive.


J'ai commencé par la documentation Hive la plus récente et le manuel d'administration, puis j'ai téléchargé la version 4.0.0 de Hive pour l'installation tarball. J'ai suivi les instructions et apporté les modifications à mon fichier . bashrc et à ma configuration comme indiqué, avant de passer à l'installation de Hive Metastore .


Comme je l'ai indiqué ci-dessus, j'allais utiliser un Metastore distant avec PostgreSQL, j'ai donc créé manuellement la base de données Postgres à l'aide d'une connexion JDBC à l'aide de DataGrip et je l'ai appelée metacatalog . J'ai ensuite créé un fichier hive-site.xml à partir du fichier modèle fourni et commencé à mettre à jour la configuration, en remplaçant MySQL par Postgres (dans la documentation du site web). Vous remarquerez également que j'ai inclus certains paramètres utilisés pour configurer HiveServer2 . Les détails sont disponibles ci-dessous :

Paramètre de configuration

Valeur de configuration

Commentaire

javax.jdo.option.ConnectionURL

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

les métadonnées sont stockées sur un serveur PostgreSQL

javax.jdo.option.ConnectionDriverName

Classe de pilote JDBC

javax.jdo.option.ConnectionUserName

<username>

nom d'utilisateur pour se connecter à Postgres

javax.jdo.option.ConnectionPassword

<password>

mot de passe pour se connecter à Postgres

hive.metastore.warehouse.dir

emplacement par défaut des tables Hive (Hadoop)

Nom d'hôte auquel lier le service metastore. Lorsqu'il est vide, « localhost » est utilisé. Cette configuration est disponible à partir de Hive 4.0.0.

ruche.metastore.uris

thrift:// localhost:9083

Hôte et port du serveur de métastore Thrift. Si hive.metastore.thrift.bind.host est spécifié, l'hôte doit être identique à cette configuration. Pour en savoir plus, consultez les paramètres de configuration de la découverte de services dynamiques.

Je suis sûr que tout le monde comprendra que le stockage des noms d'utilisateur et des mots de passe dans le fichier hive-site.xml en texte clair n'est pas acceptable dans la plupart des configurations de sécurité. Je pense que la plupart des organisations utiliseront SAML 2.0 et l'authentification unique.


Ensuite, j’ai démarré le métastore Hive en tant que service en arrière-plan après les modifications de configuration.

$HIVE_HOME/bin/hive --service metastore &

J'avais initialement essayé de démarrer le metastore avec l'option de configuration « create=true » sur l'URL JDBC, mais le succès était mitigé. J'ai donc opté pour « create=false » et utilisé l' outil schema-tool pour effectuer un déploiement manuel. J'ai réussi à démarrer le service et à déployer les tables du catalogue Hive avec cet outil :

métacatalogue de la ruche postgres
Postgres Hive Meta-catalog

Dans la version du catalogue fournie avec Hive 4.0.0, la base de données devrait contenir 83 tables, en supposant qu'elle soit vide au départ. Après avoir démarré le service Metastore avec les modifications apportées aux paramètres suite à l'utilisation de l'outil de schéma, tout était propre dans les journaux de démarrage. Je pense donc que nous sommes passés au déploiement du serveur Hive.


J'avais déjà inclus certains des paramètres ci-dessus pour HiveServer2, mais il me restait encore quelques modifications à apporter au fichier hive-site.xml pour terminer la tâche. Je souhaitais d'abord exécuter le mode « HTTP » plutôt que le mode binaire. J'ai donc mis à jour le paramètre hive.server2.transport.mode l du fichier XML en « http ». J'ai ensuite ajouté les valeurs minimales requises au fichier hive-site.xml, y compris les valeurs pour l'exécution en mode « http » (tableau dans le lien), et j'ai également effectué les opérations suivantes :

  1. Désactivation de SSL

  2. URL JDBC utilisée avec les paramètres http : jdbc:hive2:// localhost:10001/default;transportMode=http;httpPath=cliservice

  3. Configuration de la journalisation

  4. Authentification anonyme

  5. configuration du répertoire scratch pour Hive


Ensuite, j'ai démarré le service :

$HIVE_HOME/bin/hive --service hiveserver2

En visitant http://localhost:10002 , je vois ce qui suit


hiveserver2
HiveServer2 Home UI

À ce stade, il semblait que j'étais au moins opérationnel. J'ai donc installé et ouvert DBeaver afin de valider le fonctionnement de Hive. J'ai créé une connexion JDBC à Hive avec DBeaver, en ajoutant une source de données Hive sans authentification, à l'aide de l'URL ci-dessus :

Hive JDBC Connection
Hive JDBC Connection

Je me suis connecté et j'ai vu ce qui suit :

Connected to Hive
Connected to Hive

URL ouverte pour HiveServer2 :

Hive UI Output
Hive UI Output

Après avoir validé une connexion à la base de données Hive, je souhaitais créer une table pour valider l'intégration Hive + Iceberg + Hadoop. J'ai récupéré l'instruction « create table » utilisée dans les articles sur Apache Iceberg et effectué une simple modification pour inclure le format de ligne serde pour Hive/Iceberg :


J'ai exécuté le script :

table créée
Created Table
table du catalogue de la ruche
Hive Catalog of Table





















Sortie de l'interface utilisateur Hive : en cliquant sur le lien Drilldown, vous obtenez les plans d'exécution et les journaux d'exploitation pour l'exécution de l'instruction :

Sortie de l&#39;interface utilisateur Hive pour la création d&#39;une table
Hive UI Output for Create Table

Dossier Hadoop contenant le dossier de métadonnées pour Apache Iceberg :

Dossier Hadoop pour la table
Hadoop Folder for table
Fichier metadata.json Iceberg dans Hadoop
Iceberg metadata.json file in Hadoop

J'ai également ajouté une connexion à Hive et Hadoop à mon IDE Pycharm, afin de pouvoir parcourir et afficher les attributs étendus des tables lors de l'écriture de scripts Pyspark. Vous devez ajouter le plugin Spark si vous utilisez une ancienne version de l'IDE ; les nouvelles versions l'incluent déjà si vous utilisez une licence « Pro ».


Ouvrez « Big Data Tools » pour créer les connexions :

Outils Big Data PyCharm
PyCharm Big Data Tools









Cela me donne une vue détaillée des spécifications de la table en cliquant sur l'icône « Hive Metastore » (à gauche). Après avoir cliqué sur le bouton, des panneaux affichant les informations sur les attributs de la table (pages 1 et 2) devraient apparaître à droite de l'écran.

métastore de la ruche
Hive Metastore
attributs de table page 1
Table Attribute Page 1















Attributs du tableau Page 2
Table Attributes Page 2

J'ai ensuite chargé un fichier de données utilisé dans la série d'articles Iceberg avec Spark et créé des enregistrements dans la table « test_company_stocks ». Je traiterai de l'utilisation de Spark dans la deuxième partie de cet article, mais après le chargement, je constate que les données sont conservées. J'ai chargé le fichier dans une table de staging séparée, puis effectué une opération SQL dans l'IDE : « INSERT INTO.....SELECT * FROM staging_table » afin de pouvoir démontrer le résultat.


Après avoir exécuté la commande « INSERT » dans DBeaver, accédez immédiatement à la console HiveServer2, cliquez sur la requête, puis sur « Journal des opérations » (si vous l'avez configuré comme précédemment). Vous devriez obtenir un résultat similaire à celui-ci :

Journal des opérations pour les requêtes SQL
Operation Log for SQL Query

Si vous copiez/collez l'URL sélectionnée dans un onglet de navigateur, vous devriez voir la fenêtre « Applications Hadoop ». C'est ici que vous pouvez surveiller la tâche « MapReduce » qui traduit les données d'une table à une autre dans Hadoop :

Fenêtre d&#39;application Hadoop
Hadoop Application Window

En cliquant sur « Outils > Journaux » dans le menu de gauche, vous pouvez consulter la progression de la tâche dans les fichiers journaux. Pour les plus curieux, si vous définissez « tmp » ou « scratchdir » à des emplacements spécifiques pour Hive, vous pouvez voir les objets temporaires dans le système de fichiers du système d'exploitation ou dans le système de fichiers Hadoop, si vous avez choisi cette option pour les fichiers de travail.


Une fois terminé, je suis retourné à DBeaver et j'ai exécuté « select * from test_company_stock », et j'ai pu voir ceci :

Ensemble de résultats de Hive
Result Set from Hive

Le dossier « test_company_stocks » dans Hadoop devrait désormais contenir un sous-dossier appelé « data » contenant des partitions et des fichiers Parquet, car il utilise Iceberg. Dans mon cas, c'était le cas, comme illustré ci-dessous :


Répertoire de données avec partitions
Data Directory with Partitions
Fichier de données de parquet dans la partition
Parquet Data File within Partition
À ce stade, j'étais convaincu que mon infrastructure, hormis Apache Drill, était en bon état pour commencer le traitement des données, et que Spark + Hive + Iceberg/Hadoop avait été validé. Le prochain article se concentrera sur quelques scénarios de traitement de données et sur l'utilisation d'Apache Drill avec le catalogue Hive.
bottom of page