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

최종 업데이트 날짜: 2022년 1월 31일

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

해결 방법

시작하기 전에 다음 사항을 확인하십시오.

  • 이 해결 방법은 이미 활성 PostgreSQL 데이터베이스가 있다고 가정합니다.
  • Amazon EMR 릴리스 버전 5.7 이하를 사용하는 경우 PostgreSQL JDBC 드라이버를 다운로드합니다. 그런 다음, Hive 라이브러리 경로( /usr/lib/hive/lib)에 드라이버를 추가합니다. Amazon EMR 릴리스 버전 5.8.0 이상의 경우 Hive 라이브러리 경로에서 PostgreSQL JDBC 드라이버를 제공합니다.

Hive용 외부 메타스토어로 PostgreSQL DB 인스턴스를 구성하려면 다음을 수행합니다.

1.    Amazon RDS for PostgreSQL DB 인스턴스를 생성하고 데이터베이스를 생성합니다. AWS 콘솔에서 Amazon RDS로부터 DB 인스턴스를 생성하는 동안 이 작업을 수행할 수 있습니다. 추가 구성(Additional configuration) 아래 초기 데이터베이스 이름(Intial database name) 필드에 데이터베이스 이름을 지정할 수 있습니다. 또는 PostgreSQL 데이터베이스 인스턴스를 연결하고 데이터베이스를 생성할 수 있습니다.

2.    포트 5432에서 데이터베이스와 ElasticMapReduce-master 보안 그룹 간 연결을 허용하도록 DB 인스턴스 보안 그룹을 수정합니다. 자세한 내용은 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 인스턴스 암호로 대체

스크립트를 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 위치(JAR location)에 다음을 입력합니다.

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를 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용 외부 메타스토어로 사용합니다.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요하세요?