Amazon EMR で PostgreSQL データベースを Hive の外部メタデータとして使用する方法を教えてください。
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 データベースを使用します。
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 の外部メタストアとして使用しています。
関連情報
関連するコンテンツ
- 質問済み 10ヶ月前lg...
- 質問済み 7年前lg...
- 質問済み 24日前lg...
- AWS公式更新しました 3年前