AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
Amazon EMR で Hive の外部メタストアとして PostgreSQL データベースを使用する方法を教えてください。
Amazon EMR で Apache Hive の外部メタストアとして、Amazon Relational Database Service (Amazon RDS) for PostgreSQL DB インスタンスを使用したいと考えています。
解決策
開始する前に、次の点に注意してください。
- このソリューションは、アクティブな PostgreSQL データベースがすでにあることを前提としています。
- Amazon EMR リリースバージョン 5.7 以前を使用している場合は、まず PgJDBC ウェブサイトから PostgreSQL JDBC ドライバーをダウンロードします。次に、ドライバーを Hive ライブラリパス (/usr/lib/hive/lib) に追加します。Amazon EMR リリースバージョン 5.8.0 以降では、Hive ライブラリパスに PostgreSQL JDBC ドライバーが付属しています。
PostgreSQL DB インスタンスを Hive の外部メタストアとして設定する
次の手順を実行します。
-
Amazon RDS for PostgreSQL の DB インスタンスとデータベースを作成します。
注: Amazon Aurora と RDS コンソールで DB インスタンスを作成するときに、データベースを作成できます。データベース名は、[追加設定] の [初期データベース名] フィールドで指定できます。または、PostgreSQL データベースインスタンスを接続してデータベースを作成することもできます。 -
データベースと ElasticMapReduce-master セキュリティグループ間のポート 5432 での接続を許可するには、DB インスタンスのセキュリティグループを変更します。詳細については、「VPC セキュリティグループ」を参照してください。
-
外部メタストアなしで Amazon EMR クラスターを起動します。この場合、Amazon EMR はデフォルトの MySQL データベースを使用します。
-
Hive の設定を更新します。
以下は 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> -
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 -
更新と変更を適用するには、Hive サービスを停止して起動します。
[hadoop@ip-X-X-X-X bin]$ sudo initctl list |grep -i hivehive-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注: ステップ 5 ~ 7 を自動化するには、次の bash スクリプト (hive_postgres_emr_step.sh) を 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--------------------"スクリプト内の次の値を置き換えてください。
- rds_db_instance_endpoint: DB インスタンスのエンドポイント
- rds_db_instance_port: DB インスタンスのポート
- rds_db_name: PostgreSQL データベースの名前
- rds_db_instance_username: DB インスタンスのユーザー名
- rds_db_instance_password: DB インスタンスのパスワード
スクリプトを Amazon S3 にアップロードする
Amazon EMR コンソール、AWS コマンドラインインターフェイス (AWS CLI)、または API を使用して、スクリプトをステップジョブとして実行できます。Amazon EMR コンソールを使用してスクリプトを実行するには、以下を実行します。
-
Amazon EMR コンソールを開きます。
-
[クラスターリスト] ページで、クラスターのリンクを選択します。
-
[クラスターの詳細] ページで、[ステップ] タブをクリックします。
-
[ステップ] タブで、[ステップを追加] をクリックします。
-
[ステップを追加] ダイアログで、[ステップタイプ] と [名前] のデフォルト値をそのまま使用します。
-
[JAR の場所] には、次のように入力します。
command-runner.jar -
[引数] には、次のように入力します。
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 の場所を、スクリプトを保存した場所に置き換えます。
-
[追加] をクリックし、ステップジョブを実行します。
Hive 設定の更新を確認する
次の手順を実行します。
-
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 -
PostgreSQL をインストールするには、次のコマンドを実行します。
[hadoop@ip-X-X-X-X bin]$ sudo yum install postgresql -
コマンドラインを使用して PostgreSQL DB インスタンスに接続します。
コマンド内の次の値を置き換えてください。
mypostgresql.testabcd1111.us-west-2.rds.amazonaws.com: DB インスタンスのエンドポイント
mypgdb: PostgreSQL データベースの名前
database_usernam: 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 -
プロンプトが表示されたら、DB インスタンスのパスワードを入力します。
-
前に作成した 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)
関連情報
Configuring an external metastore for Hive (Hive 用の外部メタストアの設定)
