Come posso configurare una connessione SSL tra Hive su Amazon EMR e un metastore su Amazon RDS for MySQL?
Desidero configurare una connessione SSL tra Hive su Amazon EMR e un metastore su Amazon Relational Database Service (Amazon RDS) per MySQL.
Breve descrizione
Per configurare una connessione crittografata tra Hive e un metastore esterno, utilizza un certificato SSL. Puoi configurare una connessione SSL quando avvii un nuovo cluster Amazon EMR o dopo che il cluster è in esecuzione.
Nota: i seguenti passaggi sono stati testati su Amazon EMR versione 7.3.0 e Amazon RDS per MySQL versione 8.0.39.
Risoluzione
Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.
Configura una connessione SSL su un nuovo cluster Amazon EMR
Completa i seguenti passaggi:
-
Per creare un'istanza database Amazon RDS per MySQL, esegui il seguente create-db-instance:
aws rds create-db-instance \ --db-name hive \ --db-instance-identifier example-db-instance-identifier \ --db-instance-class db.c6gd.large \ --engine mysql --engine-version 8.0.39 \ --db-subnet-group-name example-subnet-group \ --master-username example-rds-primary-user \ --master-user-password example-rds-primary-password \ --allocated-storage 200 \ --storage-type gp3 \ --vpc-security-group-ids example-rds-vpc-security-groupNota: sostituisci example-db-instance-identifier con l'identificatore dell'istanza database, example-subnet-group con il nome del tuo gruppo di sottorete, example-rds-primary-user con il tuo nome utente principale in Amazon RDS e example-rds-primary-password con la tua password principale in Amazon RDS. Inoltre, sostituisci example-rds-vpc-security-group con il nome del tuo gruppo di sicurezza Amazon RDS Amazon Virtual Private Cloud (Amazon VPC).
-
Connettiti all'istanza database di Amazon RDS per MySQL come utente principale. Quindi crea un utente per il metastore Hive:
Nota: assicurati di limitare l'accesso dell'utente principale all'istanza database creata in precedenza.mysql -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-user -p Enter password: example-rds-primary-passwordCREATE USER 'example-hive-username' IDENTIFIED BY 'example-hive-password' REQUIRE SSL; REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'example-hive-username'; GRANT ALL PRIVILEGES ON hive.* TO 'example-hive-username'; FLUSH PRIVILEGES;Nota: sostituisci example-rds-db-instance-endpoint con l'endpoint della tua istanza database Amazon RDS, example-rds-primary-user con il tuo nome utente principale in Amazon RDS e example-rds-primary-password con la tua password principale in Amazon RDS. Inoltre, sostituisci example-hive-username con il tuo nome utente Hive e example-hive-password con la tua password per example-hive-username.
-
Crea un file di configurazione JSON simile al seguente:
Nota: utilizza il seguente file JSON per avviare il cluster Amazon EMR nella fase successiva. Il file consente a Hive di stabilire una connessione SSL con l'istanza database Amazon RDS.
[ { "Classification": "hive-site", "Properties": { "javax.jdo.option.ConnectionURL": "jdbc:mysql://example-rds-db-instance-endpoint:3306/hive?createDatabaseIfNotExist=true&useSSL=true&serverSslCert=/home/hadoop/global-bundle.pem", "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver", "javax.jdo.option.ConnectionUserName": "example-hive-username", "javax.jdo.option.ConnectionPassword": "example-hive-password" } } ]Nota: sostituisci example-rds-db-instance-endpoint con l'endpoint dell'istanza database Amazon RDS, example-hive-username con il tuo nome utente che Hive utilizzerà per connettersi all'istanza database Amazon RDS e example-hive-password con la tua password per example-hive-username.
-
Crea una regola in entrata nel gruppo di sicurezza associato alla tua istanza Amazon RDS per MySQL come segue:
Per Tipo, scegli MYSQL/Aurora (3306).
Per Protocollo, **TCP (6) ** è selezionato per impostazione predefinita.
Per Intervallo di porte, 3306 è selezionato per impostazione predefinita.
Per Origine, inserisci l'ID del gruppo di sicurezza gestito Amazon EMR associato al nodo principale.
Nota: questa regola consente al nodo principale del cluster Amazon EMR di accedere all'istanza Amazon RDS. Per ulteriori informazioni, consulta Panoramica dei gruppi di sicurezza VPC. -
Crea il seguente file di script di un'](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html)azione di bootstrap[. Quindi caricalo su un bucket Amazon S3. L'azione di bootstrap scarica il certificato SSL in /home/hadoop/ sul nodo principale.
#!/bin/bash if grep isMaster /mnt/var/lib/info/instance.json | grep false; then echo "This is not primary node, do nothing, exiting" exit 0 fi echo "This is primary, continuing to execute script" cd /home/hadoop wget -S -T 10 -t 5 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -
Per avviare un cluster Amazon EMR, esegui il seguente comando create-cluster con il file JSON e l'azione di bootstrap precedenti:
Esempio:
aws emr create-cluster \ --name "EMR Hive Metastore SSL" \ --log-uri $LOG_URI \ --release-label "emr-7.3.0" \ --service-role $EMRServiceRole \ --ec2-attributes KeyName=$EC2_KEY_PAIR,InstanceProfile=$EMREC2Role,SubnetId=$EMR_SUBNET,EmrManagedSlaveSecurityGroup=$EMR_CORE_AND_TASK_VPC_SG,EmrManagedMasterSecurityGroup=$EMR_PRIMARY_VPC_SG \ --applications Name=Hadoop Name=Hive \ --bootstrap-actions Path=$BOOTSTRAP_ACTION_SCRIPT_PATH \ --configurations file:///<Full-Path-To>/hive-ext-meta-mysql-ssl.json \ --instance-groups '[{"InstanceCount":1,"InstanceGroupType":"CORE","Name":"Core","InstanceType":"m5.xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":32},"VolumesPerInstance":2}]}},{"InstanceCount":1,"InstanceGroupType":"MASTER","Name":"Primary","InstanceType":"m5.xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":32},"VolumesPerInstance":2}]}},{"InstanceCount":1,"InstanceGroupType":"TASK","Name":"Task - 1","InstanceType":"m5.xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":32},"VolumesPerInstance":2}]}}]' -
Apri una sessione Hive sul nodo principale. Quindi crea per prova una tabella.
Esempio:
hive> create table tb_test (col1 STRING, col2 BIGINT); OK Time taken: 2.371 secondshive> describe tb_test; OK col1 string col2 bigint Time taken: 0.254 seconds, Fetched: 2 row(s) -
Per connetterti al metastore Amazon RDS per MySQL, utilizza il client mysql sul nodo principale. Quindi controlla i metadati della tabella nel metastore. Se i metadati corrispondono alla tabella creata nel passaggio precedente, la connessione SSL funziona.
Esempio:
mysql -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-user -pEnter password: example-rds-primary-password mysql> use hive; Database changed mysql> select t1.OWNER, t1.TBL_NAME, t1.TBL_TYPE, s1.INPUT_FORMAT, s1.OUTPUT_FORMAT, s1.LOCATION from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID where t1.TBL_NAME = 'tb_test'\G *************************** 1. row *************************** OWNER: hadoop TBL_NAME: tb_test TBL_TYPE: MANAGED_TABLE INPUT_FORMAT: org.apache.hadoop.mapred.TextInputFormat OUTPUT_FORMAT: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat LOCATION: hdfs://ip-xxx-xx-xx-xxx.ec2.internal:8020/user/hive/warehouse/tb_test 1 row in set (0.23 sec) mysql> select t1.OWNER, t1.TBL_NAME, c1.COLUMN_NAME, c1.TYPE_NAME from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID inner join COLUMNS_V2 c1 on c1.CD_ID = s1.CD_ID where t1.TBL_NAME = 'tb_test'; +--------+----------+-------------+-----------+ | OWNER | TBL_NAME | COLUMN_NAME | TYPE_NAME | +--------+----------+-------------+-----------+ | hadoop | tb_test | col1 | string | | hadoop | tb_test | col2 | bigint | +--------+----------+-------------+-----------+ 2 rows in set (0.22 sec)Nota: sostituisci example-rds-db-instance-endpoint con l'endpoint della tua istanza database Amazon RDS, example-rds-primary-user con il tuo nome utente principale in Amazon RDS e example-rds-primary-password con la tua password principale in Amazon RDS.
Configura una connessione SSL su un cluster Amazon EMR in esecuzione
Nota: prima di iniziare, assicurati di disporre di un'istanza database Amazon RDS per MySQL.
-
Scarica il certificato SSL in /home/hadoop/ sul nodo principale:
cd /home/hadoop && wget -S -T 10 -t 5 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -
Nella directory /etc/hive/conf.dist, aggiungi o modifica le seguenti righe del hive-site.xml:
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://example-rds-db-instance-endpoint:3306/hive?createDatabaseIfNotExist=true&useSSL=true&serverSslCert=/home/hadoop/global-bundle.pem</value> <description>example-rds-db-instance-endpoint</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>example-hive-username</value> <description>example-metastore-db-user</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>example-hive-password</value> <description>example-metastore-db-password</description> </property>Nota: sostituisci example-rds-db-instance-endpoint con l'endpoint dell'istanza database Amazon RDS, example-hive-username con il tuo nome utente che Hive utilizzerà per connettersi all'istanza database Amazon RDS e example-hive-password con la tua password per example-hive-username. Inoltre, in XML la e commerciale (&) è un carattere speciale. Per utilizzare una e commerciale in hive-site.xml, ad esempio nella stringa JDBC, utilizza & invece di &. Se non utilizzi &, riceverai un errore al riavvio di hive-hcatalog-server.
-
Prova la connessione SSL:
mysql -h example-rds-db-instance-endpoint -P 3306 -u example-hive-username -p --ssl-ca /home/hadoop/global-bundle.pem Enter password: example-hive-passwordNota: sostituisci example-rds-db-instance-endpoint con l'endpoint dell'istanza database Amazon RDS, example-hive-username con il tuo nome utente che Hive utilizzerà per connettersi all'istanza database Amazon RDS e example-hive-password con la tua password per example-hive-username.
-
Riavvia hive-hcatalog-server sul nodo principale.
-
Verifica che i servizi siano stati riavviati correttamente:
sudo systemctl status hive-hcatalog-server.service -
Apri una sessione Hive sul nodo principale. Quindi crea per prova una tabella.
Esempio:
hive> create table tb_test (col1 STRING, col2 BIGINT);OK Time taken: 2.371 seconds hive> describe tb_test; OK col1 string col2 bigint Time taken: 0.254 seconds, Fetched: 2 row(s) -
Per connetterti al metastore Amazon RDS per MySQL, utilizza il client mysql sul nodo principale. Quindi controlla i metadati della tabella nel metastore. Se i metadati corrispondono alla tabella creata nel passaggio precedente, la connessione SSL funziona.
Esempio:
$ mysql -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-user -p Enter password: example-rds-primary-password mysql> use hive; Database changed mysql> select t1.OWNER, t1.TBL_NAME, t1.TBL_TYPE, s1.INPUT_FORMAT, s1.OUTPUT_FORMAT, s1.LOCATION from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID where t1.TBL_NAME = 'tb_test'\G *************************** 1. row *************************** OWNER: hadoop TBL_NAME: tb_test TBL_TYPE: MANAGED_TABLE INPUT_FORMAT: org.apache.hadoop.mapred.TextInputFormat OUTPUT_FORMAT: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat LOCATION: hdfs://ip-xxx-xx-xx-xxx.ec2.internal:8020/user/hive/warehouse/tb_test 1 row in set (0.23 sec) mysql> select t1.OWNER, t1.TBL_NAME, c1.COLUMN_NAME, c1.TYPE_NAME from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID inner join COLUMNS_V2 c1 on c1.CD_ID = s1.CD_ID where t1.TBL_NAME = 'tb_test'; +--------+----------+-------------+-----------+ | OWNER | TBL_NAME | COLUMN_NAME | TYPE_NAME | +--------+----------+-------------+-----------+ | hadoop | tb_test | col1 | string | | hadoop | tb_test | col2 | bigint | +--------+----------+-------------+-----------+ 2 rows in set (0.22 sec)Nota: sostituisci example-rds-db-instance-endpoint con l'endpoint della tua istanza database Amazon RDS, example-rds-primary-user con il tuo nome utente principale in Amazon RDS e example-rds-primary-password con la tua password principale in Amazon RDS.
Risolvi gli errori di riavvio di hive-hcatalog-server
Quando provi a riavviare hive-hcatalog-server, potresti ricevere il seguente errore o simile:
"2020-08-20T14:18:50,750 WARN [main] org.apache.hadoop.hive.metastore.HiveMetaStore - Retrying creating default database after error: Unable to open a test connection to the given database. JDBC url = jdbc:mysql://mysql-hive-meta.########.us-east-1.rds.amazonaws.com:3306/hive?createDatabaseIfNotExist=true&useSSL=true&serverSSlCert=/home/hadoop/global-bundle.pem, username = masteruser. Terminating connection pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------java.sql.SQLException: Host '172.31.41.187' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"
Questo errore si verifica quando, per motivi di sicurezza, l'istanza database Amazon RDS per MySQL blocca a titolo precauzionale il nodo principale del cluster Amazon EMR. Per risolvere l'errore, completa i seguenti passaggi:
- Connettiti a un altro computer locale o a un'istanza Amazon Elastic Compute Cloud (Amazon EC2) su cui è installato lo strumento mysqladmin.
- Svuota il nodo principale dall'istanza database:
Nota: sostituisci example-rds-primary-username con il tuo nome utente principale in Amazon RDS e example-rds-primary-password con la tua password principale in Amazon RDS.mysqladmin -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-username -p flush-hosts Enter password: example-rds-primary-password - Riavvia hive-hcatalog-server.
Informazioni correlate
- Argomenti
- Analytics
- Tag
- Amazon EMR
- Lingua
- Italiano
Video correlati

