top of page

Apache Iceberg, Hadoop und Hive: Öffnen Sie Ihren Datalake (Lakehouse) -> Teil I

Aktualisiert: 22. Juni

In einem früheren Beitrag habe ich kurz zusammengefasst , welche Unterscheidungsmerkmale einen Datalake und ein Lakehouse ausmachen. Datenmanagement und -organisation waren die wichtigsten Erkenntnisse, die ein Lakehouse ausmachten, sowie das Fehlen von Hinweisen auf einen Datalake und die höhere Geschwindigkeit der Dateneingabe. Nun gehe ich der Frage nach, wie man beide Muster – Datalake oder Lakehouse – für Benutzer nutzbar machen kann. Ich werde dieses Thema in zwei Teile unterteilen: Der erste konzentriert sich auf die Infrastruktur, der zweite auf Dateninhalte und -zugriff.
Data Lake und Hive
Datalake and Hive

Trotz der Unterschiede können Sie bei der Bereitstellung Ihrer Infrastruktur große Schritte in Richtung einer Lakehouse- oder Datalake-Architektur unternehmen. Zwar werden damit keine der zusätzlichen Prozesse einer Datenverwaltungspraxis abgedeckt, aber Sie können sich darauf einstellen.


In meinen vorherigen Beiträgen zu Apache Iceberg habe ich die Datenverwaltungsfunktionen von Iceberg, insbesondere die Schemaverwaltung, hervorgehoben. Daher habe ich meine Mini-Modellarchitektur mit Iceberg begonnen.


Für meine Datenverarbeitungsplattform setze ich auf Open Source. Ich glaube aber nicht, dass es bessere kommerzielle Produkte gibt. Die Plattformentscheidung war etwas komplexer. Ich habe sowohl DASK als auch Apache Spark als Verarbeitungs-Engines verwendet und eingesetzt, die parallele Verarbeitung auf CPUs (aus Kostengründen sehr bevorzugt) und GPUs ermöglichen. Natürlich sind GPU-Anbieterbibliotheken erforderlich, um beide zu erweitern, aber die Datenverarbeitung ist eine Verschwendung von GPUs – sie sind für diese Aufgabe nicht geeignet.


Ich habe mich aufgrund der großen Community und des großen Hersteller-Supports für Apache Spark entschieden. Die Anlaufzeit für Bereitstellung und Betrieb ist sehr kurz, selbst wenn die Knotenzahl nur einstellig ist – es sei denn, Sie nutzen einen Cloud-Anbieter mit schneller Skalierung. Spark erfordert außerdem keine Python-Programmierung für Parallelität. Da ich Iceberg (und Hadoop) nutzte, ist die Integration mit Spark bereits integriert, was die Integration (meiner Meinung nach) reibungsloser gestalten sollte.


Um den Benutzerabfragezugriff auf die Daten zu ermöglichen, habe ich mich aufgrund der Integration für Apache Hive und Drill entschieden. Es gibt viele andere Open-Source-Tools und kommerzielle Produkte, die je nach Ihren spezifischen Anforderungen möglicherweise sinnvoller sind. Mit diesem Tool können Sie jedoch ohne Lizenzkosten loslegen.


Nachfolgend sehen Sie eine Darstellung dieser Auswahlmöglichkeiten mit Pfeilen, die die Datenflüsse (idealerweise) darstellen:

Erwarteter Datenfluss
Expected Data Flow

Datalake: Einrichten von Apache Hadoop und Apache Iceberg

Für Hadoop ist die Installation von JDK v8 oder neuer erforderlich. Ich habe Homebrew verwendet, um openjdk@17 zu installieren, da diese Version alle oben aufgeführten Apache-Produkte unterstützt.


Je nach verwendeter Plattform können Sie Hadoop manuell per Download oder über einen Paketmanager installieren. Ich habe auch Homebrew für die Installation verwendet:

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

vi core-site.xml 

Ich hatte dies bereits im Rahmen der Iceberg-Installation aus meinem Beitrag zu diesem Thema getan, aber Ihre core-site.xml sollte im Grunde wie die in der folgenden Liste aussehen. Ich habe die Punkte, auf die Sie besonders achten sollten, fett markiert und aufgrund meiner lokalen Konfiguration die anonyme Authentifizierung aktiviert. In den meisten Fällen sollte die Authentifizierung aktiviert/erforderlich sein. Voraussetzung sind die Verfügbarkeit von Dateisystemspeicherorten und Speicherplatz für die Installation von 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>

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

Die obige Liste der Konfigurationsdateien entspricht der Konfiguration, die ich auch mit Apache Iceberg verwendet habe. Anschließend habe ich das .bashrc -Skript in meinem Home-Verzeichnis so konfiguriert, dass es die Variablen für Hadoop enthält. Sollte die .bashrc- Datei beim Öffnen der Shell-Sitzung nicht ausgeführt werden, müssen Sie sie manuell mit „ source ~/.bashrc “ starten. Die enthaltenen Variablen werden für den Betrieb (Start/Herunterfahren, Jobs) der Iceberg/Hadoop-, Hive- und Spark-Produkte benötigt:

.bashrc – Nur 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

Sie können Hadoop starten und beenden, indem Sie $HADOOP_HOME/sbin/start-all.sh und stop-all.sh am selben Speicherort verwenden. Wenn Sie wie ich die Python-Bibliotheken verwenden, müssen Sie das Paket pyiceberg über pip oder conda installieren. Wenn „ start-all.sh “ dann korrekt ausgeführt wird, rufen Sie die URL http://localhost:9870/ in Ihrem Browser auf. Sie sollten dann etwa Folgendes sehen:

Hadoop-Home-Benutzeroberfläche
Hadoop UI

Ich hatte zuvor das JAR für Apache Iceberg heruntergeladen , sodass ich an diesem Punkt das Iceberg-JAR zu meinem Klassenpfad (oder $HADOOP_HOME/lib ) hinzufügen kann und dann über die volle Funktionalität von Iceberg und Hadoop verfügen sollte.


Einrichten von Apache Spark

Mein nächster Schritt war die Einrichtung von Spark Standalone. Ich entschied mich für die Version 4.0.0 und installierte sie erneut mit Homebrew . Mit meiner Hadoop/Iceberg-Installation funktionierte es einwandfrei, aber nach der Installation von Apache Hive 4.0.1 traten zeitweise Probleme mit der Katalogerkennung auf, die auch bei anderen bekannt waren. Daher entschied ich mich für Spark 3.5.6 und verwendete erneut Homebrew. Ähnlich wie bei der oben beschriebenen Hadoop-Installation gibt es start-all.sh und stop-all.sh im Verzeichnis $SPARK_HOME/sbin . Nach dem Start sollten Sie zu http://127.0.0.1:8080/ gehen und Folgendes sehen:

Spark-Benutzeroberfläche
Spark Standalone UI

Ich habe auch meine Datei $SPARK_HOME/conf/ spark-defaults.co nf erstellt und angepasst, die beim Start von Spark gelesen wird und Folgendes enthielt:

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

Die Werte beziehen sich auf Hive-Nutzung und -Integration. Ich habe außerdem die Datei spark-env.sh erstellt (aus einer Vorlage) und angepasst. Skript im Verzeichnis $SPARK_HOME/conf, das Folgendes enthalten soll:

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

Zu diesem Zeitpunkt verfügte ich über eine funktionsfähige Spark-Umgebung und testete, ob die Scala- und Pyspark-Shells über die Befehlszeilenschnittstelle gestartet werden konnten. Dies taten sie erfolgreich. Außerdem führte ich einige Anweisungen aus. Anschließend führte ich eine Pip-Installation für Pyspark durch, da ich die Shell beim Testen nicht verwenden wollte. Den Rest meiner Spark-Installation testete ich mit einem einfachen Skript, das eine SparkSession öffnete und eine durch Trennzeichen getrennte Datei aus einem HDFS-Speicherort in einen Dataframe einlas. Pyspark wurde in das Skript importiert. Außerdem hatte ich der .bashrc- Datei die folgenden Variablen hinzugefügt:

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

Apache Hive einrichten

Wie bereits erwähnt, hatte ich mit Apache Spark 4.0.0 und Apache Hive 4.0.1 begonnen. Nach einigen Problemen habe ich Spark jedoch auf Version 3.5.6 heruntergestuft und zusätzlich die Version 4.0.0 von Apache Hive installiert. Die älteren Hive-Versionen finden Sie hier . Ich habe die Datei apache-hive-4.0.0-bin.tar.gz heruntergeladen und an meinen Zielspeicherort verschoben. Anschließend habe ich in einer Shell auf meinem MacBook Folgendes ausgeführt:

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

Dann habe ich meiner .bashrc die folgenden Umgebungsvariablen hinzugefügt:

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

Die Speicherlimits dienen dazu, Fehler aufgrund unzureichenden Arbeitsspeichers zu vermeiden. Der Rest ist selbsterklärend, wenn man die Hive-Dokumentation liest. Die Variablen, die auf „HIVE_SERVER2“ verweisen, werden für die bevorstehende Installation benötigt.


Da ich zuvor eine Remote-PostgreSQL-Datenbank für den Iceberg-Katalog verwendet hatte, ging ich mit Hive denselben Weg. Unter Verwendung der Postgres-Installation aus der Bereitstellung kopierte ich den Postgres-JDBC-Treiber in den Speicherort $HIVE_HOME/lib, um ihn dem Hive-Klassenpfad hinzuzufügen.


Ich habe mit der neuesten Hive -Dokumentation und dem AdminManual begonnen und anschließend die Hive- Version 4.0.0 für die Tarball-Installation heruntergeladen. Ich habe die Anweisungen befolgt, die angegebenen Änderungen an meiner Bashrc-Datei und der Konfiguration vorgenommen und anschließend mit der Installation des Hive Metastore fortgefahren.


Wie ich oben angegeben habe, wollte ich einen Remote-Metastore mit PostgreSQL verwenden, also habe ich die Postgres-Datenbank manuell mithilfe einer JDBC-Verbindung mit DataGrip erstellt und sie Metacatalog genannt. Anschließend habe ich aus der bereitgestellten Vorlagendatei eine hive-site.xml erstellt und mit der Aktualisierung der Konfiguration begonnen. Dabei habe ich MySQL durch Postgres ersetzt (siehe Website-Dokumentation). Sie werden außerdem feststellen, dass ich einige Parameter für die Einrichtung von HiveServer2 eingefügt habe. Details finden Sie unten:

Konfigurationsparameter

Konfigurationswert

Kommentar

javax.jdo.option.ConnectionURL

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

Metadaten werden auf einem PostgreSQL-Server gespeichert

javax.jdo.option.ConnectionDriverName

JDBC-Treiberklasse

javax.jdo.option.ConnectionUserName

<username>

Benutzername für die Verbindung mit Postgres

javax.jdo.option.ConnectionPassword

<password>

Passwort für die Verbindung mit Postgres

hive.metastore.warehouse.dir

Standardspeicherort für Hive-Tabellen (Hadoop)

Hostname, an den der Metastore-Dienst gebunden werden soll. Wenn leer, wird „localhost“ verwendet. Diese Konfiguration ist ab Hive 4.0.0 verfügbar.

hive.metastore.uris

Sparsamkeit:// localhost:9083

Host und Port für den Thrift-Metastore-Server. Wenn hive.metastore.thrift.bind.host angegeben ist, sollte der Host mit dieser Konfiguration übereinstimmen. Weitere Informationen hierzu finden Sie in den Konfigurationsparametern für die dynamische Diensterkennung.

Ich bin mir sicher, dass jeder zur Kenntnis genommen hat, dass die Speicherung von Benutzernamen und Passwörtern in der Datei hive-site.xml im Klartext in den meisten Sicherheitskonfigurationen nicht zulässig ist. Ich gehe davon aus, dass die meisten Organisationen SAML 2.0 und Single Sign-On verwenden werden.


Als nächstes habe ich den Hive-Metastore nach den Konfigurationsänderungen als Dienst im Hintergrund gestartet.

$HIVE_HOME/bin/hive --service metastore &

Ich hatte ursprünglich versucht, den Metastore mit der Konfigurationsoption „ create=true “ in der JDBC-URL zu starten, hatte aber nur teilweisen Erfolg. Daher wechselte ich zu „ create=false “ und führte mithilfe des Schema-Tools eine manuelle Bereitstellung durch. Der Dienst konnte erfolgreich gestartet und die Hive-Katalogtabellen mit dem Tool bereitgestellt werden:

Postgres Hive-Metakatalog
Postgres Hive Meta-catalog

In der mit Hive 4.0.0 gelieferten Katalogversion sollten 83 Tabellen in der Datenbank vorhanden sein, vorausgesetzt, sie war zu Beginn leer. Nach dem Start des Metastore-Dienstes mit den Parameteränderungen nach Verwendung des Schema-Tools waren die Startprotokolle sauber, sodass ich mit der Hive-Serverbereitstellung fortfahren konnte.


Ich hatte bereits einige der oben genannten Parameter für HiveServer2, aber ich musste noch einige Änderungen an der hive-site.xml vornehmen, um die Aufgabe abzuschließen. Zunächst wollte ich den HTTP-Modus statt den Binärmodus ausführen, daher habe ich den Wert von hive.server2.transport.mode in der XML-Datei auf „ http “ aktualisiert. Anschließend habe ich der hive-site.xml die erforderlichen Mindestwerte hinzugefügt, darunter die Werte für den HTTP-Modus (Tabelle im Link). Außerdem habe ich Folgendes getan:

  1. Deaktivieren von SSL
  2. Verwendete JDBC-URL mit http-Parametern: jdbc:hive2:// localhost:10001/default;transportMode=http;httpPath=cliservice
  3. Protokollierungskonfiguration
  4. Anonyme Authentifizierung
  5. Scratch-Dir-Konfiguration für Hive

Dann habe ich den Dienst gestartet:

$HIVE_HOME/bin/hive --service hiveserver2

Beim Besuch von http://localhost:10002 sehe ich das Folgende


hiveserver2
HiveServer2 Home UI

Zu diesem Zeitpunkt schien es zumindest lauffähig zu sein, also installierte und öffnete ich DBeaver , um die Funktionalität von Hive zu überprüfen. Ich stellte eine JDBC-Verbindung zu Hive mit DBeaver her und fügte eine Hive-Datenquelle ohne Authentifizierung hinzu, wobei ich die obige URL verwendete:

Hive JDBC Connection
Hive JDBC Connection

Ich habe eine Verbindung hergestellt und Folgendes gesehen:

Connected to Hive
Connected to Hive

Geöffnete URL für HiveServer2:

Hive UI Output
Hive UI Output

Nachdem ich eine Verbindung zur Hive-Datenbank validiert hatte, wollte ich als Nächstes eine Tabelle erstellen, um die Integration von Hive, Iceberg und Hadoop zu validieren. Ich habe die Anweisung „create table“ aus den Apache Iceberg-Beiträgen verwendet und eine einfache Änderung vorgenommen, um das Zeilenformat „serde“ für Hive/Iceberg einzubinden:


Habe das Skript ausgeführt:

erstellte Tabelle
Created Table
Hive-Katalogtabelle
Hive Catalog of Table





















Hive-UI-Ausgabe : Durch Klicken auf den Drilldown-Link erhalten Sie Ausführungspläne und Betriebsprotokolle für die Anweisungsausführung:

Hive-UI-Ausgabe zum Erstellen einer Tabelle
Hive UI Output for Create Table

Hadoop -Ordner mit Metadatenordner für Apache Iceberg:

Hadoop-Ordner für die Tabelle
Hadoop Folder for table
Iceberg metadata.json-Datei in Hadoop
Iceberg metadata.json file in Hadoop
Als Nächstes habe ich meiner Pycharm IDE eine Verbindung zu Hive und Hadoop hinzugefügt, damit ich beim Schreiben von Pyspark-Skripten erweiterte Tabellenattribute durchsuchen und anzeigen kann. Sie müssen das Spark-Plugin hinzufügen, wenn Sie eine ältere Version der IDE verwenden; in neueren Versionen ist es bereits vorinstalliert, wenn Sie eine „Pro“-Lizenz verwenden.

Öffnen Sie „Big Data Tools“, um die Verbindungen herzustellen:

PyCharm Big Data-Tools
PyCharm Big Data Tools









Durch Klicken auf das Symbol „ Hive Metastore “ (links) erhalte ich eine detaillierte Ansicht der Tabellenspezifikationen. Nach dem Klick auf die Schaltfläche erscheinen auf der rechten Seite des Bildschirms Felder mit Informationen zu den Tabellenattributen (Seite 1 + 2):

Hive-Metastore
Hive Metastore
Tabellenattribute Seite 1
Table Attribute Page 1















Tabellenattribute Seite 2
Table Attributes Page 2

Anschließend lud ich eine Datendatei, die ich in der Iceberg-Artikelserie verwendet hatte, mit Spark und erstellte Datensätze in der Tabelle „test_company_stocks“. Die Verwendung von Spark beschreibe ich in Teil II dieses Artikels. Nach dem Laden konnte ich jedoch sehen, dass die Daten persistent waren. Ich lud die Datei in eine separate Staging-Tabelle und führte anschließend in der IDE eine SQL-Operation aus: „ INSERT INTO.....SELECT * FROM staging_table“ , um zu demonstrieren, was passiert.


Nachdem Sie den Befehl " INSERT " in DBeaver ausgeführt haben, können Sie direkt zur HiveServer2-Konsole gehen, auf die Abfrage klicken und dann zu "Operation Log" wechseln (vorausgesetzt, Sie haben es wie zuvor konfiguriert). Sie sollten eine Ausgabe wie diese sehen:

Betriebsprotokoll für SQL-Abfragen
Operation Log for SQL Query

Wenn Sie die markierte URL in einen Browser-Tab kopieren/einfügen, sollte das Fenster „Hadoop-Anwendungen“ angezeigt werden. Hier können Sie den „MapReduce“-Job überwachen, der die Daten innerhalb von Hadoop von einer Tabelle in eine andere übersetzt:

Hadoop-Anwendungsfenster
Hadoop Application Window

Wenn Sie im linken Menü auf „ Tools -> Protokolle “ klicken, können Sie den Fortschritt des Jobs in den Protokolldateien verfolgen. Für alle, die es besonders interessiert: Wenn Sie „tmp“ oder „scratchdir“ auf bestimmte Speicherorte für Hive setzen, können Sie die temporären Objekte im Betriebssystem- oder Hadoop-Dateisystem sehen, sofern Sie diese Option für Scratch-Dateien gewählt haben.


Nach Abschluss ging ich zurück zu DBeaver und führte „select * from test_company_stock“ aus und sah Folgendes:

Ergebnismenge von Hive
Result Set from Hive

Der Ordner „test_company_stocks“ in Hadoop sollte nun einen Unterordner namens „data“ mit Partitionen und Parquet-Dateien enthalten, da Iceberg verwendet wird. In meinem Fall war dies der Fall, wie unten gezeigt:


Datenverzeichnis mit Partitionen
Data Directory with Partitions
Parquet-Datendatei innerhalb der Partition
Parquet Data File within Partition
Zu diesem Zeitpunkt war ich zufrieden, dass meine Infrastruktur, abgesehen von Apache Drill, für den Start der Datenverarbeitung bereit war und Spark, Hive und Iceberg/Hadoop validiert waren. Der nächste Beitrag konzentriert sich auf einige Datenverarbeitungsszenarien und die Verwendung von Apache Drill mit dem Hive-Katalog.
bottom of page