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

Date de la dernière mise à jour : 10/10/2019

Comment utiliser une base de données Amazon Relational Database Service (Amazon RDS) pour l'instance de base de données PostgreSQL comme metastore externe pour Apache Hive sur Amazon EMR ?

Ré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 au chemin de la bibliothèque Hive (/usr/lib/hive/lib). La version 5.8.0 d'Amazon EMR et les 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 :

1.    Créez une instance de base de données PostgreSQL.

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 metastore externe (uniquement la base de données MySQL par défaut).

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

5.    Remplacez la configuration Hive par les propriétés suivantes. Remplacez ces valeurs dans l'exemple suivant :
mypostgresql.c6c8mwvfdgv0.us-west-2.rds.amazonaws.com : point de terminaison de votre instance de base de données
mypgdb : nom de votre base de données PostegreSQL
database_username : nom d'utilisateur de l'instance de base de données
database_password : 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.c6c8mwvfdgv0.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.c6c8mwvfdgv0.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 modifiés :

[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

8.    Connectez-vous au shell Hive, puis créez une table Hive. Dans l'exemple suivant, la table s'appelle « test_postgres ».

[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

9.    Installez PostgreSQL :

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

10.   Connectez-vous à l'instance de base de données PostgreSQL en utilisant la ligne de commande. Remplacez ces valeurs dans l'exemple suivant :
mypostgresql.c6c8mwvfdgv0.us-west-2.rds.amazonaws.com : point de terminaison de votre instance de base de données
mypgdb : nom de votre base de données PostegreSQL
database_username : nom d'utilisateur de l'instance de base de données

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

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

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

[hadoop@ip-X-X-X-X bin]$ 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.