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

最終更新日: 2022 年 1 月 31 日

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.    Amazon RDS for PostgreSQL DB インスタンスを作成し、データベースを作成します。これは、AWS コンソールで Amazon RDS から DB インスタンスを作成しているときに実行できます。データベース名は、[追加設定] の [初期データベース名] フィールドで指定できます。または、PostgreSQL データベースインスタンスに接続して、データベースを作成することもできます。

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

3.    外部メタストアを使用せずに Amazon EMR クラスターを起動します。この場合、Amazon EMR はデフォルトの MySQL データベースを使用します。

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

5.    Hive 設定を次のプロパティに置き換えます。
例にある次の値を置き換えます。
mypostgresql.testabcd1111.us-west-2.rds.amazonaws.com を、DB インスタンスのエンドポイントへ
mypgdb を、PostgreSQL データベース名へ
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.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.    以下のコマンドを実行して、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.    更新された設定が有効となるように、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

EMR クラスターで次の bash スクリプト (hive_postgres_emr_step.sh) をステップジョブとして実行することで、前のプロセスのステップ 5~7 を自動化することを選択できます。

## 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--------------------"

スクリプトの次の値を置き換えてください。

  • rds_db_instance_endpoint を DB インスタンスのエンドポイントへ
  • rds_db_instance_port を DB インスタンスのポートへ
  • rds_db_name を PostgreSQL データベース名へ
  • rds_db_instance_username を DB インスタンスのユーザー名へ
  • rds_db_instance_password を、DB インスタンスのパスワードへ

スクリプトを Simple Storage Service (Amazon S3) にアップロードします。Amazon EMR コンソール、AWS Command Line Interface (AWS CLI)、または API を使用して、スクリプトをステップジョブとして実行できます。Amazon EMR コンソールを使用してスクリプトを実行するには、次の操作を行います。

1.    Amazon EMR コンソールを開きます。

2.    クラスターリストのページで、クラスターのリンクを選択します。

3.    クラスターの詳細ページで [Steps] (ステップ) タブを選択します。

4.    [Steps] (ステップ) タブで、[Add step] (ステップの追加) を選択します。

5.    [Add step] (ステップの追加) ダイアログボックスで、[Step type] (ステップタイプ) と [Name] (名前) のデフォルト値を保持します。

6.    [JAR location] (JAR の場所) には、次のように入力します。

command-runner.jar

7.    [引数] に、次のように入力します。

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"

コマンド内の S3 の場所を、スクリプトを保存した場所に置き換えます。

8.    [Add] (追加) を選択し、ステップジョブを実行します。

ステップジョブが完了したら、次の手順を実行して Hive 設定の更新を確認します。

1.    Hive シェルにログインし、Hive テーブルを作成します。

注意: 例の test_postgres を 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.    PostgreSQL をインストールします。

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

3.    コマンドラインを使用して、PostgreSQL DB インスタンスに接続します。

コマンドにある次の値を置き換えます。
mypostgresql.testabcd1111.us-west-2.rds.amazonaws.com を、DB インスタンスのエンドポイントへ
mypgdb を、PostegreSQL データベース名へ
database_username を、DB インスタンスのユーザー名へ

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

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

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)

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


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?