Presto on EMR AMI4.x


# EMRサンドボックス
[Amazon EMR Sandbox Applications](http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-sandbox.html)

いままではPrestoをEMR上にインストールする場合は、
[カスタムブートストラップ](https://github.com/awslabs/emr-bootstrap-actions/tree/master/presto/latest)を利用して、Java8をインストールしたり
Prestoのセットアップを行っていました

4.0からEMRサンドボックスが利用できるようになり
カスタムブートストラップを利用しなくてもセットアップできるようになり
さらに簡単にPrestoが触れます

> 現在3.x系[awslabs/emr-bootstrap-actions](https://github.com/awslabs/emr-bootstrap-actions/tree/master/presto/latest)はそのまま利用しても動作しなそうです
> インストールされるjava8のバージョン起因でエラーが発生すると思います

# Setup

起動方法は2通りAwsConsole or AWSCLIのどちらかです
Consoleは直感的ですごくよくわかるのでCLIの方だけ

## CLIによるクラスタ起動

[AWS CLI Command Reference](http://docs.aws.amazon.com/cli/latest/reference/emr/create-cluster.html)

``` bash:start-emr-cluster
EMR_SETUPDIR=/path/to/config # 各設定が記載されたjsonファイル

# 旧クラスタ起動コマンド(例)
aws emr create-cluster \
    --release-label emr-4.2.0 \
    --name emr-presto-cluster \
    --instance-groups file://${EMR_SETUPDIR}/instance-setup.json \
    --use-default-roles \
    --no-auto-terminate \
    --visible-to-all-users \
    --applications      file://${EMR_SETUPDIR}/applications-setup.json \
    --ec2-attributes    file://${EMR_SETUPDIR}/ec2-attributes.json \
    --configurations    file://${EMR_SETUPDIR}/app-config.json
```

#### 各種設定ファイル例

``` json:instance-setup.json
[
    {
        "Name" : "emr-master",
        "InstanceGroupType" : "MASTER",
        "InstanceCount" : 1,
        "InstanceType"  : "m2.xlarge",
        "BidPrice"      : "0.1"
    },
    {
        "Name" : "emr-core",
        "InstanceGroupType" : "CORE",
        "InstanceCount" : 2,
        "InstanceType"  : "m2.4xlarge",
        "BidPrice"      : "0.1"
    }
]
```

``` json:instance-setup.json
[
    {
        "Name": "Hadoop"
    },
    {
        "Name": "Hive"
    },
    {
        "Name": "Presto-Sandbox"
    }
]
```

``` json:ec2-attributes.json
{
    "SubnetId" : "subnet-xxxxxxxxx",
    "KeyName"  : "ssh-keyname"
}
```

``` json:app-config.json
[
  {
    "Classification": "hive-site",
    "Properties": {
        "javax.jdo.option.ConnectionUserName": "username",
        "javax.jdo.option.ConnectionPassword": "password",
        "javax.jdo.option.ConnectionURL"     : "jdbc:mysql://external-metastore/hive_metastore",
    }
  }
]
```

4.0以前のコマンドと大きな変更が以下の通り

### AMIの選択方法の変更
* 旧: --ami-version x.x.x
* 新: --release-label emr-x.x.x
4.0以上のAMIの指定はversionじゃなくてrelease-labelで指定します

### ApplicationsによるPrestoの選択
_instance-setup.json_ のこの一文でインストールされます

```
 "Name": "Presto-Sandbox"
```
インストールされるバージョンは選択したAMIバージョンによって変わります


### configurationsの追加
[Configuring Applications](http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-configure-apps.html)

hiveのメタストアを外部で指定していた人は、
hive-site.xmlをブートストラップかStepでゴニョゴニョしてたと思いますが
configurationsで指定することで設定を書き換えてくれます

``` json:app-config.json
[
  {
    "Classification": "hive-site",
    "Properties": {
        "javax.jdo.option.ConnectionUserName": "user",
        "javax.jdo.option.ConnectionPassword": "password",
        "javax.jdo.option.ConnectionURL"     : "jdbc:mysql://metastore-mysql-host:3306/hive_metastore",
    }
  }
]
```

# AMI3.x と 4.x の違いその他

詳しくはココ -> [Differences Introduced in 4.x](http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-release-differences.html)

# まとめ

* Sandboxのおかげでhive,Pigを選択するようにPrestoも選択可能になったよ