EMRクラスターをクローンするとプロビジョニングに失敗した件

# はじめに

Amazon EMR(Elastic MapReduce)で問題が発生したので共有します。
2018年3月くらいのアップデートが原因の模様。
(https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-release-components.html では見つからず)

以下の様な条件で発生するはず

* RDSをhive metastoreとして利用している
* 起動に成功したクラスターをクローンして使う
* こんな設定jsonを書いている


```json
[
  {"classification":"hive-site",
   "properties":{
     "javax.jdo.option.ConnectionUserName":"hive",
     "javax.jdo.option.ConnectionPassword":"password",
     "javax.jdo.option.ConnectionURL":"jdbc:mysql://hoge.rds.amazonaws.com:3306/fuga_db"
    }
  }
]
```


## 問題が発生するケース

弊社では、 「hiveを利用し重いバッチ処理などを行う」というのがEMRよくある使い方です。
バッチが失敗した際に、処理に失敗したEMRクラスターをクローンして再実行したり、調査のためにsshしたりします。
しかし、2018年3月くらいからクローンしたEMRでプロビジョニングが失敗するようになりました。

```
終了（エラー発生）On the master instance (i-xxxxxxxxxxxx), application provisioning failed
```

## 原因

エラーログを調べていくとこんな文言が見つかりました。

```
Underlying cause: java.sql.SQLInvalidAuthorizationSpecException : Could not connect: Access denied for user 'hive'@'10.1.34.46' (using password: YES)↲
SQL Error code: 1045↲
org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version.↲
  at org.apache.hive.beeline.HiveSchemaHelper.getConnectionToMetastore(HiveSchemaHelper.java:77)↲
  at org.apache.hive.beeline.HiveSchemaTool.getConnectionToMetastore(HiveSchemaTool.java:144)↲
  at org.apache.hive.beeline.HiveSchemaTool.testConnectionToMetastore(HiveSchemaTool.java:473)↲
  at org.apache.hive.beeline.HiveSchemaTool.doInit(HiveSchemaTool.java:577)↲
  at org.apache.hive.beeline.HiveSchemaTool.doInit(HiveSchemaTool.java:563)↲
  at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1145)↲
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)↲
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)↲
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)↲
  at java.lang.reflect.Method.invoke(Method.java:498)↲
  at org.apache.hadoop.util.RunJar.run(RunJar.java:221)↲
  at org.apache.hadoop.util.RunJar.main(RunJar.java:136)↲
Caused by: java.sql.SQLInvalidAuthorizationSpecException: Could not connect: Access denied for user 'hive'@'10.1.34.46' (using password: YES)↲
  at org.mariadb.jdbc.internal.util.ExceptionMapper.get(ExceptionMapper.java:121)↲
  at org.mariadb.jdbc.internal.util.ExceptionMapper.throwException(ExceptionMapper.java:69)↲
  at org.mariadb.jdbc.Driver.connect(Driver.java:110)↲
  at java.sql.DriverManager.getConnection(DriverManager.java:664)↲
  at java.sql.DriverManager.getConnection(DriverManager.java:247)↲
  at org.apache.hive.beeline.HiveSchemaHelper.getConnectionToMetastore(HiveSchemaHelper.java:73)↲
  ... 11 more↲
Caused by: org.mariadb.jdbc.internal.util.dao.QueryException: Could not connect: Access denied for user 'hive'@'10.1.34.46' (using password: YES)↲
  at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.authentication(AbstractConnectProtocol.java:464)↲
  at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.handleConnectionPhases(AbstractConnectProtocol.java:428)↲
  at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:351)↲
  at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:664)↲
  at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:587)↲
  at org.mariadb.jdbc.Driver.connect(Driver.java:105)↲
  ... 14 more↲
```

rdsに接続できないらしい。パスワード周りが怪しいっぽい。

クローンしてコピーされるjsonを確認するとこんな感じに

```json
[
  {"classification":"hive-site",
   "properties":{
     "javax.jdo.option.ConnectionUserName":"hive",
     "javax.jdo.option.ConnectionPassword":"********",
     "javax.jdo.option.ConnectionURL":"jdbc:mysql://hoge.rds.amazonaws.com:3306/fuga_db"
    }
  }
]
```

こんな感じでパスワードが伏字になっているようです。
そのため、パスワードは"********"じゃないよーって怒られているようです。
jsonのパスワードをちゃんと指定してあげるとうまく動くようになりました。