Amazon EMR Studioを試してみた

# 背景・目的
Amazon EMR Studioについて、触ったことが無かったので試してみようと思います。
また、あわせて機能等、基礎的な部分についても整理したいと思います。

# まとめ
- EMR Studioは、WebベースのIDE。
- 認証には、IAM認証と、IAM Identity Centerが利用できる。
- ワークスペースコラボレーションを有効にすると、ワークスペース内の他のユーザーと同時にコラボレーションが可能

# 概要
## Amazon EMR Studio
- EMR クラスターで実行される、フルマネージド型の Jupyter ノートブック用のウェブベースの統合開発環境 (IDE) とのこと。
- チームが R、Python、Scala、PySparkで記述されたアプリケーションの開発、視覚化、およびデバッグを行うために EMR Studio をセットアップする。
- EMR Studio は、IAM および IAM ID Center と統合されているため、ユーザーは企業の認証情報を使用してログインできる。
- EMR Studio 自体は無料。EMR Studio を使用する場合は、S3 ストレージと EMR クラスターに料金がかかる。

### EMR Studio の主な機能
- IAMまたは IAM アイデンティティセンター、エンタープライズ ID プロバイダーを使用してユーザーを認証する。
- EMR クラスターにオンデマンドでアクセスして起動し、Jupyter ノートブックジョブを実行
- EMR on EKS クラスターに接続して、ジョブ実行としてWorkerを送信する
- [サンプルノートブック](https://github.com/aws-samples/emr-studio-notebook-examples)を探索して保存する。
- Python、Spark Scala PySpark、Spark R、または SparkSQL を使用してデータを分析し、カスタムカーネルとライブラリをインストールする。
- [同じWorkspace の他のユーザーとリアルタイムでコラボレーションする。](https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-studio-workspace-collaboration.html)
- *ノートブック内のデータを操作する前に、EMR Studio SQL Explorer を使用してデータカタログをブラウズし、SQL クエリを実行し、結果をダウンロードする。（？？）*
- Apache Airflow や Amazon Managed Workflows for Apache Airflow(MWAA) などのオーケストレーションツールを使用して、スケジュールされたワークフローの一部としてパラメータ化されたノートブックを実行する。（[参考](https://aws.amazon.com/blogs/big-data/orchestrating-analytics-jobs-on-amazon-emr-notebooks-using-amazon-mwaa/)）
- GitHub BitBucketやなどのコードリポジトリをリンクする。
- Spark History Server、Tez UI、または YARN タイムラインサーバーを使用してジョブを追跡およびデバッグする。
- EMR Studio も HIPAA 対応であり、HITRUST CSF および SOC 2の下で認定されているとのこと。
    - 詳細は下記を参照。
        - [HIPAA](https://aws.amazon.com/compliance/hipaa-compliance/)
        - [HITRUST CSF](https://aws.amazon.com/compliance/hitrust/)
        - [AWS Services in Scope by Compliance Program](https://aws.amazon.com/compliance/services-in-scope/)

## Amazon EMR Studio の仕組み
作成する各 EMR Studio では、下記の AWS リソースが使用される。
- サブネットとVPC
    - ユーザーは、指定された VPC 内の EMR および EMR on EKS クラスターで Studio カーネルとアプリケーションを実行する。
    - EMR Studio は、Studio の作成時に指定したサブネット内の任意のクラスターに接続できる。
- IAM ロールとアクセス許可ポリシー
    - ユーザーアクセス許可を管理するには、ユーザーの IAM ID またはユーザーロールにアタッチする IAM アクセス許可ポリシーを作成する。
    - EMR Studio は IAM サービスロールとセキュリティグループを使用して、他の AWS のサービスとの相互運用も行う。詳細は下記を参照。
        - [アクセスコントロール](https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/how-emr-studio-works.html#emr-studio-access-control)
        - [EMR Studio ネットワークトラフィックを制御するセキュリティグループを定義する
](https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-studio-security-groups.html)
- セキュリティグループ
    - EMR Studio は、セキュリティグループを使用して Studio と EMR クラスターの間に安全なネットワークチャネルを確立する

### 認証とユーザーログイン
下記のIAM 認証モードと IAM ID センター認証モードという 2 つの認証モードをサポートしている。
- IAM 認証モード
    - IAM 認証モードでは、IAM 認証または IAM フェデレーションを使用
- IAM Identity Center 認証モード
    - ユーザーに EMR Studio へのフェデレーションアクセス権を付与できる
    - EMR Studio では、IAM アイデンティティセンター用の次の ID プロバイダーの使用をサポートしている。
        - AWS Managed Microsoft AD およびセルフマネージド Active Directory
        - SAML ベースのプロバイダー
        - IAM ID センターディレクトリ

### アクセスコントロール
EMR Studio では、IAM ベースのポリシーを使用してユーザー認可 (アクセス許可) を設定する。これらのポリシーでは、許可するアクションとリソース、およびアクションを許可する条件を指定する。
- IAM 認証モードのユーザーアクセス許可
    - EMR Studio で IAM 認証を使用するときにユーザーアクセス許可を設定するには、IAM アクセス許可ポリシーで `elasticmapreduce:RunJobFlow` のようなアクションを許可する
- IAM Identity Center 認証モードのユーザーアクセス許可
    - IAM アイデンティティセンター認証を使用する場合、単一の EMR Studio ユーザーロールを作成する。ユーザーロールは、ユーザーがログインしたときに Studio が担う専用の IAM ロールである。

### ワークスペース
- Workspace は EMR Studio の主要な構成要素。ノートブックを整理するには、ユーザーは Studio に 1 つ以上の Workspace を作成する。
- Workspace はノートブックの作業の状態を保持する。
- Workspace ユーザーインターフェイスは、EMR クラスターの作成とアタッチ、ジョブの実行、サンプルノートブックの探索、Git JupyterLabリポジトリへのリンクを可能にする追加ツールでオープンソースインターフェイスを拡張しているとのこと。
- EMR Studio Workspace の主な機能は下記の通り。
    - Workspace の可視性は Studio ベースです。ある Studio で作成した Workspace は、他の Studio では表示されない。
    - デフォルトでは、ワークスペースは共有され、すべてのStudioユーザーに表示される。ただし、Workspace を開いて作業できるのは一度に 1 人のユーザーのみ。
    - ワークスペースコラボレーションを有効にすると、ワークスペース内の他のユーザーと同時にコラボレーションができる。
    - Workspace 内のノートブックは、コマンドを実行するために同じ EMR クラスターを共有する。Workspace は、Amazon EC2 で実行されている Amazon EMR クラスター、または Amazon EMR on EKS 仮想クラスターおよびマネージドエンドポイントにアタッチが可能

### Amazon EMR Studio でのノートブックストレージ
- Workspace を使用している場合、EMR Studio は、Studio に関連付けられた Amazon S3 の場所にあるノートブックファイルにセルを定期的に自動保存される。

## 考慮事項と制約事項
:::note info
全ては記載していません。詳細は[こちら](https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-studio-considerations.html)をご確認ください。
:::
- EMR Studioは、Amazon EMR バージョン 5.32.0 (EMR 5.x シリーズ) または 6.2.0 (EMR 6.x シリーズ) 以降で動作
- Amazon S3 に保存されているノートブックファイルへのアクセス許可を定義する場合、または AWS Secrets Manager からシークレットを読み取る場合、EMR サービスロールを使用する。

### 機能の制限
- EMR Studio では、下記のEMR 機能はサポートされていない。
    - Kerberos 認証を指定するセキュリティ構成を使用した EMR クラスターでのジョブのアタッチと実行
    - 複数のマスターノードを持つクラスター
    - Lake Formation と統合されたクラスター

# 実践
[こちら](https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-studio-set-up.html)を元に試してみます。
## 事前準備
### S3バケットを作成
1. WorkspaceやEMRで使用するため、S3バケットを用意します。

### ネットワークの作成
#### VPCの作成
1. WorkspaceやEMRで使用するため、VPCを作成します。

#### S3のVPCエンドポイントを作成
1. VPCに作成するEMRクラスタやノートブックから、S3にアクセスするためVPCエンドポイントを作成します。

#### SSMの設定
EMRのEC2インスタンスにSSMでアクセスするため、設定する。

##### SSMのVPC エンドポイントを作成
1. エンドポイント作成画面で、下記を入力し、「エンドポイントを作成」をクリックします。
    - 名前タグ：任意の名前
    - サービスカテゴリ：AWSのサービス
    - サービス：com.amazonaws.{リージョン}.ssm
    - VPC:作成したVPCを指定
    - サブネット：作成したサブネットを指定
    - セキュリティグループ：後ほど変更するのでとりあえず、defaultをアタッチ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c05a7d56-e1ac-6e4c-b553-6fd4a232b08b.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ffbd094c-ab58-7c9f-ba35-fba42bb0c985.png)

##### ssmmessages、EC2MessagesEndpointのVPCエンドポイントを作成
1. 上記のSSMのVPCエンドポイントと同様の手順で下記のVPCエンドポイントを作成します。
    - com.amazonaws.{リージョン}.ec2messages
    - com.amazonaws.{リージョン}.ssmmessages
1. 最終的には、下記の4つのVPCエンドポイントを作成しました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8504d0ec-9acc-6ca7-b0ff-2bb71bafa35b.png)

#### セキュリティグループの作成

1. EC2>セキュリティグループで、「セキュリティグループの作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a90ba070-6bd4-a71e-f48d-60b01fe4cb96.png)

1. SSMからのアクセス（443）と、S3 VPCエンドポイントへのアウトバウンドを設定します。なお VPCエンドポイントはプレフィックスリストを指定する必要があります。調べ方は[【小ネタ】Prefixリストを調べる](https://qiita.com/zumax/items/6b74810cb9be4a101b0d)に載せています。

##### VPCエンドポイントにセキュリティグループをアタッチ
1. 上記で作成したセキュリティグループを、作成済みのエンドポイントにアタッチし直します。（作成時にアタッチしておくほうが効率的です。）

#### EC2の作成
念の為、SSMが利用できるか確認してみます。

##### EC2用のIAMロールを作成します。
1. IAMロールの作成画面で、AWSサービス＆一般的なユースケースで「EC2」を選択し、「次へ」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fc54fdcf-8e19-abd0-485e-cb7cabb19d31.png)

1. AmazonSSMManagedInstanceCoreをアタッチし、「次へ」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/45e9c4cc-c51d-2b77-207c-1d1391f8ed80.png)

1. IAMロール名を入力し、「ロールを作成」をクリックします。
1. S3にアクセスできるように、IAMポリシーをインラインで作成します。
    ```
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::{作成したバケット名}",
                    "arn:aws:s3:::{作成したバケット名}/*"
                ]
            }
        ]
    }
    ```

##### EC2インスタンスの起動
1. EC2インスタンスを起動します。このとき、作成したIAMロールをIAMインスタンスプロファイルにアタッチします。また、VPCやセキュリティグループ等も作成したものを指定します。
1. ユーザデータには、下記を指定します。必須ではありません。
    ```
    #!/bin/bash
    sudo yum -y update
    sudo systemctl enable amazon-ssm-agent
    sudo systemctl start amazon-ssm-agent
    sudo yum install -y amazon-linux-extras
    sudo yum install -y aws-cfn-bootstrap
    sudo amazon-linux-extras install -y python3.8
    sudo yum -y install jq
    sudo yum -y install python3-pip
    sudo yum -y install postgresql
    sudo chown ssm-user /home/ssm-user/
    ```

1. EC2インスタンスを選択し、「接続」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8606d818-49ea-d9b3-609b-3766aa727115.png)

1. セッションマネージャータブを選択し、「接続」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/89291718-6672-bdfb-c3d7-a74f610f8123.png)

1. 接続できました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e050c3a9-d783-a8b4-5d9c-ba4d8405bcca.png)

### EMRを作成
[こちら](https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-gs.html)や、以前に載せた[Amazon EMRの入門チュートリアルを試してみた](https://qiita.com/zumax/items/f38f531854e0c67e7c92)を参考にEMRクラスタを作成します。

#### EMRクラスターを起動
1. EMRのトップページで「クラスターを作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5cb379b7-124c-5f32-86c1-554e066849a0.png)

1. 下記を入力し、「クラスターを作成」をクリックします。
    - 名前：MyEMRCluster
    - EMRリリース：emr-6.10.0
    - アプリケーションバンドル：Custom
        - Notebookを使うには、JupyterEnterpriseGatewayが必要です。
    - AWS Glue Data Catalogの設定：Sparkテーブルメタデータに使用
    - オペレーションシステムのオプション：Amazon Linuxリリース
    - インスタンスタイプ：m6a.xlarge
    - EC2セキュリティグループ：デフォルト
    - サービスロール：デフォルト
    - インスタンスプロファイル：作成したIAMロール
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1bd9afa4-c036-2ed4-4c16-8343324bd91e.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3541fb93-34f8-74fc-ef1d-f2d78cd0e03f.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/94092978-edad-7a58-96bf-1d99fa81260b.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ec8d04f7-60b9-2d08-f003-bfa92eb03e12.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cd86116e-4cbf-443e-6c41-31bff48114b9.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9c56a240-f15a-daa8-7b22-49bea7155b63.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/877df232-d42c-37f9-c0e1-f76910429098.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/afe03c52-fef0-ddb4-28ca-8b6e4ee1f967.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6e0ff857-324d-c34d-7856-6176e3f3d1c2.png)

1. 起動しました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/39f2ddf5-d8e9-582b-e697-aeb315e4fa18.png)



## EMR Studio サービスロールを作成する
各 EMR Studio は、Studio が他のAWSのサービスと対話できるようにするアクセス許可を備えた IAM ロールを使用する。

1. 信頼ポリシーを使用してサービスロールを作成します。
    ```
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "elasticmapreduce.amazonaws.com"
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                    "StringEquals": {
                        "aws:SourceAccount": "XXXXXXXXXX"
                    },
                    "ArnLike": {
                        "aws:SourceArn": "arn:aws:elasticmapreduce:us-west-2:XXXXXX:*"
                    }
                }
            }
        ]
    }
    ```
1. IAMポリシーを作成し、アタッチします。
    ```
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowEMRReadOnlyActions",
                "Effect": "Allow",
                "Action": [
                    "elasticmapreduce:ListInstances",
                    "elasticmapreduce:DescribeCluster",
                    "elasticmapreduce:ListSteps"
                ],
                "Resource": "*"
            },
            {
                "Sid": "AllowEC2ENIActionsWithEMRTags",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateNetworkInterfacePermission",
                    "ec2:DeleteNetworkInterface"
                ],
                "Resource": [
                    "arn:aws:ec2:*:*:network-interface/*"
                ],
                "Condition": {
                    "StringEquals": {
                        "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
                    }
                }
            },
            {
                "Sid": "AllowEC2ENIAttributeAction",
                "Effect": "Allow",
                "Action": [
                    "ec2:ModifyNetworkInterfaceAttribute"
                ],
                "Resource": [
                    "arn:aws:ec2:*:*:instance/*",
                    "arn:aws:ec2:*:*:network-interface/*",
                    "arn:aws:ec2:*:*:security-group/*"
                ]
            },
            {
                "Sid": "AllowEC2SecurityGroupActionsWithEMRTags",
                "Effect": "Allow",
                "Action": [
                    "ec2:AuthorizeSecurityGroupEgress",
                    "ec2:AuthorizeSecurityGroupIngress",
                    "ec2:RevokeSecurityGroupEgress",
                    "ec2:RevokeSecurityGroupIngress",
                    "ec2:DeleteNetworkInterfacePermission"
                ],
                "Resource": "*",
                "Condition": {
                    "StringEquals": {
                        "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
                    }
                }
            },
            {
                "Sid": "AllowDefaultEC2SecurityGroupsCreationWithEMRTags",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateSecurityGroup"
                ],
                "Resource": [
                    "arn:aws:ec2:*:*:security-group/*"
                ],
                "Condition": {
                    "StringEquals": {
                        "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true"
                    }
                }
            },
            {
                "Sid": "AllowDefaultEC2SecurityGroupsCreationInVPCWithEMRTags",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateSecurityGroup"
                ],
                "Resource": [
                    "arn:aws:ec2:*:*:vpc/*"
                ],
                "Condition": {
                    "StringEquals": {
                        "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
                    }
                }
            },
            {
                "Sid": "AllowAddingEMRTagsDuringDefaultSecurityGroupCreation",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateTags"
                ],
                "Resource": "arn:aws:ec2:*:*:security-group/*",
                "Condition": {
                    "StringEquals": {
                        "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true",
                        "ec2:CreateAction": "CreateSecurityGroup"
                    }
                }
            },
            {
                "Sid": "AllowEC2ENICreationWithEMRTags",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateNetworkInterface"
                ],
                "Resource": [
                    "arn:aws:ec2:*:*:network-interface/*"
                ],
                "Condition": {
                    "StringEquals": {
                        "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true"
                    }
                }
            },
            {
                "Sid": "AllowEC2ENICreationInSubnetAndSecurityGroupWithEMRTags",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateNetworkInterface"
                ],
                "Resource": [
                    "arn:aws:ec2:*:*:subnet/*",
                    "arn:aws:ec2:*:*:security-group/*"
                ],
                "Condition": {
                    "StringEquals": {
                        "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
                    }
                }
            },
            {
                "Sid": "AllowAddingTagsDuringEC2ENICreation",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateTags"
                ],
                "Resource": "arn:aws:ec2:*:*:network-interface/*",
                "Condition": {
                    "StringEquals": {
                        "ec2:CreateAction": "CreateNetworkInterface"
                    }
                }
            },
            {
                "Sid": "AllowEC2ReadOnlyActions",
                "Effect": "Allow",
                "Action": [
                    "ec2:DescribeSecurityGroups",
                    "ec2:DescribeNetworkInterfaces",
                    "ec2:DescribeTags",
                    "ec2:DescribeInstances",
                    "ec2:DescribeSubnets",
                    "ec2:DescribeVpcs"
                ],
                "Resource": "*"
            },
            {
                "Sid": "AllowSecretsManagerReadOnlyActionsWithEMRTags",
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:GetSecretValue"
                ],
                "Resource": "arn:aws:secretsmanager:*:*:secret:*",
                "Condition": {
                    "StringEquals": {
                        "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true"
                    }
                }
            },
            {
                "Sid": "AllowWorkspaceCollaboration",
                "Effect": "Allow",
                "Action": [
                    "iam:GetUser",
                    "iam:GetRole",
                    "iam:ListUsers",
                    "iam:ListRoles",
                    "sso:GetManagedApplicationInstance",
                    "sso-directory:SearchUsers"
                ],
                "Resource": "*"
            },
            {
                "Sid": "AllowWorkspaceCollaboration",
                "Effect": "Allow",
                "Action": [

                ],
                "Resource": "*"
            },
            {
                "Sid": "S3Access",
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:GetEncryptionConfiguration",
                    "s3:ListBucket",
                    "s3:DeleteObject"
                ],
                "Resource": [
                    "arn:aws:s3:::{バケット}",
                    "arn:aws:s3:::{バケット}/*"
                ]
            }
        ]
    }
    ```

1. 上記のIAMロールに対して、アクセス権をつけるため、S3バケットのバケットポリシーを修正します。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::｛アカウント名｝:role/EMR_Studio_role"
            },
            "Action": [
                "s3:GetEncryptionConfiguration",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::{バケット名}",
                "arn:aws:s3:::{バケット名}/*"
            ]
        }
    ]
}
```

  


## EMR Studio の作成
1. EMR Studioの画面で下記を入力し、「Studioを作成」をクリックします。
    - Studio名 ： 任意のStudio名
    - VPC　：　作成したVPC
    - サブネット　：　作成したサブネット
    - デフォルトのセキュリティグループ　：　クラスター/エンドポイントの有効化
    - 認証とIAMロール ：　認証をIAM
    - WorkSpaceのストレージ ： 作成したS3バケットを指定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b7501680-9000-4260-9f23-65d24bb8d8f6.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a4562280-32c0-d5e1-41bd-d53d1de88a04.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2a90569e-3ec8-a76d-34ab-1b2bf24f6816.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9e76abd7-f3db-8ba2-6f79-d78c864a2070.png)

1. 作成できました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/681af861-b6ba-d351-364c-f8689e5ba13e.png)

## Amazon EMR Studio を使用する
### EMR Studio Workspace の作成
1. EMR Studioのページで、Studio アクセスURLをクリックします。別ウィンドウ（タブ）で EMR Studioが立ち上がります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7dcfdc52-f9d4-e52d-6c0c-7afb7d2530ac.png)

1. 「Create workspace」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/485d86cd-6e24-6290-82f1-087d686e1984.png)

1. Workspace nameを入力し、「Create Workspace」をクリックします。※その他項目はデフォルトで全画面で入力したEMR Studioの設定が引き継がれています。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5045c36c-092b-2ddc-7850-21ae46d1757f.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/30b406e2-dab5-51a4-9494-5b3c100d19eb.png)

### タグ付け
上記で作成した、IAMポリシーにあるように、`for-use-with-amazon-emr-managed-policies`:`true`を下記のリソースに、タグを付ける。

- VPC
- サブネット
- EMR Studioのセキュリティグループ

### Workspacesの起動
1. 作成したWorkspaces名をクリックするとStarting→Readyになります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cfcedbc3-57e7-83bc-1b91-3f59b6ad28da.png)

## クラスターを Workspace にアタッチする
1. Workspaces名をクリックすると、ノートブックが別タブで起動されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ea92dc25-f697-7196-a738-efbf30803737.png)

1. ナビゲーションペインで①クラスタマークをクリック、②「EMR Clsuter on EC2」、③作成したクラスタを選択、最後に④Attachをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b9c275b8-a94b-808c-865a-d13311c04d21.png)

1. しばらくするとAttachされます。（おおよそ10分程度かかりました。）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8a0d3282-2e70-71a3-0a55-01b6b78303fa.png)

## Notebookの実行
### PySparkのノートブックを試す
1. 新規にノートブックを作成します。「＋」ボタンをクリックすると、Launcherが起動されるので、「PySpark」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c6cb31a9-fbe5-2a82-eefa-d9282ec75dc5.png)

1. notebook名をリネームします。
1. コマンドを実行します。表示されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/077eb93a-e353-bf21-be08-c4531f2158c8.png)


### Sparkを実行
[【小ネタ】Glue Sparkのメモ](https://qiita.com/zumax/items/b527509047f219fcee39#%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88)を元に、Sparkをノートブックで動かしてみます。

#### createDataFrameを使用してデータセットを作成する
1. 下記をセルに入力し実行します。
    ```
    t = (0,10,)
    list=[]
    for i in range(100):
        list.append(t)
    df = spark.createDataFrame(list)
    df.show()
    ```

1. 期待通りの結果が得られました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/799d9d01-962e-7c4d-4811-abb51afebf2e.png)

1. EMR Studioから、Spark History Serverを起動します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a94466cb-0f12-8285-f347-25bc4ea8e004.png)

1. 別タブで、History Serverが確認できました。「Show incomplete applications」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/49d73062-aded-bca9-6968-a9287bc0f5fc.png)

1. ジョブの実行結果が確認できました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/db0239ab-6f9f-75d2-1408-a7d5fb2546cb.png)

# 考察
今回は、EMR クラスタを起動し、EMR Studioでアタッチして使用してみました。Glue Studioなどと同じ様にインタラクティブに使用できる事がわかりました。
次回以降は、下記の内容を試してみたいと思います。
- CLIからNotebookを起動
- Git ベースのサービスとの連携

# 参考
https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-studio.html

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-setting-up.html

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-gs.html