Questo documento descrive come eseguire il deployment dell'architettura in Utilizzare Apache Hive su Dataproc.
Questo documento è destinato ai Cloud Architect e ai data engineer interessati al deployment di Apache Hive su Dataproc e Hive Metastore in Cloud SQL.
Architettura
In questa guida al deployment eseguirai il deployment di tutti i servizi di calcolo e di archiviazione nella stessa regione di Google Cloud per ridurre al minimo la latenza di rete e i costi di trasporto della rete.
Il seguente diagramma mostra il ciclo di vita di una query Hive.
Nel diagramma, il client Hive invia una query, che viene elaborata, recuperata e restituita. L'elaborazione avviene nel server Hive. I dati vengono richiesti e ripristinati da un warehouse Hive archiviato in un bucket a livello di regione in Cloud Storage.
Obiettivi
- Creare un'istanza MySQL su Cloud SQL per il metastore Hive.
- Eseguire il deployment di server Hive su Dataproc.
- Installa il proxy Cloud SQL sulle istanze del cluster Dataproc.
- Caricare i dati Hive in Cloud Storage.
- Eseguire query Hive su più cluster Dataproc.
Costi
Questo deployment utilizza i seguenti componenti fatturabili di Google Cloud:
- Dataproc
- Cloud Storage
- Cloud SQL
Puoi utilizzare il Calcolatore prezzi per generare una stima dei costi in base all'utilizzo previsto.
I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.
Al termine del deployment, puoi evitare di continuare la fatturazione eliminando le risorse che hai creato. Per ulteriori informazioni, consulta Pulizia.
Prima di iniziare
Nella pagina del selettore progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud. Scopri come verificare se la fatturazione è abilitata per un progetto.
Inizializzare l'ambiente
Avvia un'istanza di Cloud Shell:
In Cloud Shell, imposta la zona di Compute Engine predefinita sulla zona in cui intendi creare i cluster Dataproc.
export PROJECT=$(gcloud info --format='value(config.project)') export REGION=REGION export ZONE=ZONE gcloud config set compute/zone ${ZONE}
Sostituisci quanto segue:
REGION
: la regione in cui vuoi creare il cluster, ad esempious-central1
.ZONE
: la zona in cui vuoi creare il cluster, ad esempious-central1-a
.
Abilita le API Dataproc e Cloud SQL Admin eseguendo questo comando in Cloud Shell:
gcloud services enable dataproc.googleapis.com sqladmin.googleapis.com
(Facoltativo) Creazione del bucket del warehouse
Se non hai un bucket Cloud Storage per archiviare i dati Hive, crea un bucket warehouse (puoi eseguire i comandi seguenti in Cloud Shell) sostituendo BUCKET_NAME
con un nome bucket univoco:
export WAREHOUSE_BUCKET=BUCKET_NAME gsutil mb -l ${REGION} gs://${WAREHOUSE_BUCKET}
Creazione dell'istanza Cloud SQL
In questa sezione creerai una nuova istanza Cloud SQL che verrà utilizzata in seguito per ospitare il metastore Hive.
In Cloud Shell, crea una nuova istanza Cloud SQL:
gcloud sql instances create hive-metastore \ --database-version="MYSQL_5_7" \ --activation-policy=ALWAYS \ --zone ${ZONE}
Il completamento di questo comando potrebbe richiedere alcuni minuti.
Creazione di un cluster Dataproc
Crea il primo cluster Dataproc, sostituendo CLUSTER_NAME
con un nome simile a hive-cluster
:
gcloud dataproc clusters create CLUSTER_NAME \ --scopes sql-admin \ --region ${REGION} \ --initialization-actions gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \ --properties "hive:hive.metastore.warehouse.dir=gs://${WAREHOUSE_BUCKET}/datasets" \ --metadata "hive-metastore-instance=${PROJECT}:${REGION}:hive-metastore" \ --metadata "enable-cloud-sql-proxy-on-workers=false"
Note:
- Devi fornire l'ambito di accesso
sql-admin
per consentire alle istanze del cluster di accedere all'API Cloud SQL Admin. - Inserisci l'azione di inizializzazione in uno script archiviato in un bucket Cloud Storage e fai riferimento al bucket con il flag
--initialization-actions
. Per ulteriori informazioni, consulta la sezione Azioni di inizializzazione - Considerazioni e linee guida importanti. - Fornisci l'URI al bucket del warehouse Hive nella proprietà
hive:hive.metastore.warehouse.dir
. Questo configura i server Hive in modo che legga e scriva nella posizione corretta. Questa proprietà deve contenere almeno una directory (ad esempio,gs://my-bucket/my-directory
); Hive non funzionerà correttamente se questa proprietà è impostata su un nome di bucket senza directory (ad esempio,gs://my-bucket
). enable-cloud-sql-proxy-on-workers=false
per garantire che il proxy Cloud SQL venga eseguito solo sui nodi master, in modo da consentire il funzionamento del servizio Hive metastore ed evitare un carico non necessario su Cloud SQL.Devi fornire l'azione di inizializzazione del proxy Cloud SQL che Dataproc esegue automaticamente su tutte le istanze del cluster. L'azione svolge le seguenti operazioni:
- Installa il proxy Cloud SQL.
- Stabilisce una connessione sicura all'istanza Cloud SQL specificata nel parametro di metadati
hive-metastore-instance
. - Crea l'utente
hive
e il database del metastore Hive.
Puoi vedere il codice completo per l'azione di inizializzazione del proxy Cloud SQL su GitHub.
Questo deployment utilizza un'istanza Cloud SQL con indirizzo IP pubblico. Se invece utilizzi un'istanza con solo un indirizzo IP privato, puoi forzare il proxy a utilizzare l'indirizzo IP privato trasmettendo il parametro
--metadata "use-cloud-sql-private-ip=true"
.
Creazione di una tabella Hive
In questa sezione, caricherai un set di dati di esempio nel bucket del warehouse, creerai una nuova tabella Hive ed eseguirai alcune query HiveQL su quel set di dati.
Copia il set di dati di esempio nel bucket del warehouse:
gsutil cp gs://hive-solution/part-00000.parquet \ gs://${WAREHOUSE_BUCKET}/datasets/transactions/part-00000.parquet
Il set di dati di esempio viene compresso nel formato Parquet e contiene migliaia di record fittizi di transazioni bancarie con tre colonne: data, importo e tipo di transazione.
Crea una tabella Hive esterna per il set di dati:
gcloud dataproc jobs submit hive \ --cluster CLUSTER_NAME \ --region ${REGION} \ --execute " CREATE EXTERNAL TABLE transactions (SubmissionDate DATE, TransactionAmount DOUBLE, TransactionType STRING) STORED AS PARQUET LOCATION 'gs://${WAREHOUSE_BUCKET}/datasets/transactions';"
Esecuzione di query Hive
In Dataproc puoi utilizzare strumenti diversi per eseguire query Hive. In questa sezione imparerai a eseguire query utilizzando i seguenti strumenti:
- API Hive Jobs di Dataproc.
- Beeline, un popolare client a riga di comando basato su SQLLine.
- SparkSQL, API di Apache Spark per eseguire query su dati strutturati.
In ogni sezione esegui una query di esempio.
Esecuzione di query su Hive con l'API Dataproc Jobs
Esegui la seguente semplice query HiveQL per verificare che il file Parquet sia collegato correttamente alla tabella Hive:
gcloud dataproc jobs submit hive \ --cluster CLUSTER_NAME \ --region ${REGION} \ --execute " SELECT * FROM transactions LIMIT 10;"
L'output include quanto segue:
+-----------------+--------------------+------------------+ | submissiondate | transactionamount | transactiontype | +-----------------+--------------------+------------------+ | 2017-12-03 | 1167.39 | debit | | 2017-09-23 | 2567.87 | debit | | 2017-12-22 | 1074.73 | credit | | 2018-01-21 | 5718.58 | debit | | 2017-10-21 | 333.26 | debit | | 2017-09-12 | 2439.62 | debit | | 2017-08-06 | 5885.08 | debit | | 2017-12-05 | 7353.92 | authorization | | 2017-09-12 | 4710.29 | authorization | | 2018-01-05 | 9115.27 | debit | +-----------------+--------------------+------------------+
Esecuzione di query su Hive con Beeline
Apri una sessione SSH con l'istanza master di Dataproc(
CLUSTER_NAME
-m):gcloud compute ssh CLUSTER_NAME-m
Nel prompt dei comandi dell'istanza principale, apri una sessione Beeline:
beeline -u "jdbc:hive2://localhost:10000"
Note:
Puoi anche fare riferimento al nome dell'istanza master come host, invece di
localhost
:beeline -u "jdbc:hive2://CLUSTER_NAME-m:10000"
Se utilizzi la modalità ad alta disponibilità con tre master, devi utilizzare il seguente comando:
beeline -u "jdbc:hive2://CLUSTER_NAME-m-0:2181,CLUSTER_NAME-m-1:2181,CLUSTER_NAME-m-2:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2"
Quando viene visualizzato il prompt Beeline, esegui la seguente query HiveQL:
SELECT TransactionType, AVG(TransactionAmount) AS AverageAmount FROM transactions WHERE SubmissionDate = '2017-12-22' GROUP BY TransactionType;
L'output include quanto segue:
+------------------+--------------------+ | transactiontype | averageamount | +------------------+--------------------+ | authorization | 4890.092525252529 | | credit | 4863.769269565219 | | debit | 4982.781458176331 | +------------------+--------------------+
Chiudi la sessione Beeline:
!quit
Chiudi la connessione SSH:
exit
Esecuzione di query su Hive con SparkSQL
Apri una sessione SSH con l'istanza master di Dataproc:
gcloud compute ssh CLUSTER_NAME-m
Nel prompt dei comandi dell'istanza master, apri una nuova sessione di shell PySpark:
pyspark
Quando viene visualizzato il prompt shell di PySpark, digita il seguente codice Python:
from pyspark.sql import HiveContext hc = HiveContext(sc) hc.sql(""" SELECT SubmissionDate, AVG(TransactionAmount) as AvgDebit FROM transactions WHERE TransactionType = 'debit' GROUP BY SubmissionDate HAVING SubmissionDate >= '2017-10-01' AND SubmissionDate < '2017-10-06' ORDER BY SubmissionDate """).show()
L'output include quanto segue:
+-----------------+--------------------+ | submissiondate | avgdebit | +-----------------+--------------------+ | 2017-10-01 | 4963.114920399849 | | 2017-10-02 | 5021.493300510582 | | 2017-10-03 | 4982.382279569891 | | 2017-10-04 | 4873.302702503676 | | 2017-10-05 | 4967.696333583777 | +-----------------+--------------------+
Chiudi la sessione PySpark:
exit()
Chiudi la connessione SSH:
exit
Ispezione del metastore Hive
Ora verifichi che il metastore Hive in Cloud SQL contenga informazioni sulla tabella transactions
.
In Cloud Shell, avvia una nuova sessione MySQL per l'istanza Cloud SQL:
gcloud sql connect hive-metastore --user=root
Quando ti viene chiesta la password utente di
root
, non digitare nulla e premi semplicemente il tastoRETURN
. Per semplicità in questo deployment, non hai impostato alcuna password per l'utenteroot
. Per informazioni sull'impostazione di una password per proteggere ulteriormente il database metastore, consulta la documentazione di Cloud SQL. L'azione di inizializzazione del proxy Cloud SQL fornisce anche un meccanismo per proteggere le password tramite crittografia. Per ulteriori informazioni, consulta il repository di codice dell'azione.Nel prompt dei comandi MySQL, imposta
hive_metastore
come database predefinito per il resto della sessione:USE hive_metastore;
Verifica che la località del bucket del warehouse sia registrata nel metastore:
SELECT DB_LOCATION_URI FROM DBS;
L'output sarà simile al seguente:
+-------------------------------------+ | DB_LOCATION_URI | +-------------------------------------+ | gs://[WAREHOUSE_BUCKET]/datasets | +-------------------------------------+
Verifica che venga fatto riferimento alla tabella correttamente nel metastore:
SELECT TBL_NAME, TBL_TYPE FROM TBLS;
L'output sarà simile al seguente:
+--------------+----------------+ | TBL_NAME | TBL_TYPE | +--------------+----------------+ | transactions | EXTERNAL_TABLE | +--------------+----------------+
Verifica che anche i riferimenti alle colonne della tabella siano corretti:
SELECT COLUMN_NAME, TYPE_NAME FROM COLUMNS_V2 c, TBLS t WHERE c.CD_ID = t.SD_ID AND t.TBL_NAME = 'transactions';
L'output sarà simile al seguente:
+-------------------+-----------+ | COLUMN_NAME | TYPE_NAME | +-------------------+-----------+ | submissiondate | date | | transactionamount | double | | transactiontype | string | +-------------------+-----------+
Verifica che anche il formato di input e la località vengano indicati correttamente:
SELECT INPUT_FORMAT, LOCATION FROM SDS s, TBLS t WHERE s.SD_ID = t.SD_ID AND t.TBL_NAME = 'transactions';
L'output sarà simile al seguente:
+---------------------------------------------------------------+------------------------------------------------+ | INPUT_FORMAT | LOCATION | +---------------------------------------------------------------+------------------------------------------------+ | org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat | gs://[WAREHOUSE_BUCKET]/datasets/transactions | +---------------------------------------------------------------+------------------------------------------------+
Chiudi la sessione MySQL:
exit
Creazione di un altro cluster Dataproc
In questa sezione creerai un altro cluster Dataproc per verificare che i dati Hive e il metastore Hive possano essere condivisi tra più cluster.
Crea un nuovo cluster Dataproc:
gcloud dataproc clusters create other-CLUSTER_NAME \ --scopes cloud-platform \ --image-version 2.0 \ --region ${REGION} \ --initialization-actions gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \ --properties "hive:hive.metastore.warehouse.dir=gs://${WAREHOUSE_BUCKET}/datasets" \ --metadata "hive-metastore-instance=${PROJECT}:${REGION}:hive-metastore"\ --metadata "enable-cloud-sql-proxy-on-workers=false"
Verifica che il nuovo cluster possa accedere ai dati:
gcloud dataproc jobs submit hive \ --cluster other-CLUSTER_NAME \ --region ${REGION} \ --execute " SELECT TransactionType, COUNT(TransactionType) as Count FROM transactions WHERE SubmissionDate = '2017-08-22' GROUP BY TransactionType;"
L'output include quanto segue:
+------------------+--------+ | transactiontype | count | +------------------+--------+ | authorization | 696 | | credit | 1722 | | debit | 2599 | +------------------+--------+
Congratulazioni, hai completato i passaggi del deployment.
Esegui la pulizia
Le sezioni seguenti spiegano come evitare addebiti futuri per il progetto Google Cloud e per le risorse Apache Hive e Dataproc che hai utilizzato in questo deployment.
Elimina il progetto Google Cloud
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo deployment, puoi eliminare il progetto Google Cloud.
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Eliminazione di singole risorse
Esegui i comandi seguenti in Cloud Shell per eliminare singole risorse anziché eliminare l'intero progetto:
gcloud dataproc clusters delete CLUSTER_NAME --region ${REGION} --quiet gcloud dataproc clusters delete other-CLUSTER_NAME --region ${REGION} --quiet gcloud sql instances delete hive-metastore --quiet gsutil rm -r gs://${WAREHOUSE_BUCKET}/datasets
Passaggi successivi
- Prova BigQuery, il data warehouse aziendale serverless, a scalabilità elevata e dai costi contenuti di Google.
- Consulta questa guida sulla migrazione dei carichi di lavoro Hadoop a Google Cloud.
- Controlla questa azione di inizializzazione per ulteriori dettagli su come utilizzare Hive HCatalog su Dataproc.
- Scopri come configurare Cloud SQL per l'alta disponibilità al fine di aumentare l'affidabilità del servizio.
- Per ulteriori architetture di riferimento, diagrammi e best practice, esplora il Cloud Architecture Center.