Comment utiliser une base de données PostgreSQL comme metastore externe pour Hive sur Amazon EMR ?

Dernière mise à jour : 31-01-2022

Je souhaite utiliser un Amazon Relational Database Service (Amazon RDS) pour l'instance de base de données PostgreSQL comme metastore externe pour Apache Hive sur Amazon EMR.

Solution

Avant de commencer, notez les points suivants :

  • Cette solution suppose qu'une base de données PostgreSQL est déjà active.
  • Si vous utilisez Amazon EMR version 5.7 ou une version antérieure, téléchargez le pilote JDBC PostgreSQL. Ensuite, ajoutez le pilote au chemin de la bibliothèque Hive (/usr/lib/hive/lib). Les versions 5.8.0 d'Amazon EMR et versions ultérieures sont fournies avec le pilote JDBC PostgreSQL dans le chemin de la bibliothèque Hive.

Pour configurer une instance de base de données PostgreSQL comme metastore externe pour Hive, procédez comme suit :

1.    Créez une instance de bases de données Amazon RDS for PostgreSQL et créez la base de données. Notez que vous pouvez le faire lors de la création de l'instance de bases de données à partir d'Amazon RDS dans la console AWS. Vous pouvez spécifier le nom de la base de données dans le champ Nom de base de données initial sous Configuration supplémentaire. Vous pouvez également connecter l'instance de base de données PostgreSQL, puis créer la base de données.

2.    Modifiez le groupe de sécurité de l'instance de base de données pour autoriser les connexions sur le port 5432 entre votre base de données et le groupe de sécurité ElasticMapReduce-master. Pour plus d'informations, consultez Groupes de sécurité VPC.

3.    Lancez un cluster Amazon EMR sans métastore externe. Amazon EMR utilise la base de données MySQL par défaut dans ce cas.

4.    Connectez-vous au nœud principal en utilisant SSH.

5.    Remplacez la configuration Hive par les propriétés suivantes.
Remplacez les valeurs suivantes dans l'exemple :
mypostgresql.testabcd1111.us-west-2.rds.amazonaws.com par le point de terminaison de votre instance de base de données
mypgdb par le nom de votre base de données PostegreSQL
database_username par le nom d'utilisateur de l'instance de base de données
database_password par le mot de passe de l'instance de base de données

[hadoop@ip-X-X-X-X ~]$ sudo vi /etc/hive/conf/hive-site.xml

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:postgresql://mypostgresql.testabcd1111.us-west-2.rds.amazonaws.com:5432/mypgdb</value>
    <description>PostgreSQL JDBC driver connection URL</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>org.postgresql.Driver</value>
    <description>PostgreSQL metastore driver class name</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>database_username</value>
    <description>the username for the DB instance</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>database_password</value>
    <description>the password for the DB instance</description>
  </property>

6.    Exécutez les commandes suivantes pour créer le schéma PostgreSQL :

[hadoop@ip-X-X-X-X ~]$ cd /usr/lib/hive/bin/
[hadoop@ip-X-X-X-X bin]$ ./schematool -dbType postgres -initSchema  
Metastore connection URL:     jdbc:postgresql://mypostgresql.testabcd1111.us-west-2.rds.amazonaws.com:5432/mypgdb
Metastore Connection Driver :     org.postgresql.Driver
Metastore connection User:     test
Starting metastore schema initialization to 2.3.0
Initialization script hive-schema-2.3.0.postgres.sql
Initialization script completed
schemaTool completed

7.    Arrêtez et démarrez les services Hive pour appliquer les paramètres mis à jour :

[hadoop@ip-X-X-X-X bin]$ sudo initctl list |grep -i hive
hive-server2 start/running, process 11818
hive-hcatalog-server start/running, process 12708
[hadoop@ip-X-X-X-X9 bin]$ sudo stop hive-server2
hive-server2 stop/waiting
[hadoop@ip-X-X-X-X bin]$ sudo stop hive-hcatalog-server
hive-hcatalog-server stop/waiting
[hadoop@ip-X-X-X-X bin]$ sudo start hive-server2
hive-server2 start/running, process 18798
[hadoop@ip-X-X-X-X bin]$ sudo start hive-hcatalog-server
hive-hcatalog-server start/running, process 19614

Vous pouvez choisir d'automatiser les étapes 5 à 7 du processus précédent en exécutant le script bash suivant (hive_postgres_emr_step.sh) en tant que tâche d’étape dans le cluster EMR.

## Automated Bash script to update the hive-site.xml and restart Hive

## Parameters
rds_db_instance_endpoint='<rds_db_instance_endpoint>'
rds_db_instance_port='<rds_db_instance_port>'
rds_db_name='<rds_db_name>'
rds_db_instance_username='<rds_db_instance_username>'
rds_db_instance_password='<rds_db_instance_username>'

############################# Copying the original hive-site.xml
sudo cp /etc/hive/conf/hive-site.xml /tmp/hive-site.xml

############################# Changing the JDBC URL
old_jdbc=`grep "javax.jdo.option.ConnectionURL" -A +3 -B 1 /tmp/hive-site.xml | grep "<value>" | xargs`
sudo sed -i "s|$old_jdbc|<value>jdbc:postgresql://$rds_db_instance_endpoint:$rds_db_instance_port/$rds_db_name</value>|g" /tmp/hive-site.xml

############################# Changing the Driver name
old_driver_name=`grep "javax.jdo.option.ConnectionDriverName" -A +3 -B 1 /tmp/hive-site.xml | grep "<value>" | xargs`
sudo sed -i "s|$old_driver_name|<value>org.postgresql.Driver</value>|g" /tmp/hive-site.xml

############################# Changing the database user
old_db_username=`grep "javax.jdo.option.ConnectionUserName"  -A +3 -B 1 /tmp/hive-site.xml | grep "<value>" | xargs`
sudo sed -i "s|$old_db_username|<value>$rds_db_instance_username</value>|g" /tmp/hive-site.xml

############################# Changing the database password and description
connection_password=`grep "javax.jdo.option.ConnectionPassword" -A +3 -B 1 /tmp/hive-site.xml | grep "<value>" | xargs`
sudo sed -i "s|$connection_password|<value>$rds_db_instance_password</value>|g" /tmp/hive-site.xml
old_password_description=`grep "javax.jdo.option.ConnectionPassword" -A +3 -B 1 /tmp/hive-site.xml | grep "<description>" | xargs`
new_password_description='<description>the password for the DB instance</description>'
sudo sed -i "s|$password_description|$new_password_description|g" /tmp/hive-site.xml

############################# Moving hive-site to backup
sudo mv /etc/hive/conf/hive-site.xml /etc/hive/conf/hive-site.xml_bkup
sudo mv /tmp/hive-site.xml /etc/hive/conf/hive-site.xml

############################# Init Schema for Postgres
/usr/lib/hive/bin/schematool -dbType postgres -initSchema

############################# Restart Hive
## Check Amazon Linux version and restart Hive
OS_version=`uname -r`
if [[ "$OS_version" == *"amzn2"* ]]; then
    echo "Amazon Linux 2 instance, restarting Hive..."
    sudo systemctl stop hive-server2
    sudo systemctl stop hive-hcatalog-server
    sudo systemctl start hive-server2
    sudo systemctl start hive-hcatalog-server
elif [[ "$OS_version" == *"amzn1"* ]]; then
    echo "Amazon Linux 1 instance, restarting Hive"
    sudo stop hive-server2
    sudo stop hive-hcatalog-server
    sudo start hive-server2
    sudo start hive-hcatalog-server
else
    echo "ERROR: OS version different from AL1 or AL2."
fi
echo "--------------------COMPLETED--------------------"

Veillez à remplacer les valeurs suivantes dans le script :

  • rds_db_instance_endpoint par le point de terminaison de votre instance de base de données
  • rds_db_instance_port avec le port par le port de votre instance de bases de données
  • rds_db_name par le nom de votre base de données PostgreSQL
  • rds_db_instance_username par le nom d'utilisateur de l'instance de base de données
  • rds_db_instance_password par le mot de passe de l'instance de base de données

Chargez le script sur Amazon S3. Vous pouvez exécuter le script en tant que tâche d’étape à l'aide de la console Amazon EMR, de AWS Command Line Interface (AWS CLI) ou de l'API. Pour utiliser la console Amazon EMR afin d'exécuter le script, procédez comme suit :

1.    Ouvrez la console Amazon EMR.

2.    Sur la page Liste des clusters, sélectionnez le lien correspondant à votre cluster.

3.    Sur la page Détails du cluster, choisissez l'onglet Steps (Étapes).

4.    Dans l'onglet Steps (Étapes), choisissez Add step (Ajouter une étape).

5.    Dans la boîte de dialogue Ajouter une étape, conservez les valeurs par défaut pour Step type (Type d'étape) et Name (Nom).

6.    Pour JAR location (emplacement du fichier JAR), saisissez ce qui suit :

command-runner.jar

7.    Pour Arguments, saisissez ce qui suit :

bash -c "aws s3 cp s3://example_bucket/script/hive_postgres_emr_step.sh .; chmod +x hive_postgres_emr_step.sh; ./hive_postgres_emr_step.sh"

Remplacez l'emplacement S3 de la commande par l'emplacement où vous avez stocké le script.

8.    Choisissez Add (Ajouter) pour exécuter la tâche d’étape.

Une fois la tâche d'étape terminée, procédez comme suit pour vérifier les mises à jour de la configuration de Hive :

1.    Connectez-vous au shell Hive, puis créez une table Hive.

Remarque : assurez-vous de remplacer test_postgres dans l’exemple par le nom de votre table Hive.

[hadoop@ip-X-X-X-X bin]$ hive

Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j2.properties Async: true
hive> show databases;
OK
default
Time taken: 0.569 seconds, Fetched: 1 row(s)
hive> create table test_postgres(a int,b int);
OK
Time taken: 0.708 seconds

2.    Installez PostgreSQL :

[hadoop@ip-X-X-X-X bin]$ sudo yum install postgresql

3.    Connectez-vous à l'instance de base de données PostgreSQL en utilisant la ligne de commande.

Remplacez les valeurs suivantes dans la commande :
mypostgresql.testabcd1111.us-west-2.rds.amazonaws.com par le point de terminaison de votre instance de base de données
mypgdb par le nom de votre base de données PostegreSQL
database_username par le nom d'utilisateur de l'instance de base de données

[hadoop@ip-X-X-X-X bin]$ psql --host=mypostgresql.testabcd1111.us-west-2.rds.amazonaws.com --port=5432 --username=database_username --password --dbname=mypgdb

4.    Lorsque vous y êtes invité, saisissez le mot de passe de l'instance de base de données.

5.    Exécutez la commande suivante pour vérifier que vous pouvez accéder à la table Hive que vous avez créée :

mypgdb=>  select * from "TBLS";

 TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER  | RETENTION | SD_ID |   TBL_NAME    |   TBL_TYPE    | VIEW_EXPANDED_TEXT | VIEW_ORIGINAL_TEXT | IS_REWRITE_ENABLED 
--------+-------------+-------+------------------+--------+-----------+-------+---------------+---------------+--------------------+--------------------+--------------------
      1 |  1555014961 |     1 |                0 | hadoop |         0 |     1 | test_postgres | MANAGED_TABLE |                    |                    | f
(1 row)

Votre cluster Amazon EMR utilise maintenant la base de données PostgreSQL comme metastore externe pour Hive.