Differenze e considerazioni per Hive su Amazon EMR - Amazon EMR

Differenze e considerazioni per Hive su Amazon EMR

Differenze tra Apache Hive su Amazon EMR e Apache Hive

Questa sezione descrive le differenze tra Hive su Amazon EMR e le versioni predefinite di Hive disponibili su http://svn.apache.org/viewvc/hive/branches/.

Autorizzazione Hive

Amazon EMR supporta le autorizzazioni Hive per HDFS ma non per EMRFS e Amazon S3. I cluster Amazon EMR vengono eseguiti con l'autorizzazione disabilitata per impostazione predefinita.

Comportamento di unione dei file Hive con Amazon S3

Apache Hive unisce i piccoli file al termine di un processo di sola mappatura se hive.merge.mapfiles è impostato su true; l'unione viene attivata solo se le dimensioni medie dell'output del processo sono inferiori all'impostazione hive.merge.smallfiles.avgsize. Il comportamento di Amazon EMR Hive è esattamente lo stesso se il percorso di output finale si trova in HDFS. Se il percorso di output si trova in Amazon S3, il parametro hive.merge.smallfiles.avgsize viene ignorato. In tal caso, l'attività di unione viene sempre attivata se hive.merge.mapfiles è impostato su true.

Transazioni ACID e Amazon S3

Amazon EMR 6.1.0 e versioni successive supporta le transazioni Hive ACID (Atomicity, Consistency, Isolation, and Durability) in modo da conformarsi alle proprietà ACID di un database. Con questa funzione, puoi eseguire operazioni INSERT (INSERISCI), UPDATE (AGGIORNA), DELETE (ELIMINA) e MERGE (UNISCI) nelle tabelle gestite da Hive con dati in Amazon Simple Storage Service (Amazon S3).

Hive LLAP (Live Long e Process)

La funzionalità LLAP, aggiunta nella versione 2.0 di Apache Hive predefinito, non è supportata in Hive 2.1.0 su Amazon EMR rilascio 5.0.

Amazon EMR versione 6.0.0 e versioni successive supporta la funzionalità Live Long and Process (LLAP) per Hive. Per ulteriori informazioni, consulta la sezione relativa all'utilizzo di LLAP Hive.

Differenze in Hive tra le versioni Amazon EMR 4.x e 5.x

In questa sezione vengono descritte le differenze da considerare prima di migrare un'implementazione da Hive versione 1.0.0 su Amazon EMR versione 4.x a Hive 2.x su Amazon EMR versione 5.x.

Differenze e considerazioni operative

  • Supporto aggiunto per transazioni ACID (Atomicity, Consistency, Isolation, and Durability): questa differenza tra Hive 1.0.0 su Amazon EMR 4.x e Apache Hive predefinito è stata eliminata.

  • Scritture dirette su Amazon S3 eliminate: questa differenza tra Hive 1.0.0 su Amazon EMR e Apache Hive predefinito è stata eliminata. Hive 2.1.0 su Amazon EMR versione 5.x ora esegue operazioni di creazione, lettura e scrittura sui file temporanei archiviati in Amazon S3. Di conseguenza, per leggere e scrivere sulla stessa tabella, non è più necessario ovviare creando una tabella temporanea nel file system HDFS locale del cluster. Con la funzione Versioni multiple dei bucket attivata, è necessario assicurarsi di gestire questi file temporanei come descritto di seguito.

  • Gestione dei file temporanei con la funzione Versioni multiple dei bucket Amazon S3 attivata: quando vengono eseguite query Hive in cui la destinazione dei dati generati è Amazon S3, vengono creati molti file e directory temporanei. Si tratta di un nuovo comportamento, come descritto in precedenza. Se utilizzi i bucket S3 con funzione Versioni multiple, questi file temporanei creano disordine in Amazon S3 e, se non eliminati, generano costi. Modifica le regole del ciclo di vita in modo che i dati con prefisso /_tmp vengano eliminati dopo poco tempo, ad esempio cinque giorni. Per ulteriori informazioni, consulta Specifica di una configurazione del ciclo di vita.

  • Log4j aggiornato a log4j 2: se utilizzi log4j, potresti dover modificare la configurazione di log per via di questo aggiornamento. Per dettagli, consulta Apache log4j 2.

Differenze e considerazioni prestazionali

  • Differenze di prestazioni con Tez: con Amazon EMR versione 5.x, il motore di esecuzione predefinito per Hive è Tez, anziché MapReduce. Tez fornisce prestazioni migliori per la maggior parte dei flussi di lavoro.

  • Tabelle con molte partizioni: le query che generano un numero elevato di partizioni dinamiche possono non riuscire, mentre quelle che operano selezioni da tabelle con molte partizioni possono richiedere più tempo del previsto per l'esecuzione. Ad esempio, una selezione da 100.000 partizioni può richiedere 10 minuti o più.

Caratteristiche aggiuntive di Hive su Amazon EMR

Amazon EMR amplia Hive con nuove caratteristiche che supportano l'integrazione di Hive con altri servizi AWS, ad esempio la possibilità di leggere e scrivere su Amazon Simple Storage Service (Amazon S3) e DynamoDB.

Variabili in Hive

Puoi includere variabili nel tuo script utilizzando il segno del dollaro e le parentesi graffe.

add jar ${LIB}/jsonserde.jar

Puoi trasferire ad Hive i valori di queste variabili nella riga di comando tramite il parametro -d, come nell'esempio seguente:

-d LIB=s3://elasticmapreduce/samples/hive-ads/lib

Puoi anche trasferire i valori nelle fasi che eseguono gli script Hive.

Per trasferire i valori delle variabili nelle fasi Hive utilizzando la console
  1. Apri la console di Amazon EMR all'indirizzo https://console.aws.amazon.com/emr.

  2. Scegli Crea cluster.

  3. Nella sezione Steps (Fasi), in Add Step (Aggiungi fase), scegliere Hive Program (Programma Hive) dall'elenco e quindi Configure and add (Configura e aggiungi).

  4. Nella finestra di dialogo Add Step (Aggiungi fase), specificare i parametri utilizzando la tabella seguente come guida e quindi scegliere Add (Aggiungi).

    Campo Operazione
    Percorso script S3* Specifica l'URI in cui risiede lo script in Amazon S3. Il valore deve essere nel formato NomeBucket/percorso/NomeScript. Ad esempio: s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q.
    Percorso di input S3 Facoltativamente, è possibile specificare l'URI in cui risiedono file di input in Amazon S3. Il valore deve essere nel formato NomeBucket/percorso/. Se specificato, verrà trasferito nello script Hive come parametro, denominato INPUT. Ad esempio: s3://elasticmapreduce/samples/hive-ads/tables/.
    Percorso di output S3 Facoltativamente, è possibile specificare l'URI in cui archiviare l'output in Amazon S3. Il valore deve essere nel formato NomeBucket/percorso. Se specificato, verrà trasferito nello script Hive come parametro, denominato OUTPUT. Ad esempio: s3://mybucket/hive-ads/output/.
    Argomenti Facoltativamente, è possibile inserire un elenco di argomenti (stringhe separate da spazi) per il trasferimento a Hive. Se è stato definito un percorso variabile nello script Hive denominato ${SAMPLE}, ad esempio:
    CREATE EXTERNAL TABLE logs (requestBeginTime STRING, requestEndTime STRING, hostname STRING) PARTITIONED BY (dt STRING) \ ROW FORMAT serde 'com.amazon.elasticmapreduce.JsonSerde' WITH SERDEPROPERTIES ( 'paths'='requestBeginTime, requestEndTime, hostname' ) LOCATION '${SAMPLE}/tables/impressions';

    Per trasferire un valore per la variabile, digitare quanto segue nella finestra Arguments (Argomenti):

    -d SAMPLE=s3://elasticmapreduce/samples/hive-ads/.

    Operazione in caso di errore

    Determina le operazioni effettuate dal cluster in risposta a eventuali errori. I valori possibili sono per questa impostazione sono:

    • Terminate cluster (Chiudi cluster): se la fase ha esito negativo, il cluster viene chiuso. Se vi sono abilitati sia la protezione dalla chiusura che il keep-alive, il cluster non verrà chiuso.

    • Cancel and wait (Annulla e attendi): se la fase ha esito negativo, quelle rimanenti vengono annullate. Se il keep-alive è abilitato, il cluster non verrà chiuso.

    • Continue (Continua): se la fase ha esito negativo, passa a quella successiva.

  5. Selezionare i valori in base alle esigenze, quindi scegliere Create cluster (Crea cluster).

Per trasferire i valori delle variabili nelle fasi Hive utilizzando l'AWS CLI

Per trasferire i valori delle variabili nelle fasi di Hive tramite AWS CLI, utilizzare il parametro --steps e includere un elenco di argomenti.

  • Nota

    I caratteri di continuazione della riga Linux (\) sono inclusi per la leggibilità. Possono essere rimossi o utilizzati nei comandi Linux. Per Windows, rimuoverli o sostituirli con un accento circonflesso (^).

    aws emr create-cluster --name "Test cluster" --release-label emr-5.36.1 \ --applications Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 \ --steps Type=Hive,Name="Hive Program",ActionOnFailure=CONTINUE,Args=[-f,s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q,-d,INPUT=s3://elasticmapreduce/samples/hive-ads/tables,-d,OUTPUT=s3://mybucket/hive-ads/output/,-d,SAMPLE=s3://elasticmapreduce/samples/hive-ads/]

    Per ulteriori informazioni sull'utilizzo di comandi Amazon EMR nella AWS CLI, consulta https://docs.aws.amazon.com/cli/latest/reference/emr.

Per trasferire i valori delle variabili nelle fasi Hive utilizzando l'SDK Java
  • L'esempio seguente spiega come trasferire le variabili nelle fasi utilizzando l'SDK. Per ulteriori informazioni, consulta la sezione relativa alla Classe StepFactory nella Guida di riferimento alle API di AWS SDK for Java.

    StepFactory stepFactory = new StepFactory(); StepConfig runHive = new StepConfig() .withName("Run Hive Script") .withActionOnFailure("TERMINATE_JOB_FLOW") .withHadoopJarStep(stepFactory.newRunHiveScriptStep(“s3://mybucket/script.q”, Lists.newArrayList(“-d”,”LIB= s3://elasticmapreduce/samples/hive-ads/lib”));

Query di Amazon EMR Hive per soddisfare schemi DynamoDB parziali

Amazon EMR Hive offre grande flessibilità nell'esecuzione di query in tabelle DynamoDB poiché consente di specificare un sottoinsieme di colonne in cui è possibile filtrare i dati, piuttosto che richiedere alla query di includere tutte le colonne. La tecnica di query a schema parziale è efficace quando, con schemi del database sparsi, vuoi filtrare i record in base a poche colonne, ad esempio applicando il filtro in base al timestamp.

L'esempio seguente mostra come utilizzare una query Hive per:

  • Creazione di una tabella DynamoDB

  • Seleziona un sottoinsieme di elementi (righe) in DynamoDB e restringere ulteriormente i dati in determinate colonne.

  • Copia i dati risultati in Amazon S3.

DROP TABLE dynamodb; DROP TABLE s3; CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, fullColumn map<String, String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.throughput.read.percent" = ".1000", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey"); CREATE EXTERNAL TABLE s3(map<String, String>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3 SELECT item fullColumn FROM dynamodb WHERE recordTimeStamp < "2012-01-01";

La tabella seguente mostra la sintassi di query per la selezione di qualsiasi combinazione di elementi da DynamoDB.

Esempio di query Descrizione del risultato
SELECT * FROM nome_tabella; Seleziona tutti gli elementi (righe) da una determinata tabella e include i dati provenienti da tutte le colonne disponibili per tali elementi.
SELECT * FROM nome_tabella WHERE nome_campo =valore; Seleziona alcuni elementi (righe) da una determinata tabella e include i dati provenienti da tutte le colonne disponibili per tali elementi.
SELECT nome_colonna1, nome_colonna2, nome_colonna3 FROM nome_tabella; Seleziona tutti gli elementi (righe) da una determinata tabella e include i dati provenienti da alcune colonne disponibili per tali elementi.
SELECT nome_colonna1, nome_colonna2, nome_colonna3 FROM nome_tabella WHERE nome_campo =valore; Seleziona alcuni elementi (righe) da una determinata tabella e include i dati provenienti da alcune colonne disponibili per tali elementi.

Copia dei dati fra tabelle DynamoDB in diverse Regioni AWS

Amazon EMR Hive fornisce una proprietà dynamodb.region che è possibile impostare per ogni tabella DynamoDB. Quando dynamodb.region è impostato in modo diverso su due tabelle, la copia dei dati da una tabella all'altra avviene tra le regioni specificate.

L'esempio seguente mostra come creare una tabella DynamoDB con uno script Hive che imposta la proprietà dynamodb.region:

Nota

Le proprietà delle regioni specifiche per tabella sostituiscono le proprietà globali di Hive.

CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.region" = "eu-west-1", "dynamodb.throughput.read.percent" = ".1000", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");

Impostazione dei valori di velocità effettiva DynamoDB per tabella

Amazon EMR Hive consente di configurare le impostazioni writeThroughputPercent e readThroughputPercent di DynamoDB per ogni tabella nella relativa definizione. Il seguente script Amazon EMR Hive mostra come impostare i valori di velocità effettiva. Per ulteriori informazioni sui valori di velocità effettiva di DynamoDB, consulta Specifica dei requisiti di lettura e scrittura per le tabelle.

CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.throughput.read.percent" = ".4", "dynamodb.throughput.write.percent" = "1.0", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");