Amazon EMR で Hive の外部メタデータとして PostgreSQL データベースを使用する方法を教えてください。

最終更新日: 2019 年 10 月 10 日

Amazon EMR で Apache Hive の外部メタデータとして、PostgreSQL DB インスタンス用の Amazon Relational Database Service (Amazon RDS) を使用する方法を教えてください。

解決方法

開始する前に、以下の点に注意してください。

  • このソリューションでは、アクティブな PostgreSQL データベースがすでに存在することを前提としています。
  • Amazon EMR リリースバージョン 5.7 以前を使用している場合は、PostgreSQL JDBC ドライバをダウンロードしてください。次に、そのデータベースを Hive ライブラリパス (/usr/lib/hive/lib) に追加します。Amazon EMR リリースバージョン 5.8.0 以降には、Hive ライブラリパスに PostgreSQL JDBC ドライバが付属しています。

PostgreSQL DB インスタンスを Hive の外部メタストアとして設定するには

1.    PostgreSQL DB インスタンスを作成します

2.    DBインスタンスセキュリティグループを変更して、データベースと ElasticMapReduce-master セキュリティグループ間のポート 5432 での接続を許可します。詳細については、「VPC セキュリティグループ」をご参照ください。

3.    外部メタストアなし (デフォルトの MySQL データベースのみ) で Amazon EMR クラスターを起動します。

4.    SSH を使用してマスターノードに接続します

5.    Hive 設定を次のプロパティに置き換えます。この例では、これらの値を置き換えます。
mypostgresql.c6c8mwvfdgv0.us-west-2.rds.amazonaws.com: DB インスタンスのエンドポイント
mypgdb: PostegreSQL データベース名
database_username: DB インスタンスユーザー名
database_password: DB インスタンスのパスワード

[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.    以下のコマンドを実行して、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.    更新された設定が有効となるように、Hive サービスを停止してから開始します。

[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.    Hive シェルにログインし、Hive テーブルを作成します。次の例では、テーブルは「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.    PostgreSQL をインストールします。

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

10.   コマンドラインを使用して、PostgreSQL DB インスタンスに接続します。この例では、これらの値を置き換えます。
mypostgresql.c6c8mwvfdgv0.us-west-2.rds.amazonaws.com: DB インスタンスのエンドポイント
mypgdb: PostegreSQL データベース名
database_username: DB インスタンスユーザー名

[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.   プロンプトが表示されたら、DB インスタンスのパスワードを入力します。

12.   次のコマンドを実行して、以前に作成した Hive テーブルにアクセスできることを確認します。

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

Amazon EMR クラスターは PostgreSQL データベースを、Hive の外部メタストアとして使用しています。