Amazon EMR の Hive と Amazon RDS for MySQL のメタストアの間に SSL 接続をセットアップする方法を教えてください。

所要時間5分
0

Apache Hiveと、Amazon Relational Database Service (Amazon RDS) MySQL DB インスタンスにあるメタストア間の SSL 接続を設定したいと思います。どうすればそれができますか?

簡単な説明

Hive と外部メタストア間の暗号化された接続を設定するには、SSL 証明書を使用します。この接続は、新しい Amazon EMR クラスターを起動するとき、またはクラスターを実行した後でセットアップします。

解決方法

注意: 次の手順は、Amazon EMR リリースバージョン 5.36.0 および Amazon RDS for MySQL バージョン 8.0.28 でテストされています。

新しい Amazon EMR クラスターで SSL 接続を設定する

1.    Amazon RDS for MySQL DB インスタンスを作成するには、次のようなコマンドを実行します。$RDS_LEADER_USER_NAME$RDS_LEADER_PASSWORD**、$RDS_VPC_SG**、および $DB_SUBNET_GROUP をそれぞれユーザー名、パスワード、セキュリティグループ、および DB サブネットグループに置き換えます。

詳細については、create-db-instance を参照してください。

注意: AWS コマンドラインインターフェイス(AWS CLI)のコマンド実行時にエラーが発生した場合は、最新バージョンの CLI を使用していることを確認してください

aws rds create-db-instance --db-name hive --db-instance-identifier mysql-hive-meta --db-instance-class db.t2.micro --engine mysql --engine-version 8.0.28 --db-subnet-group-name $DB_SUBNET_GROUP --master-username $RDS_LEADER_USER_NAME --master-user-password $RDS_LEADER_PASSWORD --allocated-storage 20 --storage-type gp2 --vpc-security-group-ids $RDS_VPC_SG --publicly-accessible

2.    プライマリユーザーとして Amazon RDS for MySQL DB インスタンスに接続します。その後、以下の例に示すように、Hive メタストアのユーザーを作成します。

重要: このユーザーのアクセスは、ステップ 1 で作成した DB インスタンスに制限してください。

mysql -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u $RDS_LEADER_USER_NAME -p
Enter password: $RDS_LEADER_PASSWORD

CREATE USER 'hive_user'@'%' IDENTIFIED BY 'hive_user_password' REQUIRE SSL;
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hive_user'@'%';
GRANT ALL PRIVILEGES ON hive.* TO 'hive_user'@'%';
FLUSH PRIVILEGES;

3.    次のような JSON 設定ファイルを作成します。hive_userhive_user_password を、ステップ 2 の JSON スクリプトで使用した値に置き換えます。JDBC URL のエンドポイントを RDS DB インスタンスのエンドポイントに置き換えます。

次のステップでは、このファイルを使用して Amazon EMR クラスターを起動します。このファイルにより、Hive が RDS DB インスタンスに SSL 接続できるようになります。詳細については、「MySQL DB インスタンスでの新しい SSL/TLS 証明書の使用」を参照してください。

[
    {
        "Classification": "hive-site",
        "Properties": {
            "javax.jdo.option.ConnectionURL": "jdbc:mysql:\/\/mysql-hive-meta.########.us-east-1.rds.amazonaws.com:3306\/hive?createDatabaseIfNotExist=true&useSSL=true&serverSslCert=\/home\/hadoop\/global-bundle.pem,
            "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver",
            "javax.jdo.option.ConnectionUserName": "hive_user",
            "javax.jdo.option.ConnectionPassword": "hive_user_password"
        }
    }
]

4.    Amazon RDS for MySQL インスタンスに関連付けられているセキュリティグループで、次のパラメータを使用してインバウンドルールを作成します。
[Type] (タイプ) で、[MYSQL/Aurora (3306)] を選択します。
[プロトコル] では、デフォルトで [TCP (6)] が選択されます。
[ポート範囲] では、デフォルトで [3306] が選択されます。
[Source] (ソース) で、リーダーノードに関連付けられている Amazon EMR マネージドセキュリティグループのグループ ID を入力します。

このルールにより、Amazon EMR クラスターのリーダーノードによる Amazon RDS インスタンスへのアクセスが許可されます。詳細については、「VPC セキュリティグループの概要」を参照してください。

5.    create-cluster コマンドを実行して、ステップ 3 の JSON ファイルとブートストラップアクションを使用して Amazon EMR クラスターを起動します。ブートストラップアクションは、リーダーノードの /home/hadoop/ に SSL 証明書をダウンロードします。

以下はその例です。

aws emr create-cluster --applications Name=Hadoop Name=Hive --tags Name="EMR Hive Metastore SSL" --ec2-attributes KeyName=$EC2_KEY_PAIR,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=$EMR_SUBNET,EmrManagedSlaveSecurityGroup=$EMR_CORE_AND_TASK_VPC_SG,EmrManagedMasterSecurityGroup=$EMR_MASTER_VPC_SG --service-role EMR_DefaultRole --release-label emr-5.36.0 --log-uri $LOG_URI --name "Hive External Metastore RDS MySQL w/ SSL" --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m4.xlarge,Name="Master- 1" --configurations file:///<Full-Path-To>/hive-ext-meta-mysql-ssl.json --bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/run-if,Args=["instance.isMaster=true","cd /home/hadoop && wget -S -T 10 -t 5 https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem"]

6.    SSH を使用してリーダーノードに接続します

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.    リーダーノードの mysql クライアントを使用して、Amazon RDS for MySQL メタストアに接続します。その後、メタストア内のテーブルのメタデータを確認します。前の手順で作成したテーブルに対応するメタデータが存在する場合、SSL 接続は機能しています。

以下はその例です。

mysql -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u $RDS_LEADER_USER_NAME -p
Enter password: $RDS_LEADER_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)

実行中の Amazon EMR クラスターで SSL 接続を設定する

注意: 次の手順は、Amazon RDS for MySQL DB インスタンスがあることを前提としています。

1.    SSH を使用してリーダーノードに接続します

2.    次のコマンドを実行して、SSL 証明書をリーダーノードの /home/hadoop/ にダウンロードします。

cd /home/hadoop && wget -S -T 10 -t 5 https://s3.amazonaws.com/rds-downloads/global-bundle.pem

3.    /etc/hive/conf.dist ディレクトリで、hive-site.xml ファイルの次の行を追加または編集します。

<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://mysql-hive-meta.########.us-east-1.rds.amazonaws.com:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=true&amp;serverSslCert=/home/hadoop/global-bundle.pem</value>
  <description>JDBC URL for the metastore database</description>
</property>

<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive_user</value>
    <description>User name for the metastore database</description>
</property>

<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>HIVE_USER_PASSWORD</value>
    <description>Password for metastore database</description>
</property>

この構文により、RDS DB インスタンスへの SSL 接続が可能になります。JDBC URL のエンドポイントを RDS DB インスタンスのエンドポイントに置き換えてください。

重要: アンパサンド (&) は XML の特殊文字です。JDBC 文字列など、hive-site.xml でアンパサンドを使用するには、「&」の代わりに「&」を使用する必要があります。 そうしないと、hive-hcatalog-server を再起動するときにエラーが発生します。

4.    次のようなコマンドを実行して SSL 接続をテストします。

mysql -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u hive_user -p --ssl-ca /home/hadoop/rds-combined-ca-bundle.pem

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.    リーダーノードの mysql クライアントを使用して、Amazon RDS for MySQL メタストアに接続します。その後、メタストア内のテーブルのメタデータを確認します。メタデータが、前のステップで作成したテーブルに対応している場合、SSL 接続は機能しています。

以下はその例です。

$ mysql -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u $RDS_LEADER_USER_NAME -p
Enter password: $RDS_LEADER_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)

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 インスタンスからリーダーノードをフラッシュするには、次のコマンドを実行します。

mysqladmin -h mysql-hive-meta.########.us-east-1.rds.amazonaws.com -P 3306 -u $RDS_LEADER_USER_NAME -p flush-hosts
Enter password: $RDS_LEADER_PASSWORD

次に、hive-hcatalog-server を再起動します。


関連情報

外部 MySQL データベースまたは Amazon Aurora の使用

AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ