내용으로 건너뛰기

Amazon EMR의 Hive와 Amazon RDS for MySQL의 메타스토어 간에 SSL 연결을 설정하려면 어떻게 해야 합니까?

7분 분량
0

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 연결 설정

다음 단계를 완료합니다.

  1. 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) 보안 그룹 이름으로 바꾸십시오.

  2. 기본 사용자로 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-password
    CREATE 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-passwordexample-hive-username의 암호로 바꾸십시오.

  3. 다음과 비슷한 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-passwordexample-hive-username의 암호로 바꾸십시오.

  4. 다음과 같이 Amazon RDS for MySQL 인스턴스와 연결된 보안 그룹에 인바운드 규칙을 생성합니다.
    유형에서 **MySQL/Aurora(3306)**를 선택합니다.
    프로토콜에서 **TCP(6)**이 기본적으로 선택됩니다.
    포트 범위에서 3306이 기본적으로 선택됩니다.
    소스에서 기본 노드와 연결된 Amazon EMR 관리형 보안 그룹의 그룹 ID를 입력합니다.
    참고: 이 규칙을 통해 Amazon EMR 클러스터의 기본 노드에서 Amazon RDS 인스턴스에 액세스할 수 있습니다. 자세한 내용은 VPC 보안 그룹 개요를 참조하십시오.

  5. 다음 부트스트랩 작업 스크립트 파일을 생성합니다. 이후 파일을 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
  6. 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}]}}]'
  7. SSH를 사용하여 기본 노드에 연결합니다.

  8. 기본 노드에서 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)
  9. 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 인스턴스가 있는지 확인합니다.

  1. 기본 노드에 연결하려면 SSH를 사용합니다.

  2. SSL 인증서를 기본 노드의 **/home/hadoop/**에 다운로드합니다.

    cd /home/hadoop && wget -S -T 10 -t 5 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
  3. /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&amp;useSSL=true&amp;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-passwordexample-hive-username의 암호로 바꾸십시오. 또한 앰퍼샌드(&)는 XML의 특수 문자입니다. JDBC 문자열에서와 같이 hive-site.xml에서 앰퍼샌드를 사용하려면 & 대신 **&**를 사용하십시오. **&**를 사용하지 않으면 hive-hcatalog-server를 다시 시작할 때 오류가 발생합니다.

  4. 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-passwordexample-hive-username의 암호로 바꾸십시오.

  5. 기본 노드에서 hive-hcatalog-server다시 시작합니다.

  6. 서비스가 성공적으로 다시 시작되었는지 확인합니다.

    sudo systemctl status hive-hcatalog-server.service
  7. 기본 노드에서 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)
  8. 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 클러스터의 기본 노드를 차단할 때 발생합니다. 이 오류를 해결하려면 다음 단계를 완료하십시오.

  1. mysqladmin 도구가 설치된 다른 로컬 머신 또는 Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스에 연결합니다.
  2. DB 인스턴스에서 기본 노드를 플러시합니다.
    mysqladmin -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-username -p flush-hosts
    Enter password: example-rds-primary-password
    참고: example-rds-primary-username을 Amazon RDS 기본 사용자 이름으로, example-rds-primary-password를 Amazon RDS 기본 암호로 바꾸십시오.
  3. hive-hcatalog-server를 다시 시작합니다.

관련 정보

외부 MySQL 데이터베이스 또는 Amazon Aurora 사용

AWS 공식업데이트됨 10달 전