Impostazione di una tabella Hive per l'esecuzione dei comandi Hive - Amazon EMR

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Impostazione di una tabella Hive per l'esecuzione dei comandi Hive

Apache Hive è un'applicazione di data warehouse che è possibile usare per eseguire query sui dati contenuti nei cluster Amazon EMR utilizzando un linguaggio di tipo SQL. Per ulteriori informazioni su Hive, visita la pagina Web all'indirizzo http://hive.apache.org/.

La procedura seguente presuppone che sia già stato creato un cluster e specificata una coppia di chiavi Amazon EC2. Per ulteriori informazioni su come iniziare a creare cluster, consulta Nozioni di base su Amazon EMR nella Guida alla gestione di Amazon EMR.

Configura Hive per l'uso MapReduce

Quando usi Hive su Amazon EMR per eseguire query sulle tabelle DynamoDB, possono verificarsi degli errori se Hive utilizza il motore di esecuzione di default, Tez. Per questo motivo, quando crei un cluster con Hive che si integra con DynamoDB come descritto in questa sezione, ti consigliamo di utilizzare una classificazione di configurazione che imposti Hive da utilizzare. MapReduce Per ulteriori informazioni, consulta Configurazione delle applicazioni.

Il seguente frammento mostra la classificazione della configurazione e la proprietà da utilizzare per impostare MapReduce come motore di esecuzione per Hive:

[ { "Classification": "hive-site", "Properties": { "hive.execution.engine": "mr" } } ]
Per eseguire i comandi Hive in modo interattivo
  1. Connettersi al nodo master. Per maggiori informazioni, consulta Connessione al nodo master tramite SSH nella Guida alla gestione di Amazon EMR.

  2. Nel prompt dei comandi per il nodo master corrente, digitare hive.

    Viene visualizzato un prompt hive: hive>

  3. Inserisci un comando Hive che mappi una tabella nell'applicazione Hive ai dati in DynamoDB. Questa tabella agisce come riferimento ai dati archiviati in Amazon DynamoDB: i dati non vengono memorizzati localmente in Hive e le query che utilizzano la tabella sono eseguite sui dati live in DynamoDB. Pertanto, la capacità di lettura o scrittura della tabella viene consumata ogni volta che viene eseguito un comando. Se è prevista l'esecuzione di più comandi Hive sullo stesso set di dati, valutare la possibilità di esportarli.

    Di seguito è mostrata la sintassi per la mappatura di una tabella Hive a una tabella DynamoDB.

    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...");

    Le tabelle create in Hive da DynamoDB devono essere create come tabelle esterne utilizzando la parola chiave EXTERNAL. La differenza tra le tabelle interne ed esterne è che, nel primo caso, i dati vengono eliminati quando viene rimossa la tabella interna. In caso di connessione ad Amazon DynamoDB non si tratta di un comportamento ottimale, quindi sono supportate solo le tabelle esterne.

    Ad esempio, il seguente comando Hive crea una tabella denominata hivetable1 in Hive che fa riferimento alla tabella DynamoDB denominata dynamodbtable1. La tabella DynamoDB dynamodbtable1 ha uno schema a chiave primaria. hash-and-range L'elemento della chiave hash è name (tipo String), l'elemento della chiave di intervallo è year (tipo Numeric) e ciascuna voce ha un valore attributo per holidays (tipo String Set).

    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");

    La riga 1 usa l'istruzione HiveQL CREATE EXTERNAL TABLE. Per hivetable1, è necessario stabilire una colonna per ogni coppia nome-valore dell'attributo nella tabella DynamoDB e fornire il tipo di dati. Questi valori non prevedono distinzione fra maiuscole e minuscole ed è possibile dare alle colonne qualsiasi nome (eccetto le parole riservate).

    La riga 2 usa l'istruzione STORED BY. Il valore di STORED BY è il nome della classe che gestisce la connessione tra Hive e DynamoDB. Deve essere impostato su 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'.

    La riga 3 usa l'istruzione TBLPROPERTIES per associare "hivetable1" alla tabella e allo schema corretti in DynamoDB. Fornire TBLPROPERTIES con i valori per i parametri dynamodb.table.name e dynamodb.column.mapping. Per questi valori è prevista la distinzione tra maiuscole e minuscole.

    Nota

    Tutti i nomi di attributi DynamoDB per la tabella devono avere colonne corrispondenti nella tabella Hive. A seconda della versione di Amazon EMR in uso, se la one-to-one mappatura non esiste, si verificano i seguenti scenari:

    • In Amazon EMR versione 5.27.0 e successive, il connettore dispone di convalide che garantiscono una mappatura one-to-one tra i nomi degli attributi DynamoDB e le colonne nella tabella Hive. Si verificherà un errore se la mappatura non esiste. one-to-one

    • In Amazon EMR 5.26.0 e versioni precedenti, la tabella Hive non contiene la coppia nome-valore proveniente da DynamoDB. Se non vengono mappati gli attributi della chiave primaria DynamoDB, Hive genera un errore. Se non vengono mappati gli attributi della chiave non primaria, non vengono generati errori, ma nella tabella Hive non saranno visualizzati i dati. Se i tipi di dati non corrispondono, il valore è null.

A questo punto puoi iniziare a eseguire operazioni Hive su hivetable1. Le query eseguite per hivetable1 vengono eseguite internamente nella tabella DynamoDB dynamodbtable1 dell'account DynamoDB, consumando unità di lettura o scrittura a ogni esecuzione.

Quando esegui query Hive su una tabella DynamoDB, devi accertarti di aver assegnato una quantità sufficiente di unità di capacità di lettura.

Ad esempio, supponiamo che tu disponga di 100 unità di capacità di lettura assegnate per la tabella DynamoDB. Questo ti consentirà di eseguire 100 operazioni di lettura, o 409.600 byte, al secondo. Se la tabella contiene 20 GB di dati (21.474.836.480 byte) e la tua query Hive esegue una scansione completa della tabella, puoi stimare la durata dell'esecuzione della query:

21.474.836.480 / 409.600 = 52.429 secondi = 14,56 ore

Il solo modo per ridurre il tempo necessario sarebbe modificare le unità di capacità di lettura nella tabella DynamoDB di origine. L'aggiunta di più nodi Amazon EMR non è utile.

Nell'output Hive, la percentuale di completamento viene aggiornata quando terminano uno o più processi del mappatore. Per una tabella DynamoDB di grandi dimensioni con una bassa capacità di lettura assegnata, l'output della percentuale di completamento potrebbe non essere aggiornato per molto tempo; in questo caso, il processo sembrerà essere completo allo 0% per diverse ore. Per uno stato più dettagliato dell'avanzamento del processo, accedi alla console di Amazon EMR, dalla quale potrai visualizzare lo stato delle singole attività del mappatore e statistiche per le letture di dati. Puoi anche accedere all'interfaccia Hadoop sul nodo master e vedere le statistiche di Hadoop. Ti sarà mostrato lo stato della singola attività del mappatore e alcune statistiche di lettura dei dati. Per ulteriori informazioni, consulta i seguenti argomenti:

Per ulteriori informazioni sulle istruzioni HiveQL di esempio per eseguire attività quali l'esportazione o l'importazione di dati da DynamoDB e unione di tabelle, consulta Esempi di comandi Hive per l'esportazione, l'importazione e l'esecuzione di query sui dati in DynamoDB.

Per annullare una richiesta Hive

Quando esegui una query Hive, la risposta iniziale del server include il comando per annullare la richiesta. Per annullare la richiesta in qualsiasi momento del processo, utilizza il comando Kill Command (Comando di chiusura) dalla risposta del server.

  1. Immettere Ctrl+C per chiudere il client a riga di comando.

  2. Al prompt della shell, immettere il comando Kill Command (Comando di chiusura) tratto dalla risposta iniziale del server alla richiesta.

    In alternativa, è possibile eseguire il comando seguente dalla riga di comando del nodo master per chiudere il processo Hadoop, dove job-id è l'identificatore di tale processo e può essere recuperato dall'interfaccia utente Hadoop.

    hadoop job -kill job-id

Tipi di dati per Hive e DynamoDB

La seguente tabella mostra i tipi di dati Hive disponibili, il tipo di DynamoDB predefinito a cui fanno riferimento e i tipi di DynamoDB alternativi a cui possono essere associati.

Tipo Hive Tipo di DynamoDB predefinito Tipo/i di DynamoDB alternativo/i
string

string (S)

bigint o double

number (N)

binary

binary (B)

booleano

boolean (BOOL)

array list (L)

number set (NS), string set (SS) o binary set (BS)

map<string,string> elemento

map (M)

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

Se desideri scrivere i dati Hive come un tipo corrispondente di DynamoDB alternativo o se i dati di DynamoDB contengono valori di attributi di un tipo di DynamoDB alternativo, puoi specificare la colonna e il tipo di DynamoDB con il parametro dynamodb.type.mapping. L'esempio seguente mostra la sintassi per specificare una mappatura di tipi alternativi.

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");

Il parametro della mappatura dei tipi è facoltativo e deve essere specificato solo per le colonne che utilizzano tipi alternativi.

Ad esempio, il seguente comando Hive crea una tabella denominata hivetable2 che fa riferimento alla tabella dynamodbtable2 di DynamoDB. È simile a hivetable1, tranne per il fatto che associa la colonna col3 al tipo string set (SS).

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, hivetable1 e hivetable2 sono identici. Tuttavia, quando i dati di tali tabelle vengono scritti nelle tabelle DynamoDB corrispondenti, dynamodbtable1 contiene elenchi, mentre dynamodbtable2 contiene set di stringhe.

Se desideri scrivere valori null di Hive come attributi del tipo null di DynamoDB, puoi farlo con il parametro dynamodb.null.serialization. L'esempio seguente mostra la sintassi per specificare la serializzazione null.

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");

Il parametro di serializzazione null è facoltativo e, se non specificato, è impostato su false. Nota che gli attributi null di DynamoDB sono letti come valori null in Hive indipendentemente dalle impostazioni del parametro. Le raccolte Hive con valori null possono essere scritte in DynamoDB solo se il parametro di serializzazione null è specificato come true. In caso contrario, si verifica un errore Hive.

Il tipo bigint in Hive è uguale al tipo long in Java, mentre il tipo double di Hive è uguale al tipo double in Java, in termini di precisione. Questo significa che, se disponi di dati numerici memorizzati in DynamoDB con una precisione superiore a quella disponibile nei tipi di dati Hive, l'utilizzo di Hive per esportare, importare o fare riferimento ai dati DynamoDB può portare a una perdita di precisione o a un errore nella query Hive.

Le esportazioni del tipo binary da DynamoDB ad Amazon Simple Storage Service (Amazon S3) o HDFS vengono memorizzate come una stringa con codifica Base64. Se importi dati da Amazon S3 o HDFS nel tipo binary di DynamoDB, assicurati che siano codificati come stringa Base64.

Opzioni Hive

Puoi impostare le seguenti opzioni di Hive per gestire il trasferimento di dati da Amazon DynamoDB. Queste opzioni persistono nella sessione di Hive corrente. Se chiudi il prompt dei comandi Hive e lo riapri in un secondo momento nel cluster, le impostazioni ritorneranno ai valori predefiniti.

Opzioni Hive Descrizione
dynamodb.throughput.read.percent

Imposta la percentuale di operazioni di lettura per mantenere il tasso di velocità effettiva assegnato di DynamoDB nell'intervallo allocato per la tabella. Il valore è compreso tra 0.1 e 1.5 inclusi.

Il valore di 0,5 è la velocità di lettura di default, il che significa che Hive cercherà di consumare metà delle risorse di throughput assegnate alla lettura nella tabella. L'aumento del valore sopra a 0,5 aumenta la velocità della richiesta di lettura, che invece scende riducendo il valore sotto a 0,5. La velocità di lettura è approssimativa. La velocità di lettura reale varia in base a fattori come la presenza di una distribuzione uniforme delle chiavi in DynamoDB.

Se vedi che il throughput assegnato viene frequentemente superato dalle operazioni Hive, oppure se è il traffico live in lettura viene limitato eccessivamente, porta il valore sotto a 0.5. Se disponi di capacità sufficiente e desideri operazioni Hive più veloci, imposta questo valore al di sopra di 0.5. Se ritieni che non ci siano operazioni di input/output inutilizzate disponibili, puoi anche andare oltre impostando il valore fino a 1,5.

dynamodb.throughput.write.percent

Imposta la percentuale di operazioni di scrittura per mantenere il tasso di velocità effettiva assegnato di DynamoDB nell'intervallo allocato per la tabella. Il valore è compreso tra 0.1 e 1.5 inclusi.

Il valore di 0,5 è la velocità di scrittura di default, il che significa che Hive cercherà di consumare metà delle risorse di throughput assegnate alla scrittura nella tabella. L'aumento del valore sopra a 0,5 aumenta la velocità delle richieste di scrittura, che invece scende riducendo il valore sotto a 0,5. La velocità di scrittura è approssimativa. La velocità di scrittura reale varia in base a fattori come la presenza di una distribuzione uniforme delle chiavi in DynamoDB.

Se vedi che il throughput assegnato viene frequentemente superato dalle operazioni Hive, oppure se è il traffico live in scrittura viene limitato eccessivamente, porta il valore sotto a 0.5. Se disponi di capacità sufficiente e desideri operazioni Hive più veloci, imposta questo valore al di sopra di 0.5. Puoi anche andare oltre impostando il valore fino a 1,5, se ritieni che non ci siano operazioni di input/output inutilizzate disponibili o se stai eseguendo il caricamento iniziale dei dati sulla tabella e non c'è ancora traffico live.

dynamodb.endpoint

Specifica l'endpoint per il servizio DynamoDB. Per ulteriori informazioni sugli endpoint DynamoDB disponibili, consulta la pagina relativa a Regioni ed endpoint.

dynamodb.max.map.tasks

Specifica il numero massimo di attività di mappatura durante la lettura di dati da DynamoDB. Questo valore deve essere maggiore o uguale a 1.

dynamodb.retry.duration

Specifica il numero di minuti da utilizzare come durata di timeout per rieseguire i comandi Hive. Questo valore deve essere un numero intero uguale o maggiore di 0. La durata di timeout predefinita è di due minuti.

Queste opzioni vengono impostate utilizzando il comando SET come mostrato nel seguente esempio.

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