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

Lecture de 8 minute(s)
0

Je veux configurer une connexion SSL entre Apache Hive et un metastore qui se trouve sur une instance de base de données MySQL Amazon Relational Database Service (Amazon RDS). Quelle est la marche à suivre ?

Brève description

Configurez une connexion chiffrée entre Hive et un metastore externe à l'aide d'un certificat SSL. Vous pouvez configurer cette connexion lorsque vous lancez un nouveau cluster Amazon EMR ou lorsque le cluster est en cours d'exécution.

Résolution

Remarque : les étapes suivantes ont été testées avec Amazon EMR version 5.36.0 et Amazon RDS for MySQL version 8.0.28

Configurer la connexion SSL sur un nouveau cluster Amazon EMR

1.    Pour créer une instance de base de données Amazon RDS for MySQL, exécutez une commande similaire à la suivante. Remplacez $RDS_LEADER_USER_NAME, $RDS_LEADER_PASSWORD, $RDS_VPC_SG et $DB_SUBNET_GROUP respectivement par vos nom d'utilisateur, mot de passe, groupe de sécurité et groupe de sous-réseaux de base de données.

Pour plus d'informations, consultez la rubrique create-db-instance.

Remarque : si vous recevez des erreurs lors de l'exécution de commandes de l'interface de la ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente de la CLI.

aws rds create-db-instance --db-name hive --db-instance-identifier mysql-hive-meta --db-instance-class db.t2.micro --engine mysql --engine-version 8.0.28 --db-subnet-group-name $DB_SUBNET_GROUP --master-username $RDS_LEADER_USER_NAME --master-user-password $RDS_LEADER_PASSWORD --allocated-storage 20 --storage-type gp2 --vpc-security-group-ids $RDS_VPC_SG --publicly-accessible

2.    Connectez-vous à l'instance de base de données Amazon RDS for MySQL en tant qu'utilisateur principal. Ensuite, créez un utilisateur pour le metastore Hive, comme indiqué dans l'exemple suivant.

Important : veillez à restreindre l'accès de cet utilisateur à l'instance de base de données que vous avez créée à l'étape 1.

mysql -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u $RDS_LEADER_USER_NAME -p
Enter password: $RDS_LEADER_PASSWORD

CREATE USER 'hive_user'@'%' IDENTIFIED BY 'hive_user_password' REQUIRE SSL;
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hive_user'@'%';
GRANT ALL PRIVILEGES ON hive.* TO 'hive_user'@'%';
FLUSH PRIVILEGES;

3.    Créez un fichier de configuration JSON similaire à ce qui suit : Remplacez hive_user et hive_user_password par les valeurs utilisées dans le script JSON de l'étape 2. Remplacez le point de terminaison dans l'URL JDBC par le point de terminaison de votre instance de base de données RDS.

Utilisez ce fichier pour lancer le cluster Amazon EMR lors de l'étape suivante. Le fichier permet à Hive d'établir une connexion SSL avec l'instance de base de données RDS. Pour plus d'informations, consultez la rubrique Using new SSL/TLS certificates for MySQL DB instances (Utilisation de nouveaux certificats SSL/TLS pour les instances de base de données MySQL).

[
    {
        "Classification": "hive-site",
        "Properties": {
            "javax.jdo.option.ConnectionURL": "jdbc:mysql:\/\/mysql-hive-meta.########.us-east-1.rds.amazonaws.com:3306\/hive?createDatabaseIfNotExist=true&useSSL=true&serverSslCert=\/home\/hadoop\/global-bundle.pem,
            "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver",
            "javax.jdo.option.ConnectionUserName": "hive_user",
            "javax.jdo.option.ConnectionPassword": "hive_user_password"
        }
    }
]

4.    Dans le groupe de sécurité associé à l'instance Amazon RDS for MySQL, créez une règle entrante avec les paramètres suivants :
Pour Type, choisissez MYSQL/Aurora (3306).
Pour Protocol (Protocole), TCP (6) est sélectionné par défaut.
Pour Port Range (Plage de ports), 3306 est sélectionné par défaut.
Pour Source, saisissez l'ID de groupe du groupe de sécurité géré par Amazon EMR associé au nœud principal.

Cette règle permet au nœud principal du cluster Amazon EMR d'accéder à l'instance Amazon RDS. Pour plus d'informations, consultez la rubrique Overview of VPC security groups (Aperçu des groupes de sécurité VPC).

5.    Exécutez la commande create-cluster pour lancer un cluster Amazon EMR à l'aide du fichier JSON de l'étape 3, ainsi qu'une action d'amorçage. L'action d'amorçage télécharge le certificat SSL vers /home/hadoop/ sur le nœud principal.

Par exemple :

aws emr create-cluster --applications Name=Hadoop Name=Hive --tags Name="EMR Hive Metastore SSL" --ec2-attributes KeyName=$EC2_KEY_PAIR,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=$EMR_SUBNET,EmrManagedSlaveSecurityGroup=$EMR_CORE_AND_TASK_VPC_SG,EmrManagedMasterSecurityGroup=$EMR_MASTER_VPC_SG --service-role EMR_DefaultRole --release-label emr-5.36.0 --log-uri $LOG_URI --name "Hive External Metastore RDS MySQL w/ SSL" --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m4.xlarge,Name="Master- 1" --configurations file:///<Full-Path-To>/hive-ext-meta-mysql-ssl.json --bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/run-if,Args=["instance.isMaster=true","cd /home/hadoop && wget -S -T 10 -t 5 https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem"]

6.    Connectez-vous au nœud principal à l'aide de SSH.

7.    Ouvrez une séance hive sur le nœud principal. Ensuite, créez n'importe quelle table (à utiliser à des fins de test).

Par 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.    Connectez-vous au metastore Amazon RDS for MySQL à l'aide du client mysql sur le nœud principal. Ensuite, vérifiez les métadonnées de la table dans le metastore. Si les métadonnées correspondant à la table que vous avez créée à l'étape précédente existent, la connexion SSL fonctionne.

Par exemple :

mysql -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u $RDS_LEADER_USER_NAME -p
Enter password: $RDS_LEADER_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)

Configuration de la connexion SSL sur un cluster Amazon EMR en cours d'exécution

Remarque : les étapes suivantes supposent que vous disposez d'une instance de base de données Amazon RDS for MySQL.

1.    Connectez-vous au nœud principal à l'aide de SSH.

2.    Exécutez la commande suivante pour télécharger le certificat SSL dans le répertoire /home/hadoop/ du nœud principal :

cd /home/hadoop && wget -S -T 10 -t 5 https://s3.amazonaws.com/rds-downloads/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://mysql-hive-meta.########.us-east-1.rds.amazonaws.com:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=true&amp;serverSslCert=/home/hadoop/global-bundle.pem</value>
  <description>JDBC URL for the metastore database</description>
</property>

<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive_user</value>
    <description>User name for the metastore database</description>
</property>

<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>HIVE_USER_PASSWORD</value>
    <description>Password for metastore database</description>
</property>

Cette syntaxe permet une connexion SSL à l'instance de base de données RDS. Assurez-vous de remplacer le point de terminaison dans l'URL JDBC par le point de terminaison de votre instance de base de données RDS.

Important : l'esperluette (&) est un caractère spécial dans XML. Pour l'utiliser dans hive-site.xml, comme dans la chaîne JDBC, vous devez utiliser « & » au lieu de « & ». Sinon, vous obtenez une erreur lorsque vous redémarrez hive-hcatalog-server.

4.    Exécutez une commande similaire à ce qui suit afin de tester la connexion SSL :

mysql -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u hive_user -p --ssl-ca /home/hadoop/rds-combined-ca-bundle.pem

5.    Redémarrez hive-hcatalog-server sur le nœud principal. Pour de plus amples informations, consultez la rubrique Stopping and restarting processes (Arrêt et redémarrage des instances).

6.    Vérifiez que les services ont redémarré correctement :

sudo systemctl status hive-hcatalog-server.service

7.    Ouvrez une séance hive sur le nœud principal. Ensuite, créez n'importe quelle table (à utiliser à des fins de test).

Par 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.    Connectez-vous au metastore Amazon RDS for MySQL à l'aide du client mysql sur le nœud principal. Ensuite, 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.

Par exemple :

$ mysql -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u $RDS_LEADER_USER_NAME -p
Enter password: $RDS_LEADER_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)

Résolution des erreurs de redémarrage du serveur hive-hcatalog-server

Vous risquez de recevoir un message d'erreur semblable au suivant lorsque vous tentez de redémarrer hive-hcatalog-server :

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'

Cela se produit généralement lorsque l'instance de base de données Amazon RDS for MySQL bloque le nœud principal du cluster Amazon EMR par mesure de sécurité.

Pour résoudre cette erreur, connectez-vous à une autre machine locale ou à une autre instance Amazon Elastic Compute Cloud (Amazon EC2) sur laquelle l'outil mysqladmin est installé. Exécutez la commande suivante pour vider le nœud principal depuis l'instance de base de données.

mysqladmin -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u $RDS_LEADER_USER_NAME -p flush-hosts
Enter password: $RDS_LEADER_PASSWORD

Ensuite, redémarrez hive-hcatalog-server.


Informations connexes

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

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an