PostgreSQL 데이터베이스를 Amazon EMR에서 Hive용 외부 메타스토어로 사용하려면 어떻게 해야 합니까?
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 인스턴스 구성
다음 단계를 완료하십시오.
-
Amazon RDS for PostgreSQL DB 인스턴스와 데이터베이스를 생성합니다.
참고: Amazon Aurora 및 RDS 콘솔에서 DB 인스턴스를 생성하는 동안 데이터베이스를 생성할 수 있습니다. Additional configuration(추가 구성)의 Initial database name(초기 데이터베이스 이름) 필드에 데이터베이스 이름을 지정할 수 있습니다. 또는 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단계를 자동화하려면 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 콘솔을 사용하여 스크립트를 실행하려면 다음 작업을 수행하십시오.
-
Amazon EMR 콘솔을 엽니다.
-
Cluster List(클러스터 목록) 페이지에서 클러스터의 링크를 선택합니다.
-
Cluster Details(클러스터 세부 정보) 페이지에서 Steps(단계) 탭을 선택합니다.
-
Steps(단계) 탭에서 Add step(단계 추가)을 선택합니다.
-
Add step(단계 추가) 대화 상자에서 Step type(단계 유형) 및 Name(이름)의 기본값을 유지합니다.
-
JAR location(JAR 위치)에 다음을 입력합니다.
command-runner.jar -
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 위치를 스크립트를 저장한 위치로 바꿉니다.
-
Add(추가)를 선택하여 단계 작업을 실행합니다.
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_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 -
메시지가 표시되면 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)
관련 정보
- 언어
- 한국어

This article was reviewed and updated on 2024-07-08.