Amazon EMR の Hive と Amazon RDS for MySQL のメタストアの間に SSL 接続をセットアップする方法を教えてください。
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_user と hive_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"]
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 インスタンスがあることを前提としています。
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&useSSL=true&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 を再起動します。
関連情報
関連するコンテンツ
- 承認された回答質問済み 10ヶ月前lg...
- 質問済み 7年前lg...
- 質問済み 5年前lg...
- AWS公式更新しました 2ヶ月前