スキップしてコンテンツを表示

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

所要時間4分
0

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 の外部メタストアとして設定する

次の手順を実行します。

  1. Amazon RDS for PostgreSQL の DB インスタンスとデータベースを作成します。
    注: Amazon Aurora と RDS コンソールで DB インスタンスを作成するときに、データベースを作成できます。データベース名は、[追加設定] の [初期データベース名] フィールドで指定できます。または、PostgreSQL データベースインスタンスを接続してデータベースを作成することもできます。

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

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

  4. SSH を使用してプライマリノードに接続します

  5. 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>
  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 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 コンソールを使用してスクリプトを実行するには、以下を実行します。

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

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

  3. [クラスターの詳細] ページで、[ステップ] タブをクリックします。

  4. [ステップ] タブで、[ステップを追加] をクリックします。

  5. [ステップを追加] ダイアログで、[ステップタイプ] と [名前] のデフォルト値をそのまま使用します。

  6. [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. [追加] をクリックし、ステップジョブを実行します。

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

関連情報

Configuring an external metastore for Hive (Hive 用の外部メタストアの設定)

PostgreSQL データベースエンジンを実行する DB インスタンスへの接続

AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ