Amazon EMR 再入門

改めてAmazon EMRを触った際の備忘録

以下のSpark ETLのWorkshop触ってのポイントまとめ
https://emr-etl.workshop.aws/spark_etl/steps.html

## 対応フレームワーク

Hadoop、Spark、Presto、Hive、Flink などのビッグデータ処理フレームワークやクエリエンジンのほか、TensorFlow、MXNet、Mahout などの機械学習系、Jupyter、Zeppelinなどのノートブックなどなど様々

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/6a86422e-9077-063d-eba2-0e259c6e9b13.png)

## EMR クラスタデプロイパターン

オプションは大きく分けて3つ

### [1] **EMR on EC2**
- 上記豊富なフレームワークから選べる標準的な使い方
- 基本はマスターノード・コアノード ・タスクノードで構成
- ノードタイプを固定する`Uniformインスタンスグループ`と、スポットインスタンスを組み合わせてコスト最適化戦略が組める`インスタンスフリート`から選択
    
### [2]  **EMR on EKS** 
- Apache Spark on Kubernetesな使い方
- 既存EKS(k8s)のリソースの有効活用ができる
- https://aws.amazon.com/jp/blogs/news/new-amazon-emr-on-amazon-elastic-kubernetes-service-eks/

### [3] **EMR Serverless**
- 2022/6 に GA
- https://aws.amazon.com/jp/about-aws/whats-new/2022/06/amazon-emr-serverless-generally-available/

## インタラクティブ操作用インターフェース
※ EMR on EC2 の Spark編

オプションは大きく分けて4つ

### [1] **Terminal**
- ターミナルでEMRマスターにSSH接続して利用（Cloud9など）
     <img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/6f5aec5a-227d-8ae6-c92f-35d1d503b4e2.png">

### [2] **JupyterHub/Zeppelin Notebook**
- EMRにオプションでセットアップするもの
- JupyterHubの場合は`https://[マスターパブリックDNS]:9443`でアクセス
- デフォルトユーザ名：jovyan、パスワード：jupyter
　<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/50f9139f-162d-22c0-eb9a-9a88f698874d.png">



### [3] **EMRノートブック**
- EMR機能として提供するサーバーレスのJupyterLab環境 (またはJupyterNotebook)
- EMR ノートブック自体の内容（ノートブックセル内の方程式、クエリ、モデル、コード、ナラティブテキスト）はクライアントで実行され、コマンドは EMR クラスター上のカーネルを使用して実行される
- 作成済みのEMRクラスターを指定して立ち上げるか、クラスタの作成も可能
- ターゲットとするEMRクラスタをアタッチデタッチで切り替えられる
- ノートブックの内容はS3にも保存される
- 標準的にインタラクティブに利用するならコレ
    <img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/8fa131c3-3be5-eda4-65b1-9da7ba3d06a7.png">


### [4] **EMR Studio**
- JupyterLabを中心とする統合開発環境（IDE)
- `Studio`の配下に`Workspace`を作る（WorkspaceごとにEMRノートブック(JupyterLab)が自動作成される）
- 複数のユーザでのコラボレーションと、データサイエンティストやデータエンジニアのワークフローを想定した各種機能をパッケージ化したイメージ
- SSOにも対応しており、マネコンログインせずに外部ID認証での利用も可能 
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/0e9e922f-ff11-b402-3a76-e8cbf0e48e8e.png">
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/7ccfe7ac-58ca-3321-d359-56ce5c5c2e08.png">

### EMR Studioセットアップメモ）

EMR StudioはSSOを利用せずIAM認証でも利用できる。
他の機能より事前準備が色々必要なため簡単にメモ

EMR Studioに設定するIAM ROLEとIAM User用のポリシー、SecurityGroupなどが必要。
既存のVPCを利用する場合に最低限必要な追加リソースは、下記GitHubのCloufFormationスタックで作成できる。
`min_studio_dependencies.yml`
https://github.com/aws-samples/emr-studio-samples

なお、ターゲットとするVPCとサブネットには、「`for-use-with-amazon-emr-managed-policies = true`」タグの設定が必要。（これの設定漏れでハマった）

全体的な流れは以下動画にまとまってある
https://www.youtube.com/watch?v=E8HxMnjz5JI

## ジョブの実行

※ Spark編

オプションは大きく分けて2つ

### [1] **EMR ステップAPI**
- ステップとは、EMRのAPIを利用して送信されるジョブの単位
- マネコンか、AWS CLI経由で実行できる
- ステップは基本シーケンシャル実行だが、Concurrency(同時実行数)を2〜256で変更できる
- あらかじめS3に格納したJarファイル(PySparkの場合はPythonスクリプトファイル)を指定してサブミットする


### [2] **spark-submit**
- SparkのAPIでの実行
- https://spark.apache.org/docs/latest/submitting-applications.html


## クラスタの終了

オプションは大きく分けて３つ
※クラスタ保護オプションに注意

### [1] マネコンまたは`TerminateJobFlows API`で明示的に削除する
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/d9ff9417-e807-2d21-414d-a0729a82458e.png">

### [2] クラスタ作成時のパラメータで、`指定した稼働時間後にアイドル状態の場合に自動終了`するオプションあり
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/b788432d-58e7-0306-ed52-f85e58c8beb1.png">


### [3] ステップAPIでジョブをサブミットし`完了時に自動終了`するオプションもある
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/4b1252c4-bd10-bdf8-19c7-e6af2b673828.png">


## ログの確認方法

### [1] **Terminal** で実行した場合は標準出力

### [2] 各種アプリケーションUI

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/5aed0c4a-c5a4-0ad0-989d-86656feacc3a.png">

- **Spark UI**
    - Spark history server UI
         <img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/babb1d7c-b5c3-ab8d-eec8-ae956f4a228a.png">

- **YARN timeline server**
  - YARN アプリケーションログ
         <img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/4354bb80-20da-e413-be64-7d79a678bf8f.png">

## ジョブ実行のオーケストレーション

主なオプション

- Apache Oozie（EMRでセットアップ可能）
- Apache Airflow（MWAAを利用）
- AWS Step Functions


参考）
https://aws.amazon.com/jp/blogs/news/orchestrate-apache-spark-applications-using-aws-step-functions-and-apache-livy/