내용으로 건너뛰기

PostgreSQL 데이터베이스를 Amazon EMR에서 Hive용 외부 메타스토어로 사용하려면 어떻게 해야 합니까?

5분 분량
0

PostgreSQL DB 인스턴스용 Amazon Relational Database Service(Amazon RDS)를 Amazon EMR에서 Apache Hive용 외부 메타스토어로 사용하고 싶습니다.

해결 방법

시작하기 전에 다음 사항에 유의하십시오.

  • 이 해결 방법은 이미 활성화된 PostgreSQL 데이터베이스가 있다고 가정합니다.
  • Amazon EMR 릴리스 버전 5.7 이하를 사용하는 경우 먼저 pgJDBC 웹사이트에서 PostgreSQL JDBC 드라이버를 다운로드하십시오. 그런 다음 드라이버를 Hive 라이브러리 경로(/usr/lib/hive/lib)에 추가합니다. Amazon EMR 5.8.0 버전 이상에는 Hive 라이브러리 경로에 PostgreSQL JDBC 드라이버가 포함되어 있습니다.

Hive의 외부 메타스토어로 PostgreSQL DB 인스턴스 구성

다음 단계를 완료하십시오.

  1. Amazon RDS for PostgreSQL DB 인스턴스와 데이터베이스를 생성합니다.
    참고: Amazon Aurora 및 RDS 콘솔에서 DB 인스턴스를 생성하는 동안 데이터베이스를 생성할 수 있습니다. Additional configuration(추가 구성)의 Initial database name(초기 데이터베이스 이름) 필드에 데이터베이스 이름을 지정할 수 있습니다. 또는 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단계를 자동화하려면 EMR 클러스터에서 다음 bash 스크립트(hive_postgres_emr_step.sh)를 단계 작업으로 실행하십시오.

    ## 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 Command Line Interface(AWS CLI) 또는 API를 통해 단계별 작업으로 실행할 수 있습니다. Amazon EMR 콘솔을 사용하여 스크립트를 실행하려면 다음 작업을 수행하십시오.

  1. Amazon EMR 콘솔을 엽니다.

  2. Cluster List(클러스터 목록) 페이지에서 클러스터의 링크를 선택합니다.

  3. Cluster Details(클러스터 세부 정보) 페이지에서 Steps(단계) 탭을 선택합니다.

  4. Steps(단계) 탭에서 Add step(단계 추가)을 선택합니다.

  5. Add step(단계 추가) 대화 상자에서 Step type(단계 유형) 및 Name(이름)의 기본값을 유지합니다.

  6. JAR location(JAR 위치)에 다음을 입력합니다.

    command-runner.jar
  7. Arguments(인수)에 다음을 입력합니다.

    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를 PostgreSQL 데이터베이스 이름으로 변경
    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)

관련 정보

Hive용 외부 메타스토어 구성

PostgreSQL 데이터베이스 엔진을 실행하는 DB 인스턴스에 연결

AWS 공식업데이트됨 2년 전