Amazon EMR의 Hive와 Amazon RDS for MySQL의 메타스토어 간에 SSL 연결을 설정하려면 어떻게 해야 합니까?
Amazon EMR의 Hive와 Amazon Relational Database Service(Amazon RDS) for MySQL의 메타스토어 간에 SSL 연결을 설정하려고 합니다.
간략한 설명
Hive와 외부 메타스토어 간에 암호화된 연결을 설정하려면 SSL 인증서를 사용합니다. 새 Amazon EMR 클러스터를 시작할 때 또는 클러스터가 실행 중인 후에 SSL 연결을 설정할 수 있습니다.
참고: 다음 단계는 Amazon EMR 버전 7.3.0과 Amazon RDS for MySQL 버전 8.0.39에서 테스트되었습니다.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
새 Amazon EMR 클러스터에 SSL 연결 설정
다음 단계를 완료합니다.
-
Amazon RDS for MySQL DB 인스턴스를 생성하려면 다음 create-db-instance 명령을 실행합니다.
aws rds create-db-instance \ --db-name hive \ --db-instance-identifier example-db-instance-identifier \ --db-instance-class db.c6gd.large \ --engine mysql --engine-version 8.0.39 \ --db-subnet-group-name example-subnet-group \ --master-username example-rds-primary-user \ --master-user-password example-rds-primary-password \ --allocated-storage 200 \ --storage-type gp3 \ --vpc-security-group-ids example-rds-vpc-security-group참고: example-db-instance-identifier를 DB 인스턴스 식별자로, example-subnet-group을 서브넷 그룹 이름으로, example-rds-primary-user를 Amazon RDS 기본 사용자 이름으로, example-rds-primary-password를 Amazon RDS 기본 암호로 바꾸십시오. 또한 example-rds-vpc-security-group을 Amazon RDS Amazon Virtual Private Cloud(Amazon VPC) 보안 그룹 이름으로 바꾸십시오.
-
기본 사용자로 Amazon RDS for MySQL DB 인스턴스에 연결합니다. 이후 Hive 메타스토어의 사용자를 생성합니다.
참고: 이전에 생성한 DB 인스턴스에 대한 기본 사용자의 액세스를 제한해야 합니다.mysql -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-user -p Enter password: example-rds-primary-passwordCREATE USER 'example-hive-username' IDENTIFIED BY 'example-hive-password' REQUIRE SSL; REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'example-hive-username'; GRANT ALL PRIVILEGES ON hive.* TO 'example-hive-username'; FLUSH PRIVILEGES;참고: example-rds-db-instance-endpoint를 Amazon RDS DB 인스턴스 엔드포인트로, example-rds-primary-user를 Amazon RDS 기본 사용자 이름으로, example-rds-primary-password를 Amazon RDS 기본 암호로 바꾸십시오. 또한 example-hive-username를 Hive 사용자 이름으로, example-hive-password를 example-hive-username의 암호로 바꾸십시오.
-
다음과 비슷한 JSON 구성 파일을 생성합니다.
참고: 다음 단계에서 다음 JSON 파일을 사용하여 Amazon EMR 클러스터를 시작합니다. 이 파일을 통해 Hive는 Amazon RDS DB 인스턴스에 대한 SSL 연결을 설정할 수 있습니다.
[ { "Classification": "hive-site", "Properties": { "javax.jdo.option.ConnectionURL": "jdbc:mysql://example-rds-db-instance-endpoint:3306/hive?createDatabaseIfNotExist=true&useSSL=true&serverSslCert=/home/hadoop/global-bundle.pem", "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver", "javax.jdo.option.ConnectionUserName": "example-hive-username", "javax.jdo.option.ConnectionPassword": "example-hive-password" } } ]참고: example-rds-db-instance-endpoint를 Amazon RDS DB 인스턴스 엔드포인트로, example-hive-username을 Hive에서 Amazon RDS DB 인스턴스 연결에 사용할 사용자 이름으로, example-hive-password를 example-hive-username의 암호로 바꾸십시오.
-
다음과 같이 Amazon RDS for MySQL 인스턴스와 연결된 보안 그룹에 인바운드 규칙을 생성합니다.
유형에서 **MySQL/Aurora(3306)**를 선택합니다.
프로토콜에서 **TCP(6)**이 기본적으로 선택됩니다.
포트 범위에서 3306이 기본적으로 선택됩니다.
소스에서 기본 노드와 연결된 Amazon EMR 관리형 보안 그룹의 그룹 ID를 입력합니다.
참고: 이 규칙을 통해 Amazon EMR 클러스터의 기본 노드에서 Amazon RDS 인스턴스에 액세스할 수 있습니다. 자세한 내용은 VPC 보안 그룹 개요를 참조하십시오. -
다음 부트스트랩 작업 스크립트 파일을 생성합니다. 이후 파일을 Amazon S3 버킷에 업로드합니다. 부트스트랩 작업은 SSL 인증서를 기본 노드의 **/home/hadoop/**에 다운로드합니다.
#!/bin/bash if grep isMaster /mnt/var/lib/info/instance.json | grep false; then echo "This is not primary node, do nothing, exiting" exit 0 fi echo "This is primary, continuing to execute script" cd /home/hadoop wget -S -T 10 -t 5 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -
Amazon EMR 클러스터를 시작하려면 이전 JSON 파일 및 부트스트랩 작업과 함께 다음 create-cluster 명령을 실행합니다.
예시:
aws emr create-cluster \ --name "EMR Hive Metastore SSL" \ --log-uri $LOG_URI \ --release-label "emr-7.3.0" \ --service-role $EMRServiceRole \ --ec2-attributes KeyName=$EC2_KEY_PAIR,InstanceProfile=$EMREC2Role,SubnetId=$EMR_SUBNET,EmrManagedSlaveSecurityGroup=$EMR_CORE_AND_TASK_VPC_SG,EmrManagedMasterSecurityGroup=$EMR_PRIMARY_VPC_SG \ --applications Name=Hadoop Name=Hive \ --bootstrap-actions Path=$BOOTSTRAP_ACTION_SCRIPT_PATH \ --configurations file:///<Full-Path-To>/hive-ext-meta-mysql-ssl.json \ --instance-groups '[{"InstanceCount":1,"InstanceGroupType":"CORE","Name":"Core","InstanceType":"m5.xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":32},"VolumesPerInstance":2}]}},{"InstanceCount":1,"InstanceGroupType":"MASTER","Name":"Primary","InstanceType":"m5.xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":32},"VolumesPerInstance":2}]}},{"InstanceCount":1,"InstanceGroupType":"TASK","Name":"Task - 1","InstanceType":"m5.xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":32},"VolumesPerInstance":2}]}}]' -
기본 노드에서 Hive 세션을 엽니다. 이후 테스트용 테이블을 생성합니다.
예시:
hive> create table tb_test (col1 STRING, col2 BIGINT); OK Time taken: 2.371 secondshive> describe tb_test; OK col1 string col2 bigint Time taken: 0.254 seconds, Fetched: 2 row(s) -
Amazon RDS for MySQL 메타스토어에 연결하려면 기본 노드에서 mysql 클라이언트를 사용하십시오. 이후 메타스토어에서 테이블 메타데이터를 확인합니다. 메타데이터가 이전 단계에서 생성한 테이블에 해당하는 경우 SSL 연결이 작동합니다.
예시:
mysql -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-user -pEnter password: example-rds-primary-password mysql> use hive; Database changed mysql> select t1.OWNER, t1.TBL_NAME, t1.TBL_TYPE, s1.INPUT_FORMAT, s1.OUTPUT_FORMAT, s1.LOCATION from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID where t1.TBL_NAME = 'tb_test'\G *************************** 1. row *************************** OWNER: hadoop TBL_NAME: tb_test TBL_TYPE: MANAGED_TABLE INPUT_FORMAT: org.apache.hadoop.mapred.TextInputFormat OUTPUT_FORMAT: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat LOCATION: hdfs://ip-xxx-xx-xx-xxx.ec2.internal:8020/user/hive/warehouse/tb_test 1 row in set (0.23 sec) mysql> select t1.OWNER, t1.TBL_NAME, c1.COLUMN_NAME, c1.TYPE_NAME from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID inner join COLUMNS_V2 c1 on c1.CD_ID = s1.CD_ID where t1.TBL_NAME = 'tb_test'; +--------+----------+-------------+-----------+ | OWNER | TBL_NAME | COLUMN_NAME | TYPE_NAME | +--------+----------+-------------+-----------+ | hadoop | tb_test | col1 | string | | hadoop | tb_test | col2 | bigint | +--------+----------+-------------+-----------+ 2 rows in set (0.22 sec)참고: example-rds-db-instance-endpoint를 Amazon RDS DB 인스턴스 엔드포인트로, example-rds-primary-user를 Amazon RDS 기본 사용자 이름으로, example-rds-primary-password를 Amazon RDS 기본 암호로 바꾸십시오.
실행 중인 Amazon EMR 클러스터에서 SSL 연결 설정
참고: 시작하기 전에 Amazon RDS for MySQL DB 인스턴스가 있는지 확인합니다.
-
SSL 인증서를 기본 노드의 **/home/hadoop/**에 다운로드합니다.
cd /home/hadoop && wget -S -T 10 -t 5 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -
/etc/hive/conf.dist 디렉터리에서 hive-site.xml 파일에 다음 줄을 추가하거나 편집합니다.
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://example-rds-db-instance-endpoint:3306/hive?createDatabaseIfNotExist=true&useSSL=true&serverSslCert=/home/hadoop/global-bundle.pem</value> <description>example-rds-db-instance-endpoint</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>example-hive-username</value> <description>example-metastore-db-user</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>example-hive-password</value> <description>example-metastore-db-password</description> </property>참고: example-rds-db-instance-endpoint를 Amazon RDS DB 인스턴스 엔드포인트로, example-hive-username을 Hive에서 Amazon RDS DB 인스턴스 연결에 사용할 사용자 이름으로, example-hive-password를 example-hive-username의 암호로 바꾸십시오. 또한 앰퍼샌드(&)는 XML의 특수 문자입니다. JDBC 문자열에서와 같이 hive-site.xml에서 앰퍼샌드를 사용하려면 & 대신 **&**를 사용하십시오. **&**를 사용하지 않으면 hive-hcatalog-server를 다시 시작할 때 오류가 발생합니다.
-
SSL 연결 테스트:
mysql -h example-rds-db-instance-endpoint -P 3306 -u example-hive-username -p --ssl-ca /home/hadoop/global-bundle.pem Enter password: example-hive-password참고: example-rds-db-instance-endpoint를 Amazon RDS DB 인스턴스 엔드포인트로, example-hive-username을 Hive에서 Amazon RDS DB 인스턴스 연결에 사용할 사용자 이름으로, example-hive-password를 example-hive-username의 암호로 바꾸십시오.
-
기본 노드에서 hive-hcatalog-server를 다시 시작합니다.
-
서비스가 성공적으로 다시 시작되었는지 확인합니다.
sudo systemctl status hive-hcatalog-server.service -
기본 노드에서 Hive 세션을 엽니다. 이후 테스트용 테이블을 생성합니다.
예시:
hive> create table tb_test (col1 STRING, col2 BIGINT);OK Time taken: 2.371 seconds hive> describe tb_test; OK col1 string col2 bigint Time taken: 0.254 seconds, Fetched: 2 row(s) -
Amazon RDS for MySQL 메타스토어에 연결하려면 기본 노드에서 mysql 클라이언트를 사용하십시오. 이후 메타스토어에서 테이블 메타데이터를 확인합니다. 메타데이터가 이전 단계에서 생성한 테이블에 해당하는 경우 SSL 연결이 작동합니다.
예시:
$ mysql -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-user -p Enter password: example-rds-primary-password mysql> use hive; Database changed mysql> select t1.OWNER, t1.TBL_NAME, t1.TBL_TYPE, s1.INPUT_FORMAT, s1.OUTPUT_FORMAT, s1.LOCATION from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID where t1.TBL_NAME = 'tb_test'\G *************************** 1. row *************************** OWNER: hadoop TBL_NAME: tb_test TBL_TYPE: MANAGED_TABLE INPUT_FORMAT: org.apache.hadoop.mapred.TextInputFormat OUTPUT_FORMAT: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat LOCATION: hdfs://ip-xxx-xx-xx-xxx.ec2.internal:8020/user/hive/warehouse/tb_test 1 row in set (0.23 sec) mysql> select t1.OWNER, t1.TBL_NAME, c1.COLUMN_NAME, c1.TYPE_NAME from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID inner join COLUMNS_V2 c1 on c1.CD_ID = s1.CD_ID where t1.TBL_NAME = 'tb_test'; +--------+----------+-------------+-----------+ | OWNER | TBL_NAME | COLUMN_NAME | TYPE_NAME | +--------+----------+-------------+-----------+ | hadoop | tb_test | col1 | string | | hadoop | tb_test | col2 | bigint | +--------+----------+-------------+-----------+ 2 rows in set (0.22 sec)참고: example-rds-db-instance-endpoint를 Amazon RDS DB 인스턴스 엔드포인트로, example-rds-primary-user를 Amazon RDS 기본 사용자 이름으로, example-rds-primary-password를 Amazon RDS 기본 암호로 바꾸십시오.
hive-hcatalog-server 재시작 오류 해결
hive-hcatalog-server를 다시 시작하려고 할 때 다음 오류 또는 이와 비슷한 오류가 발생할 수 있습니다.
"2020-08-20T14:18:50,750 WARN [main] org.apache.hadoop.hive.metastore.HiveMetaStore - Retrying creating default database after error: Unable to open a test connection to the given database. JDBC url = jdbc:mysql://mysql-hive-meta.########.us-east-1.rds.amazonaws.com:3306/hive?createDatabaseIfNotExist=true&useSSL=true&serverSSlCert=/home/hadoop/global-bundle.pem, username = masteruser. Terminating connection pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------java.sql.SQLException: Host '172.31.41.187' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"
이 오류는 Amazon RDS for MySQL DB 인스턴스가 보안 예방 조치로 Amazon EMR 클러스터의 기본 노드를 차단할 때 발생합니다. 이 오류를 해결하려면 다음 단계를 완료하십시오.
- mysqladmin 도구가 설치된 다른 로컬 머신 또는 Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스에 연결합니다.
- DB 인스턴스에서 기본 노드를 플러시합니다.
참고: example-rds-primary-username을 Amazon RDS 기본 사용자 이름으로, example-rds-primary-password를 Amazon RDS 기본 암호로 바꾸십시오.mysqladmin -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-username -p flush-hosts Enter password: example-rds-primary-password - hive-hcatalog-server를 다시 시작합니다.
관련 정보
관련 콘텐츠
- 질문됨 일 년 전
- 질문됨 일 년 전

