Passer au contenu

Comment puis-je configurer une connexion SSL entre Hive sur Amazon EMR et un metastore sur Amazon RDS for MySQL ?

Lecture de 9 minute(s)
0

Je souhaite configurer une connexion SSL entre Hive sur Amazon EMR et un metastore sur Amazon Relational Database Service (Amazon RDS) for MySQL.

Brève description

Pour configurer une connexion chiffrée entre Hive et un metastore externe, utilisez un certificat SSL. Vous pouvez configurer une connexion SSL lorsque vous lancez un nouveau cluster Amazon EMR ou une fois que le cluster est en cours d'exécution.

Remarque : Les étapes suivantes ont été testées sur Amazon EMR version 7.3.0 et Amazon RDS for MySQL version 8.0.39.

Résolution

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.

Configurer une connexion SSL sur un nouveau cluster Amazon EMR

Procédez comme suit :

  1. Pour créer une instance de base de données Amazon RDS for MySQL, exécutez la commande create-db-instance suivante :

    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

    Remarque : Remplacez example-db-instance-identifier par votre ID d'instance de base de données, example-subnet-group par le nom de votre groupe de sous-réseaux, example-rds-primary-user par votre nom d'utilisateur principal Amazon RDS et example-rds-primary-password par votre mot de passe principal Amazon RDS. Remplacez également example-rds-vpc-security-group par le nom de votre groupe de sécurité Amazon RDS Amazon Virtual Private Cloud (Amazon VPC).

  2. Connectez-vous à l'instance de base de données Amazon RDS for MySQL en tant qu'utilisateur principal. Puis, créez un utilisateur pour le metastore Hive :
    Remarque : Assurez-vous de restreindre l'accès de l'utilisateur principal à l'instance de base de données que vous avez créée précédemment.

    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;

    Remarque : Remplacez example-rds-db-instance-endpoint par le point de terminaison de votre instance de base de données Amazon RDS, example-rds-primary-user par votre nom d'utilisateur principal Amazon RDS et example-rds-primary-password par votre mot de passe principal Amazon RDS. Remplacez également example-hive-username par votre nom d'utilisateur Hive et example-hive-password par votre mot de passe pour example-hive-username.

  3. Créez un fichier de configuration JSON similaire au suivant :

    Remarque : Utilisez le fichier JSON suivant pour lancer le cluster Amazon EMR à l'étape suivante. Le fichier permet à Hive d'établir une connexion SSL avec l'instance de base de données 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"
            }
        }
    ]

    Remarque : Remplacez example-rds-db-instance-endpoint par le point de terminaison de votre instance de base de données Amazon RDS, example-hive-username par votre nom d'utilisateur que Hive utilisera pour se connecter à l'instance de base de données Amazon RDS, et example-hive-password par votre mot de passe pour example-hive-username.

  4. Créez une règle entrante dans le groupe de sécurité associé à votre instance Amazon RDS for MySQL comme suit :
    Dans Type, sélectionnez MySQL/Aurora (3306).
    Dans Protocole, TCP (6) est sélectionné par défaut.
    Dans Plage de ports, 3306 est sélectionné par défaut.
    Dans Source, saisissez l'ID de groupe du groupe de sécurité géré par Amazon EMR associé au nœud primaire.
    Remarque : Cette règle permet au nœud primaire du cluster Amazon EMR d'accéder à l'instance Amazon RDS. Pour plus d'informations, consultez la section Présentation des groupes de sécurité VPC.

  5. Créez le fichier de script d’action bootstrap suivant. Puis, téléchargez-le dans un compartiment Amazon S3. L'action bootstrap télécharge le certificat SSL vers /home/hadoop/ sur le nœud primaire.

    #!/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. Pour lancer un cluster Amazon EMR, exécutez la commande create-cluster suivante avec le fichier JSON précédent et l'action bootstrap :

    Exemple :

    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. Utilisez SSH pour vous connecter au nœud primaire.

  8. Ouvrez une session Hive sur le nœud primaire. Puis, créez une table à des fins de test.

    Exemple :

    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. Pour vous connecter au metastore Amazon RDS for MySQL, utilisez le client mysql sur le nœud primaire. Puis, vérifiez les métadonnées de la table dans le metastore. Si les métadonnées correspondent à la table que vous avez créée à l'étape précédente, la connexion SSL fonctionne.

    Exemple :

    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)

    Remarque : Remplacez example-rds-db-instance-endpoint par le point de terminaison de votre instance de base de données Amazon RDS, example-rds-primary-user par votre nom d'utilisateur principal Amazon RDS et example-rds-primary-password par votre mot de passe principal Amazon RDS.

Configurer une connexion SSL sur un cluster Amazon EMR en cours d'exécution

Remarque : Avant de commencer, assurez-vous que vous disposez d'une instance de base de données Amazon RDS for MySQL.

  1. Pour vous connecter au nœud primaire, utilisez SSH.

  2. Téléchargez le certificat SSL sur /home/hadoop/ sur le nœud primaire :

    cd /home/hadoop && wget -S -T 10 -t 5 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
  3. Dans le répertoire /etc/hive/conf.dist, ajoutez ou modifiez les lignes suivantes dans le fichier 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>

    Remarque : Remplacez example-rds-db-instance-endpoint par le point de terminaison de votre instance de base de données Amazon RDS, example-hive-username par votre nom d'utilisateur que Hive utilisera pour se connecter à l'instance de base de données Amazon RDS, et example-hive-password par votre mot de passe pour example-hive-username. De plus, l'esperluette (&) est un caractère spécial dans XML. Pour utiliser une esperluette dans le fichier hive-site.xml, par exemple dans la chaîne JDBC, utilisez & au lieu de &. Si vous n'utilisez pas &, vous recevrez un message d'erreur lors du redémarrage de hive-hcatalog-server.

  4. Testez la connexion 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

    Remarque : Remplacez example-rds-db-instance-endpoint par le point de terminaison de votre instance de base de données Amazon RDS, example-hive-username par votre nom d'utilisateur que Hive utilisera pour se connecter à l'instance de base de données Amazon RDS, et example-hive-password par votre mot de passe pour example-hive-username.

  5. Redémarrez hive-hcatalog-server sur le nœud primaire.

  6. Vérifiez que les services ont redémarré avec succès :

    sudo systemctl status hive-hcatalog-server.service
  7. Ouvrez une session Hive sur le nœud primaire. Puis, créez une table à des fins de test.

    Exemple :

    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. Pour vous connecter au metastore Amazon RDS for MySQL, utilisez le client mysql sur le nœud primaire. Puis, vérifiez les métadonnées de la table dans le metastore. Si les métadonnées correspondent à la table que vous avez créée à l'étape précédente, la connexion SSL fonctionne.

    Exemple :

    $ 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)

    Remarque : Remplacez example-rds-db-instance-endpoint par le point de terminaison de votre instance de base de données Amazon RDS, example-rds-primary-user par votre nom d'utilisateur principal Amazon RDS et example-rds-primary-password par votre mot de passe principal Amazon RDS.

Résoudre les erreurs de redémarrage du serveur hive-hcatalog-server

Lorsque vous essayez de redémarrer hive-hcatalog-server, vous pouvez recevoir l'erreur suivante ou similaire :

« 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' »

Cette erreur se produit lorsque l'instance de base de données Amazon RDS for MySQL bloque le nœud primaire du cluster Amazon EMR par mesure de sécurité. Pour résoudre cette erreur, procédez comme suit :

  1. Connectez-vous à un autre ordinateur local ou à une instance Amazon Elastic Compute Cloud (Amazon EC2) sur laquelle l'outil mysqladmin est installé.
  2. Videz le nœud primaire de l'instance de base de données :
    mysqladmin -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-username -p flush-hosts
    Enter password: example-rds-primary-password
    Remarque : Remplacez example-rds-primary-username par votre nom d'utilisateur principal Amazon RDS et example-rds-primary-password par votre mot de passe principal Amazon RDS.
  3. Redémarrez hive-hcatalog-server.

Informations connexes

Utilisation d'une base de données MySQL externe ou Amazon Aurora

AWS OFFICIELA mis à jour il y a un an