Wie behebe ich „OutOfMemoryError“ -Hive-Java-Heap-Space-Ausnahmen in Amazon EMR, die auftreten, wenn Hive die Abfrageergebnisse ausgibt?

Lesedauer: 8 Minute
0

Ich führe eine Apache Hive-Abfrage auf Amazon EMR. Hive löst bei der Ausgabe der Abfrageergebnisse eine OutOfMemoryError-Ausnahme.

Kurzbeschreibung

Die OutOfMemoryError-Ausnahme tritt normalerweise bei INSERT OVERWRITE-Befehlen auf, wenn auf hive-server2, dem Hive-Metastore oder der Clientseite nicht genügend Heap-Speicherplatz vorhanden ist. Um dieses Problem zu beheben, erhöhen Sie die maximale Speicherzuweisung für die JVM oder erhöhen Sie HADOOP_HEAPSIZE.

Behebung

Verwenden Sie eine oder mehrere der folgenden Lösungen, um OutOfMemoryError-Ausnahmen zu beheben.

Hinweis: Diese Lösungen decken keine OutOfMemoryError-Ausnahmen ab, die während der Optimierung des Apache Tez-Container-Speichers auftreten.

Erhöhen Sie die maximale Speicherzuweisung für die JVM

Wenn Sie eine Hive-Shell starten, wird standardmäßig 1 GB Speicher zugewiesen. Die maximale Speicherzuweisung wird durch den Parameter **-Xmx **definiert. Wenn Ihr Prozess versucht, mehr als den Maximalwert zu verwenden, beendet Hive den Prozess und löst die OutOfMemoryError-Ausnahme. Um dieses Problem zu beheben, erhöhen Sie den ****-Xmx-Wert im Hive-Shell-Skript (in MB) und führen Sie dann Ihre Hive-Abfrage erneut.

Identifizieren Sie den OutOfMemory-Fehler in Protokollen

Suchen Sie in Ihrem Protokollverzeichnis nach dem folgenden Fehler (z. B.: /mnt/var/log/hive/user/hadoop/hive.log):

# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
#   Executing /bin/sh -c "kill -9 12345"...
Killed

Wenn Sie diese Fehlermeldung sehen, ist der JVM-Heap-Speicherplatz knapp. Erhöhen Sie HADOOP_HEAPSIZE für den Hive-CLI-Dienst in /etc/hive/conf/hive-env.sh, wie im folgenden Beispiel dargestellt. Sie können den HADOOP_HEAPSIZE auch mithilfe der Amazon EMR-Rekonfigurations-API für die hive-env-Klassifizierung erhöhen. Der Standardwert ist 1000. Erhöhen Sie es entsprechend Ihrem Anwendungsfall. Führen Sie dann die Hive-Abfrage erneut.

export HADOOP_HEAPSIZE=2048

Wichtig: Diese Einstellung gilt für hive-server2, den Hive-Metastore und die Hive-CLI, nachdem diese Dienste neu gestartet wurden. Optional können Sie für jeden dieser Dienste separate Werte festlegen.

Aktualisierung der Speicherzuweisung beim Erstellen eines Clusters

Amazon EMR stellt den Konfigurations-API-Vorgang bereit, um die Standardkonfiguration zu aktualisieren, wenn Sie den Cluster mithilfe des Konfigurationsobjekts aktualisieren. Aktualisieren Sie den HADOOP_HEAPSIZE-Wert basierend auf Ihrem Anwendungsfall:

{
  "Classification": "hive-env",
  "Properties": {},
  "Configurations": [
    {
      "Classification": "export",
      "Properties": {
        "HADOOP_HEAPSIZE": "2048"
      },
      "Configurations": []
    }
  ]
}

Aktualisierung der Speicherzuweisung in einem laufenden Cluster

Sie können den Wert von HADOOP_HEAPSIZE auf einem laufenden Cluster erhöhen, indem Sie entweder über SSH oder die Amazon EMR-Rekonfigurations-API eine Verbindung zum Mastermodus herstellen. Die Amazon EMR-Rekonfigurations-API ist nur für Amazon EMR-Versionen 5.21 und höher verfügbar. Wenn die Speicheraktualisierungen per SSH im Cluster vorgenommen werden, müssen Sie die Hive-Dienste neu starten, damit die Änderungen wirksam werden.

Beeline oder SQL Workbench/J

1.    Wenn Sie dieselbe Abfrage von Beeline oder SQL Workbench/J aus ausführen, überprüfen Sie /mnt/var/log/hive/hive-server2.log und hive-server2.out auf Fehler bei der Speicherbereinigung im Heapspace. Zum Beispiel:

Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://emr-analytics_master.abc.aws.> select id, name, x.* from mydb.location a, curated_admin.nxpepnd1_tpn_prvdr_pra_fclt b, curated_admin.test_table c where a.test = b._id and a._id = b._id and b._prod_id = c.prod_f_id;
#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
#   Executing /bin/sh -c "kill -9 27745"...
Killed

2.    Wenn Sie ähnliche Fehler finden, erhöhen Sie HADOOP_HEAPSIZE für hive-server2 in /etc/hive/conf/hive-env.sh. Diese Einstellung gilt auch für den Hive-Metastore und den Hive-Client.

export HADOOP_HEAPSIZE=2048

Verwenden Sie optional bedingte Anweisungen, um unterschiedliche Heap-Größen für hive-server2, den Metastore und den Client anzugeben. Zum Beispiel:

export HIVE_CLIENT_HEAPSIZE=1024
export HIVE_METASTORE_HEAPSIZE=2048
export HIVE_SERVER2_HEAPSIZE=3072
if [ "$SERVICE" = "metastore" ]
then
export HADOOP_HEAPSIZE=$HIVE_METASTORE_HEAPSIZE
elif [ "$SERVICE" = "hiveserver2" ]
then
export HADOOP_HEAPSIZE=$HIVE_SERVER2_HEAPSIZE
export HADOOP_OPTS="$HADOOP_OPTS -server -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/hive"
else
export HADOOP_HEAPSIZE=$HIVE_CLIENT_HEAPSIZE
fi

3.    Führen Sie die Hive-Abfrage erneut aus, nachdem Sie diese Einstellungen aktualisiert haben. Wenn Sie immer noch die OutOfMemoryError-Ausnahme erhalten und Sie mehrere Clients gleichzeitig ausführen, fahren Sie mit Schritt 4 fort. Wenn Sie immer noch die OutOfMemoryError-Ausnahme erhalten und Sie nicht mehrere Clients gleichzeitig ausführen, fahren Sie mit Schritt 8 fort.

4.    Erhöhen Sie die -Xmx-Parameter für jeden Client entsprechend Ihrem Anwendungsfall.

5.    Wählen Sie den Garbage Collector, der für Ihren Anwendungsfall geeignet ist, indem Sie -XX:+useParNewGC (neuer paralleler Garbage Collector) oder -XX:+useConcMarkSweepGC (concurrent Mark Sweep Garbage Collector) in den HADOOP_OPTS-Zeilen hinzufügen, wie im folgenden Beispiel gezeigt. Weitere Informationen zur Auswahl eines Garbage-Collectors finden Sie in der Java-Dokumentation unter Garbage Collection und Java HotSpot VM-Optionen.

export HADOOP_HEAPSIZE=2048
if [ "$SERVICE" = "cli" ]; then
if [ -z "$DEBUG" ]; then
export HADOOP_OPTS="$HADOOP_OPTS -XX:NewRatio=12 -Xmx12288m -Xms10m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:+useParNewGC -XX:-useGCOverheadLimit"
else
export HADOOP_OPTS="$HADOOP_OPTS -XX:NewRatio=12 -Xmx12288m -Xms10m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:-useGCOverheadLimit"
fi
fi

6.    Hive löst die OutOfMemoryError-Ausnahme aus, wenn die Speicherbereinigung innerhalb einer bestimmten Zeit nicht erfolgreich ist. Um das Zeitlimit aufzuheben, entfernen Sie -XX:-UseGCoverHeadLimit oder ersetzen Sie es durch -XX:+UseGCoverHeadLimit. Ändern Sie optional **-XX: -UseGCoverheadLimit, **um ein neues Zeitlimit für die Speicherbereinigung festzulegen. Weitere Informationen finden Sie unter The Parallel Collector in der Java-Dokumentation.

7.    Führen Sie die Hive-Abfrage erneut. Wenn Hive während der Laufzeit einen Heap-Space-Fehler auf dem Terminal ausgibt — und wenn es keine Fehler in hive.log oder hive-server2.log gibt — dann geht Ihrem Hive-Client wahrscheinlich der Arbeitsspeicher. Zum Beispiel:

Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://emr-analytics_master.abc.aws.> select id, name, x.* from mydb.location a, curated_admin.nxpepnd1_tpn_prvdr_pra_fclt b, curated_admin.test_table c where a.test = b._id and a._id = b._id and b._prod_id = c.prod_f_id;
#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
#   Executing /bin/sh -c "kill -9 27745"...
Killed

8.    Um diesen Fehler zu beheben, erhöhen Sie den Client-Speicher und führen Sie die Abfrage dann erneut.

9.    Wenn Hive immer noch die OutOfMemoryError-Ausnahme auslöst, führen Sie die folgenden Schritte für Ihren Client.

Beeline:

Standardmäßig versucht Beeline, die gesamte Ausgaberelation zu puffern, bevor sie auf ****stdout gedruckt wird. Dieses Verhalten kann zu einer OutOfMemoryError-Ausnahme führen, wenn die Ausgaberelation groß ist. Um die OutOfMemoryError-Ausnahme in Beeline zu beheben, starten Sie Beeline mit dem folgenden Befehl und versuchen Sie dann erneut, die Hive-Abfrage auszuführen:

beeline --incremental=true

SQL-Workbench/J:

In einer 32-Bit-Java-Runtime-Umgebung (JRE) kann die Anwendung standardmäßig bis zu 1 GB Speicher verwenden. In einer 64-Bit-JRE kann die Anwendung standardmäßig bis zu 65% des verfügbaren physischen Speichers nutzen. Um zu überprüfen, wie viel Speicher für die Anwendung verfügbar ist, wählen Sie **Hilfe **und dann Über.

  • Für macOS: Erhöhen Sie den Wert -xmx1024m in der Datei Info.plist nach Bedarf. Info.plist befindet sich normalerweise im Verzeichnis /Applications/SqlWorkbenchJ2.app/Contents. Um beispielsweise die für die Anwendung verfügbare Speichermenge zu verdoppeln, ändern Sie den Wert von -Xmx1024m zu -Xmx2048m. Führen Sie dann die Abfrage erneut.
  • Für Windows: Erstellen Sie eine INI-Datei und fügen Sie dann den Parameter vm.heapsize.preferred zur INI-Datei hinzu, um den Speicherplatz zu erhöhen, der der Anwendung zur Verfügung steht.

Wenn Sie Shell- oder Batch-Skripts verwenden, können Sie den verfügbaren Speicher erhöhen, wenn Sie SQL Workbench/J installieren. Der Befehl im folgenden Beispiel erstellt während der Installation 3 GB verfügbaren Speicher:

java -Xmx3g -jar sqlworkbench.jar

Hinweis: Wenn die OutOfMemoryError-Ausnahme auf der Clientseite und nicht auf hive-server2 oder der Hive-CLI auftritt, speichern Sie die Ausgabe in Amazon Simple Storage Service (Amazon S3) oder HDFS. Verwenden Sie nicht Beeline oder SQL Workbench/J, um die Abfrageergebnisse anzuzeigen.

Hive neu starten

Wenn Sie die Hive-Eigenschaften in hive-site.xml oder hive-env.sh ändern, müssen Sie Hive möglicherweise neu starten, bevor die aktualisierten Einstellungen wirksam werden. Ein Neustart von Hive-Server 2 wirkt sich auf die laufenden Abfragen im Cluster. Es hat sich bewährt, die Prozesse neu zu starten, wenn keine Abfragen ausgeführt werden oder während eines geplanten Wartungsfensters.

Die Befehle, die Sie verwenden, um Hive-Prozesse neu zu starten, variieren je nach Amazon EMR-Release-Version. Weitere Informationen finden Sie unter Wie starte ich einen Dienst in Amazon EMR neu?

Für Amazon EMR-Release-Versionen 5.30 und höher oder 6.0 und höher:

  1. Stellen Sie über SSH eine Verbindung zum Master-Knoten her.

2.    Starten Sie den Metastore neu:

sudo systemctl stop hive-hcatalog-server
sudo systemctl start hive-hcatalog-server
sudo systemctl status hive-hcatalog-server

3.    Starten Sie hive-server 2 neu:

sudo systemctl stop hive-server2
sudo systemctl start hive-server2
sudo systemctl status hive-server2

Für die Amazon EMR-Release-Versionen 4.7.0 bis 5.29:

  1. Stellen Sie über SSH eine Verbindung zum Master-Knoten her.

2.    Starten Sie den Metastore neu:

sudo stop hive-hcatalog-server
sudo start hive-hcatalog-server
sudo status hive-hcatalog-server

Hinweis: Versuchen Sie nicht, den Metastore mit dem Befehl **sudo restart **hive-hcatalog-server neu zu starten.

3.    Starten Sie hive-server2 neu:

sudo stop hive-server2
sudo start hive-server2
sudo status hive-server2

Für die Amazon EMR-Release-Versionen 4.0.0 bis 4.6:

  1. Stellen Sie über SSH eine Verbindung zum Master-Knoten her.

2.    Starten Sie den Metastore neu:

sudo stop hive-metastore
sudo start hive-metastore
sudo status hive-metastore

3.    Starten Sie hive-server2 neu:

sudo stop hive-server2
sudo start hive-server2
sudo status hive-server2

Ähnliche Informationen

Wie kann ich Protokolle verwenden, um Probleme mit Hive-Abfragen in Amazon EMR zu beheben?

Skalierung der Clusterressourcen

Konfiguration der Aufgabe

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren