Eine Hive-Tabelle einrichten, um Hive-Befehle auszuführen - Amazon EMR

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Eine Hive-Tabelle einrichten, um Hive-Befehle auszuführen

Apache Hive ist eine Data Warehouse-Anwendung, mit der Sie in EMR Amazon-Clustern enthaltene Daten in einer SQL ähnlichen Sprache abfragen können. Weitere Informationen zu Hive finden Sie unter http://hive.apache.org/.

Beim folgenden Verfahren wird davon ausgegangen, dass Sie bereits einen Cluster erstellt und ein EC2 Amazon-Schlüsselpaar angegeben haben. Informationen zu den ersten Schritten beim Erstellen von Clustern finden Sie unter Erste Schritte mit Amazon EMR im Amazon EMR Management Guide.

Konfigurieren Sie Hive für die Verwendung MapReduce

Wenn Sie Hive on Amazon verwenden, EMR um DynamoDB-Tabellen abzufragen, können Fehler auftreten, wenn Hive die Standard-Ausführungs-Engine Tez verwendet. Aus diesem Grund empfehlen wir, bei der Erstellung eines Clusters mit Hive, der wie in diesem Abschnitt beschrieben in DynamoDB integriert ist, eine Konfigurationsklassifizierung zu verwenden, die Hive auf die Verwendung festlegt. MapReduce Weitere Informationen finden Sie unter Anwendungen konfigurieren.

Der folgende Ausschnitt zeigt die Konfigurationsklassifizierung und die Eigenschaft, die verwendet werden sollen, um sie MapReduce als Ausführungs-Engine für Hive festzulegen:

[ { "Classification": "hive-site", "Properties": { "hive.execution.engine": "mr" } } ]
Interaktives Ausführen von Hive-Befehlen
  1. Herstellen einer Verbindung mit dem Master-Knoten. Weitere Informationen finden Sie unter Connect dem Master-Knoten herstellen SSH im Amazon EMR Management Guide.

  2. Geben Sie an der Eingabeaufforderung für den aktuellen Master-Knoten hive ein.

    Sie sollten eine Hive-Eingabeaufforderung sehen: hive>

  3. Geben Sie einen Hive-Befehl ein, der die Daten in DynamoDB einer Tabelle in der Hive-Anwendung zuordnet. Diese Tabelle fungiert als Referenz für die in Amazon DynamoDB gespeicherten Daten. Die Daten werden nicht lokal in Hive gespeichert und alle Abfragen, die diese Tabelle verwenden, werden mit den Live-Daten in DynamoDB abgeglichen. Dabei wird die Lese- und Schreibkapazität der Tabelle jedes Mal verbraucht, wenn ein Befehl ausgeführt wird. Wenn Sie mehrere Hive-Befehle für denselben Datensatz ausführen möchten, sollten Sie ihn zunächst exportieren.

    Das folgende Beispiel zeigt die Syntax für die Zuweisung einer Hive-Tabelle zu einer DynamoDB-Tabelle.

    CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...");

    Wenn Sie in Hive eine Tabelle mithilfe der DynamoDB erstellen möchten, müssen Sie sie unter Verwendung des Schlüsselworts EXTERNAL als externe Tabelle erstellen. Der Unterschied zwischen internen und externen Tabellen liegt darin, dass die Daten in internen Tabellen gelöscht werden, wenn die interne Tabelle gelöscht wird. Dies ist nicht das gewünschte Verhalten, wenn eine Verbindung zur Amazon DynamoDB besteht und somit werden nur externe Tabellen unterstützt.

    Beispielsweise wird mit dem folgenden Befehl eine Tabelle mit dem Namen hivetable1 in Hive erstellt, die auf die DynamoDB-Tabelle namens dynamodbtable1 verweist. Die DynamoDB-Tabelle dynamodbtable1 hat ein Primärschlüsselschema. hash-and-range Das Hash-Schlüsselelement ist name (Zeichenfolgetyp), das Bereichsschlüsselelement ist year (numerischer Typ) und jedes Element verfügt über einen Attributwert für holidays (Zeichenfolgetyp).

    CREATE EXTERNAL TABLE hivetable1 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");

    Zeile 1 verwendet die HiveQL-Anweisung CREATE EXTERNAL TABLE. Für hivetable1 müssen Sie für jedes Attributnamen-Wertpaar in der DynamoDB-Tabelle eine Spalte erstellen und den Datentyp angeben. Für diese Werte muss die Groß- und Kleinschreibung nicht beachtet werden und Sie können den Spalten beliebige Namen geben (außer reservierten Wörtern).

    Zeile 2 verwendet die STORED BY-Anweisung. Bei dem Wert STORED BY handelt es sich um den Namen der Klasse, die die Verbindung zwischen Hive und DynamoDB handhabt. Er sollte auf 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' festgelegt werden.

    Zeile 3 verwendet die TBLPROPERTIES-Anweisung, um „hivetable1“ mit der richtigen Tabelle und dem Schema in DynamoDB zu verknüpfen. Stellen Sie TBLPROPERTIES die Werte für den dynamodb.table.name-Parameter und dynamodb.column.mapping-Parameter bereit. Bei diesen Werten muss die Groß- und Kleinschreibung beachtet werden.

    Anmerkung

    Alle DynamoDB-Attributnamen für die Tabelle müssen über entsprechende Spalten in der Hive-Tabelle verfügen. Abhängig von Ihrer EMR Amazon-Version treten die folgenden Szenarien auf, wenn die one-to-one Zuordnung nicht existiert:

    • In EMR Amazon-Version 5.27.0 und höher verfügt der Connector über Validierungen, die eine one-to-one Zuordnung zwischen DynamoDB-Attributnamen und Spalten in der Hive-Tabelle sicherstellen. Wenn die Zuordnung nicht existiert, tritt ein Fehler auf. one-to-one

    • In EMR Amazon-Version 5.26.0 und früher enthält die Hive-Tabelle das Name-Wert-Paar aus DynamoDB nicht. Wenn Sie die Primärschlüsselattribute der DynamoDB nicht zuordnen, generiert Hive einen Fehler. Wenn Sie ein nicht-primäres Schlüsselattribut nicht zuordnen, wird kein Fehler generiert, aber die Daten werden auch nicht in der Hive-Tabelle angezeigt. Wenn die Datentypen nicht übereinstimmen, ist der Wert Null.

Anschließend können Sie die Hive-Vorgänge in hivetable1 starten. Abfragen für hivetable1 werden intern über die DynamoDB-Tabelle dynamodbtable1 Ihres DynamoDB-Kontos ausgeführt, wodurch bei jeder Ausführung Lese- oder Schreibeinheiten verbraucht werden.

Wenn Sie Hive-Abfragen über eine DynamoDB-Tabelle ausführen, müssen Sie sicherstellen, dass ausreichend Lesekapazitätseinheiten vorhanden sind.

Nehmen Sie zum Beispiel an, dass Sie 100 Lesekapazitätseinheiten für Ihre DynamoDB-Tabelle bereitgestellt haben. Dadurch können Sie 100 Lesevorgänge oder 409.600 Byte pro Sekunde ausführen. Wenn diese Tabelle 20 GB an Daten enthält (21.474.836.480 Bytes) und Ihre Hive-Abfrage einen vollständigen Tabellen-Scan durchführt, können Sie ermitteln, wie lange die Ausführung der Abfrage dauern wird:

21 474 836 480/409 600 = 52 429 Sekunden = 14,56 Stunden

Die einzige Möglichkeit, um die erforderliche Zeit zu verkürzen, würde eine Änderung der Lesekapazitätseinheiten in der DynamoDB-Quelltabelle notwendig machen. Das Hinzufügen weiterer EMR Amazon-Knoten hilft nicht.

Der Fertigstellungsgrad in der Hive-Ausgabe wird dann aktualisiert, wenn ein oder mehrere Mapper-Prozesse abgeschlossen wurden. Für eine große DynamoDB-Tabelle mit geringer Lesekapazität wird der Fertigungsgrad der Ausgabe ggf. für längere Zeit nicht aktualisiert. Im oben genannten Fall wird der Auftrag mehrere Stunden lang als zu 0 % abgeschlossen angezeigt. Genauere Informationen zum Status Ihres Jobs finden Sie in der EMR Amazon-Konsole. Dort können Sie den Status der einzelnen Mapper-Aufgaben sowie Statistiken zu den gelesenen Daten einsehen. Sie können sich auch bei der Hadoop-Schnittstelle auf dem Master-Knoten anmelden und die Hadoop-Statistiken anzeigen. Hier werden Ihnen der Status einzelner Map-Aufgaben sowie Statistiken für Lesevorgänge angezeigt. Weitere Informationen finden Sie unter den folgenden Themen:

Weitere Informationen über HiveQL-Beispielanweisungen, um Aufgaben auszuführen, die bei der Ausführung von Aufgaben, wie dem Exportieren oder Importieren von DynamoDB-Daten sowie dem Verknüpfen von Tabellen behilflich sind, finden Sie unter Hive-Befehlsbeispiele für das Exportieren, Importieren und Abfragen von Daten in DynamoDB.

Abbrechen einer Hive-Anfrage

Wenn Sie eine Hive-Abfrage ausführen, enthält die Erstantwort vom Server den Befehl, die Anfrage abzubrechen. Um die Anfrage zu jedem Zeitpunkt während des Vorgangs abzubrechen, verwenden Sie den Kill Command (Beendigungsbefehl) aus der Serverantwort.

  1. Geben Sie Ctrl+C ein, um den Befehlszeilen-Client zu beenden.

  2. Geben Sie nach der Shell-Eingabeaufforderung den Kill Command (Beendigungsbefehl) aus der Erstantwort des Servers auf Ihre Anfrage ein.

    Alternativ können Sie den folgenden Befehl von der Befehlszeile des Master-Knotens aus ausführen, um den Hadoop-Job zu beenden. Dabei job-id ist der Bezeichner des Hadoop-Jobs und kann von der Hadoop-Benutzeroberfläche abgerufen werden.

    hadoop job -kill job-id

Datentypen für Hive und DynamoDB

Die folgende Tabelle zeigt die verfügbaren Hive-Datentypen, den DynamoDB-Standardtyp, dem sie entsprechen, und die alternativen DynamoDB-Typen, denen sie auch zugeordnet werden können.

Hive-Typ Standardtyp DynamoDB Alternative DynamoDB-Typ
Zeichenfolge

String (S)

Bigint oder Doppel

Ganzzahl

Binary

Binary (B)

boolesch

boolean () BOOL

Array list (L)

Zahlensatz (ZS), ein Zeichenfolgesatz (ZFS) oder ein Binärsatz (BS)

map<string,string> Element

map (M)

map<string,?> map (M)
null () NULL

Wenn Sie Ihre Hive-Daten als entsprechenden alternativen DynamoDB-Typ schreiben möchten oder wenn Ihre DynamoDB-Daten Attributwerte eines alternativen -Typs enthalten, können Sie die Spalte und den DynamoDB-Typ mit dem Parameter dynamodb.type.mapping angeben. Das folgende Beispiel zeigt die Syntax für die Angabe einer alternativen Typzuweisung.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.type.mapping" = "hive_column1_name:dynamodb_attribute1_datatype");

Der Parameter für die Typzuweisung ist optional und muss nur für die Spalten angegeben werden, die alternative Typen verwenden.

Beispielsweise erstellt der folgende Hive-Befehl eine Tabelle mit dem Namen hivetable2, die auf die DynamoDB-Tabelle dynamodbtable2 verweist. Sie ist mit hivetable1 vergleichbar, außer dass sie die col3-Spalte dem String Set(SS)-Typ zuordnet.

CREATE EXTERNAL TABLE hivetable2 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable2", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays", "dynamodb.type.mapping" = "col3:SS");

In Hive sind hivetable1 und hivetable2 identisch. Wenn jedoch Daten aus diesen Tabellen in die entsprechenden DynamoDB-Tabellen geschrieben werden, enthält dynamodbtable1 Listen, während dynamodbtable2 Zeichenfolgensätze enthält.

Wenn Sie Hive-null-Werte als Attribute des DynamoDB-null-Typs schreiben möchten, ist dies mit dem Parameter dynamodb.null.serialization möglich. Das folgende Beispiel zeigt die Syntax für die Angabe der null-Serialisierung.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.null.serialization" = "true");

Der Serialisierungsparameter Null ist optional und wird auf false gesetzt, wenn er nicht angegeben wird. Beachten Sie, dass DynamoDB null-Attribute unabhängig von der Parametereinstellung als null -Werte in Hive gelesen werden. Hive-Sammlungen mit null-Werten können nur dann in DynamoDB geschrieben werden, wenn der Null-Serialisierungsparameter als true angegeben ist. Andernfalls tritt ein Hive-Fehler auf.

Der bigint-Typ in Hive ist identisch mit dem Java-Typ "long" und der Hive-Doppeltyp entspricht mit dem Java-Doppeltyp im Hinblick auf die Genauigkeit. Das bedeutet, dass Sie für Ihre in DynamoDB gespeicherten numerischen Daten, deren Präzision höher liegt als in den Hive-Datentypen, bei der Verwendung von Hive für den Export oder Import oder bei einem Verweis auf die DynamoDB-Daten mit einem Präzisionsverlust oder einem Scheitern der Hive-Abfrage rechnen müssen.

Exporte des binären Typs von DynamoDB nach Amazon Simple Storage Service (Amazon S3) oder HDFS werden als Base64-kodierte Zeichenfolge gespeichert. Wenn Sie Daten aus Amazon S3 oder HDFS in den DynamoDB-Binärtyp importieren, sollten sie als Base64-Zeichenfolge codiert werden.

Hive-Optionen

Sie können die folgenden Hive-Optionen festlegen, um die Datenübertragung aus Amazon DynamoDB zu verwalten. Diese Optionen gelten nur für die aktuelle Hive-Sitzung. Wenn Sie die Hive-Eingabeaufforderung schließen und später auf dem Cluster erneut öffnen, werden diese Einstellungen auf die Standardwerte zurückgesetzt.

Hive-Optionen Beschreibung
dynamodb.throughput.read.percent

Legt die Rate der Lesevorgänge so fest, dass Ihre von DynamoDB bereitgestellte Durchsatzrate im für Ihre Tabelle zugewiesenen Bereich liegt. Der Wert liegt zwischen 0.1 und 1.5 (einschließlich).

Der Wert für die Standardleserate liegt bei 0,5. Das bedeutet, dass Hive versuchen wird, die Hälfte der Lesekapazität, die für Ressourcen in der Tabelle bereitgestellt ist, zu verbrauchen. Eine Erhöhung dieses Werts auf über 0,5 verbessert die Leseanforderungsrate. Eine Verringerung dieses Werts unter 0,5 verringert die Leseanforderungsrate. Bei dieser Leserate handelt es sich um einen ungefähren Wert. Die tatsächliche Leserate variiert abhängig von Faktoren wie der Tatsache, ob eine einheitliche Verteilung der Schlüssel in DynamoDB vorliegt.

Wenn Sie feststellen, dass der bereitgestellte Durchsatz häufig durch die Hive-Operation überschritten wird oder wenn der Live-Lesedatenverkehr zu sehr gedrosselt wird, reduzieren Sie diesen Wert auf unter 0.5. Wenn Sie über genügend Kapazität verfügen und sich schnellere Hive-Operationen wünschen, legen Sie den Wert auf über 0.5 fest. Sie können auch überzeichnen, indem Sie den Wert auf 1,5 festlegen, wenn Sie der Ansicht sind, dass ungenutzte Ein-/Ausgabevorgänge verfügbar sind.

dynamodb.throughput.write.percent

Legt die Rate der Schreibvorgänge so fest, dass Ihre von DynamoDB bereitgestellte Durchsatzrate im für Ihre Tabelle zugewiesenen Bereich liegt. Der Wert liegt zwischen 0.1 und 1.5 (einschließlich).

Der Wert für die Standardschreibrate liegt bei 0,5. Das bedeutet, dass Hive versuchen wird, die Hälfte der Schreibkapazität, die für Ressourcen in der Tabelle bereitgestellt ist, zu verbrauchen. Eine Erhöhung dieses Werts auf über 0,5 verbessert die Schreibanforderungsrate. Eine Verringerung dieses Werts unter 0,5 verringert die Schreibanforderungsrate. Bei dieser Schreibrate handelt es sich um einen ungefähren Wert. Die tatsächliche Schreibrate variiert abhängig von Faktoren wie der Tatsache, ob eine einheitliche Verteilung der Schlüssel in DynamoDB vorliegt.

Wenn Sie feststellen, dass der bereitgestellte Durchsatz häufig durch die Hive-Operation überschritten wird oder wenn der Live-Schreibdatenverkehr zu sehr gedrosselt wird, reduzieren Sie diesen Wert auf unter 0.5. Wenn Sie über genügend Kapazität verfügen und sich schnellere Hive-Operationen wünschen, legen Sie den Wert auf über 0.5 fest. Sie können auch überzeichnen, indem Sie den Wert auf 1,5 festlegen, wenn Sie der Ansicht sind, dass ungenutzte Ein-/Ausgabevorgänge verfügbar sind oder es sich hierbei um das anfängliche Hochladen von Daten in die Tabelle handelt und noch kein aktiver Datenverkehr vorliegt.

dynamodb.endpoint

Geben Sie den Endpunkt für den DynamoDB-Service an. Weitere Informationen über die verfügbaren DynamoDB-Endpunkte finden Sie unter Regionen und Endpunkte.

dynamodb.max.map.tasks

Geben Sie die maximale Anzahl von Zuordnungs-Aufgaben beim Lesen von Daten aus DynamoDB an. Dieser Wert muss gleich oder größer 1 sein.

dynamodb.retry.duration

Geben Sie die Anzahl der Minuten an, die als Timeout-Dauer für das Wiederholen der Hive-Befehle verwendet werden soll. Bei diesem Wert muss es sich um eine Ganzzahl gleich oder größer als 0 handeln. Die Standard-Timeout-Dauer beträgt zwei Minuten.

Diese Optionen werden über den Befehl SET, wie im folgenden Beispiel gezeigt, festgelegt.

SET dynamodb.throughput.read.percent=1.0; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;