Salta al contenuto

Come posso configurare una connessione SSL tra Hive su Amazon EMR e un metastore su Amazon RDS for MySQL?

9 minuti di lettura
0

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:

  1. 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-group

    Nota: 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).

  2. 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-password
    CREATE 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.

  3. 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.

  4. 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.

  5. 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
  6. 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}]}}]'
  7. Utilizza SSH per connetterti al nodo principale.

  8. 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)
  9. 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.

  1. Utilizza SSH per connetterti al nodo principale.

  2. 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
  3. 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&amp;useSSL=true&amp;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.

  4. 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-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.

  5. Riavvia hive-hcatalog-server sul nodo principale.

  6. Verifica che i servizi siano stati riavviati correttamente:

    sudo systemctl status hive-hcatalog-server.service
  7. 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)
  8. 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:

  1. Connettiti a un altro computer locale o a un'istanza Amazon Elastic Compute Cloud (Amazon EC2) su cui è installato lo strumento mysqladmin.
  2. Svuota il nodo principale dall'istanza database:
    mysqladmin -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-username -p flush-hosts
    Enter password: example-rds-primary-password
    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.
  3. Riavvia hive-hcatalog-server.

Informazioni correlate

Utilizzo di un database MySQL esterno o Amazon Aurora

AWS UFFICIALEAggiornata 10 mesi fa