Amazon EMRを整理してみた

# 背景・目的
Amazon ERMは使用したことありますが、どのような機能があるか仕様など細かいところを把握してないため整理します。

# まとめ
- 以下の特徴があります。
    - ビッグデータアプリケーション、PBスケールのデータ分析をオンプレの半分以下のコストで高速に実行できます。
    - カスタマイズされたEC2クラスタ、EKS、Outposts、EMR Serverlessで実行するオプションを備えた、最新のOSSフレームワークを使用してアプリケーションを構築する。
    - パフォーマンスが最適化されたOSSのAPI五感バージョンでSpark、Hive、Prestoを使用してインサイトを導き出すまでかかる時間を最大2倍高速
    - EMR NotebooksとEMR Studioの使い慣れたOSSを使用してアプリケーションを簡単に開發、視覚化、デバッグできる。
- 下記のユースケースで利用できます。
    - ビッグデータ分析
    - スケーラブルなデータパイプラインの構築
    - リアルタイムデータストリーム
    - データサイエンス、機械学習
- 下記のクラスタノードタイプがあります。
    - マスタノード
        - HadoopのNNや、YARNのRMが稼働している
    - コアタイプノード
        - データ書き込みを行うノード
        - アプリケーションマスターが実行される
        - アプリケーションマスタから起動されるタスクが起動される。
    - タスクノード
        - オプション。アプリケーションマスタから起動されるタスクが起動される。
- 様々な[ツール](https://qiita.com/zumax/items/4b641f49616e03bd6c76#%E3%83%84%E3%83%BC%E3%83%AB%E4%B8%80%E8%A6%A7)が使用できる。


# 概要
Amazon EMRの特徴を下記に整理します。
## 特徴
### 使いやすさ
Amazon EMR は、ビッグデータ環境とアプリケーションの構築および運用を簡略化します。
EMR の関連機能には下記のようなものがあります。
- 手軽なプロビジョニング
- マネージド型スケーリング
- クラスターの再設定
- 共同開発用の EMR Studio

#### 数分でクラスターをプロビジョニング
EMR クラスターは、数分で起動可能。
インフラストラクチャのプロビジョニングやクラスターの設定、構成、調整などを EMR に任せて、差別化できるビッグデータアプリケーションの開発に集中できる。

#### ビジネスニーズに合わせてリソースを簡単にスケーリング
EMRマネージドスケーリングポリシーを利用して、簡単にスケールアウト/スケールインが可能。
また EMR クラスターでは、使用量やパフォーマンスのニーズに合わせてコンピューティングリソースを自動的に管理できる。これにより、クラスターの使用率が向上し、コストが削減できる。

#### EMR Studio
R、Python、Scala、PySparkで書き込まれたデータエンジニアリングおよびデータサイエンスアプリケーションを、データサイエンティストやデータエンジニアが簡単に開発、視覚化、デバッグできるようにしたIDE。
EMR Studio では、フルマネージド型の Jupyter ノートブックと、Spark UI や YARN Timeline Service などのツールを使用して、デバッグを簡素化できる。

#### ワンクリックで高い可用性
下記のマルチマスターアプリケーション用の高可用性をワンクリックで設定できる。
- YARN
- HDFS
- Apache Spark
- Apache HBase
- Apache Hive

マルチマスターサポートを備えると、EMR によってこれらのアプリケーションが高可用性で設定される。
障害発生時には、予備のマスターに自動的にフェイルオーバーして、クラスターの破損を防げる。
**また、異なるラックにマスターノードを置き換え、同時障害のリスクを軽減できる。**
ホストをモニタリングして障害を検知し、問題が検出された場合、新しいホストがプロビジョニングされ、自動的にクラスターに追加される。

#### EMR マネージドスケーリング
可能な限り最小のコストで最高のパフォーマンスを発揮できるよう、クラスターのサイズを自動的に変更できる。
EMR マネージドスケーリングでは、クラスターの最小および最大のコンピューティング制限を指定できる。
また EMR により、最適なリソース使用率で最高のパフォーマンスと発揮できるよう、サイズを自動的に変更可能。
EMR マネージドスケーリングでは、クラスターで実行中のワークロードに関連する主要なメトリクスを継続的にサンプリングできる。

#### 実行中のクラスターを簡単に再設定
クラスターを再起動せずに、下記のEMR クラスターで実行中のアプリケーションの設定を変更できるようになった。
- Apache Hadoop
- Apache Spark
- Apache Hive
- Hue などの 

EMR のアプリケーション再設定機能を使用すると、シャットダウンやクラスターを再作成をせずに、実行中のアプリケーションを変更できる。
EMR によって新しい設定が適用され、再設定済みのアプリケーションが適切に再起動される。
設定は、コンソール、SDK、CLI を使用して適用可能。

### 伸縮性
EMRでは、必要なキャパシティーを迅速かつ簡単にプロビジョニングでき、キャパシティーを自動または手動で追加、削除できる。
これは、処理要件が変動しやすい、または予測不可能な場合に非常に便利。例えば、処理のほとんどが夜間に発生する場合、日中は 100 個のインスタンス、夜間は 500 個のインスタンスが必要になることがあるなど。
または、短期間に大量のキャパシティーが必要な場合もある。EMR では、何百、何千ものインスタンスをすばやくプロビジョニングし、コンピューティング要件に合わせて自動的にスケーリングし、ジョブが完了したら (アイドル状態のキャパシティーに対する支払いを避けるために) クラスターをシャットダウンできる。

キャパシティーの追加または削除には、主に 2 つのオプションがある。

#### 複数のクラスターのデプロイ
より多くのキャパシティーが必要な場合、簡単に新しいクラスターを起動でき、必要なくなれば停止できる。
使用できるクラスターの数に制限はない。
複数のユーザーやアプリケーションを使用している場合は、複数のクラスターを使用すると便利。
例えば、入力データを S3 に保存し、データ処理の必要な各アプリケーションでそれぞれ 1 つのクラスターを起動できる。
1 つのクラスターは CPU 用に、もう 1 つのクラスターはストレージなどのために最適化できる。

#### 実行中のクラスターのサイズ変更
EMR では、実行中のクラスターでの以下により変更が簡単に行える。 
- EMR マネージドスケーリング
- 自動スケーリング
- 手動によるサイズ変更
 
クラスターをスケールアウトして一時的に処理能力を追加したり、アイドル状態のキャパシティーがある場合、クラスターをスケールインしてコストを節減できる。
例えば、バッチ処理が発生した場合に数百個のインスタンスをクラスターに追加し、処理完了後に余分なインスタンスを削除できる。
クラスターにインスタンスを追加すると、EMR では、プロビジョニングされたキャパシティーを使用できるようになった時点ですぐに使い始められる。
スケールイン時には、EMR によりアイドル状態のノードが積極的に選択され、実行中のジョブへの影響を軽減する。

### 低コスト
EMR は大量データの処理にかかるコストを節減することを目的としている。
低コストを実現する機能の例として、以下のようなものがある。
- 秒単位での低料金設定
- EC2スポットとの統合
- EC2 リザーブドインスタンスとの統合
- 伸縮性
- S3 との統合

#### 秒単位での低料金設定
EMR の料金は 1 秒ごとに課金され、最小課金時間は 1 分

#### EC2 スポットとの統合
EC2 スポットインスタンスの料金は、インスタンスの需要と供給に基づいて変動するが、指定した上限を超える支払いが発生することはない。
EMR により、スポットインスタンスの使用が簡単になるため、時間とコストの両方を節約できる。
EMR クラスターには HDFS を実行する「コアノード」と、実行しない「タスクノード」がある。
スポット料金が上がりインスタンスが失われる場合を考慮して、HDFS に保存したデータを失わないためにも、スポットにはタスクノードが適している。

#### S3 との統合
EMR File System (EMRFS) により、EMR クラスターで、S3 を Hadoop のオブジェクトストアとして効率的かつ安全に使用できる。
データを S3 に保存し、複数のEMR クラスターを使用して同じデータセットを処理できる。
各クラスターは特定のワークロードに最適化できるため、1 つのクラスターで要件の異なる複数のワークロードを処理するより効率的。
例えば、I/O に最適化されたクラスターと、CPU に最適化されたクラスターで、それぞれ S3 の同じデータセットを処理することが可能。さらに、入力および出力データをS3 に保存することで、不要になったクラスターをシャットダウンできる。

EMRFS は、S3 からの読み取りと S3 への書き込みのパフォーマンスに優れ、KMSまたはカスタマー管理型のキーを使用した S3 サーバー側または S3 クライアント側の暗号化に対応している。
また、メタデータで追跡されたオブジェクトのリストと書き込み後の読み取りの整合性をチェックする、整合性のあるビューを利用することもできる。
また、EMR クラスターでは、EMRFS と HDFS の両方を使用できるため、クラスターのストレージと Amazon S3 のいずれかを選択する必要はない。

#### AWS Glue データカタログの統合
Glue データカタログをマネージドメタデータリポジトリとして使用して、Apache Spark や Apache Hive のために外部テーブルのメタデータを保存できる。
また、スキーマの自動検出とバージョン履歴も利用できる。
これによって、クラスター外部にある S3 の外部テーブルのために、メタデータを簡単に保持できる。

#### 柔軟性のあるデータストア
EMR では、S3、HDFS、DynamoDB を含む複数のデータストアを活用できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c4e31faa-2bad-8f47-f3d0-50539ac29914.png)
※ [出典：Amazon EMRの特徴 ＞ 柔軟性のあるデータストア](https://aws.amazon.com/jp/emr/features/?nc=sn&loc=2&dn=1)

#### S3
EMR は、EMRFSによって、Hadoop のオブジェクトストアとして S3 を効率的かつセキュアに使用できる。
EMR では、S3 に保存された大量のデータをシームレスに処理できるよう Hadoop に多数の改善点を追加している。
また、EMRFS では、整合性のあるビューを使用して、S3 のオブジェクトのリストと書き込み後の読み取りの整合性をチェックできる。
EMRFS は、暗号化された S3 オブジェクトを処理するために S3 サーバー側または S3 クライアント側の暗号化に対応しており、ユーザーは KMS またはカスタムキーベンダーを使用できる。

クラスターを起動すると、EMR では S3 からデータをクラスター内の各インスタンスにストリームし、直ちに処理を開始する。
データを S3 に保存して EMR で処理するメリットの 1 つは、複数のクラスターを使用して同じデータを処理できる点。

#### HDFS
EMR の現行のトポロジグループのインスタンスは、下記の3つの論理インスタンスのグループがインストールされる。
- マスターグループ
    - YARN リソースマネージャーと HDFS Name Node
- コアグループ
    - HDFS DataNodeと YARN ノードマネージャーサービス
    - EMR では、コアグループのインスタンスに関連付けられたストレージに HDFS がインストールされる
- タスクグループ
    - YARN ノードマネージャーサービスを実行する

各 EC2 インスタンスは、"インスタンスストア" と呼ばれる、インスタンスにアタッチされた固定容量のストレージを備えています。
また EBS ボリュームをインスタンスに追加することで、インスタンスのストレージをカスタマイズすることもできる。
EMR では、下記のボリュームタイプを追加できる。
- 汎用 (SSD)
- プロビジョンド (SSD)
- マグネティック

EMR クラスターに追加された EBS ボリュームでは、クラスターがシャットダウンした後はデータを維持しない。EMR ではクラスターが終了すると、自動的にボリュームがクリーンアップされる。
EMR のセキュリティ設定を使用して HDFS の完全な暗号化を有効にしたり、Hadoop Key Management Server を使って HDFS 暗号化ゾーンを手動で作成できる。
AWS KMS をキープロバイダーに設定すると、セキュリティ設定オプションを使用して、EBS ルートデバイスおよびストレージボリュームを暗号化できる。

#### DynamoDB
EMR は DynamoDB と直接統合しているため、すばやく効率的に DynamoDB に保存されたデータを処理し、EMR 内で DynamoDB、S3、HDFS の間のデータを転送できる。

#### その他の AWS データストア
EMR では、RDS、Glacier、Redshiftも使用できる。

#### OSSアプリケーション
EMR 上でのバージョンリリースにより、Apache Spark や Hadoop エコシステムのアプリケーションを含む、最新のオープンソースプロジェクトを EMR クラスタ上で簡単に選択して使用できる。
ソフトウェアのインストールと設定は EMR 側で行われるため、インフラストラクチャや管理タスクを気にせずに、データの価値を高めることにより多くの時間をかけることができる。

#### ビッグデータツール
EMR では、下記をサポートしている。
- Apache Spark
- Apache Hive
- Presto
- Apache HBase

データサイエンティストは、EMR を使うことで TensorFlow、Apache MXNet などの深層学習や機械学習も実行できる。また、ブートストラップアクションを使用すると、ユースケース専用のツールやライブラリを追加できる。
データ分析担当者は、下記を使用して、インタラクティブな開発、Spark ジョブの作成、Apache Hive と Presto に対する SQL クエリの送信を行える。
- EMR Studio
- Hue
- EMR ノートブック

データエンジニアは、EMRを使用して、データパイプラインの開発とデータ処理を行える。また、Apache Hudi を使用して、増分データ管理や、レコードレベルでの挿入、更新、削除操作が必要なデータプライバシー関連のユースケースを簡素化できる。

#### ツール一覧

| 分類 | ツール | 説明 | 参考情報|
|:---|:---|:---|:---|
|Data Processing & Machine Learning | Apache Spark | 大容量のデータセットを高速に処理するための、Hadoop エコシステムのエンジン。<BR>インメモリの耐障害性のある RDD (Resilient Distributed Datasets) と DAG (Directed Acyclic Graphs) を使用してデータ変換を定義しする。<BR>Spark には、Spark SQL、Spark Streaming、MLlib、GraphX も含まれている。|[Amazon EMR での Apache Spark](https://aws.amazon.com/jp/emr/features/spark/?nc1=h_ls)|
| |Apache Flink |高スループットのデータソースでリアルタイムのストリームを処理しやする。<BR>Flink では、下記をサポートしている。<BR>・順不同のイベントのイベントタイムセマンティクス<BR>・1 回のみのセマンティクス<BR>・backpressure control<BR>・ストリーミングアプリケーションとバッチアプリケーションの両方の記述用に最適化された API | [Apache Flink](https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-flink.html)|
| | TensorFlow |TensorFlowはマシンインテリジェンスと深層学習アプリケーションのオープンソースの Symbokic Math ライブラリ。<BR>これにより、機械学習と深層学習の複数のモデルとアルゴリズムをまとめて、多彩なユースケースのために深淵なニューラルネットワークを訓練、実行が可能。|[TensorFlow](https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-tensorflow.html)|
|Record-Level Amazon S3 Data Management |Apache Hudi | Apache Hudi は、増分データの処理とデータパイプラインの開発を簡素化するOSSフレームワーク。<BR>Hudi を使用すると、Amazon S3 のレコードレベルでデータを管理し、変更データキャプチャ (CDC) とストリーミングデータの取り込みを簡素化できる。<BR>また、レコードレベルの更新と削除が必要なデータプライバシーのユースケースを処理できるフレームワークを利用可能。|[Apache Hudi on Amazon EMR](https://aws.amazon.com/jp/emr/features/hudi/)|
|SQL |Apache Hive | Hive はOSSのデータウェアハウスであり、Hadoop の上で稼働する分析パッケージ。<BR>Hive は SQL ベースの言語である Hive QL で運用され、データの構造化、集約、クエリの実行機能を備えてる。<BR>Hive QL は標準的な SQL を超えるものであり、map/reduce 関数や、JSON や Thrift といった複雑で拡張可能なユーザー定義のデータタイプを完全にサポートしている。<BR>この機能により、テキスト文書やログファイルといった、複雑で構造化されていないデータソースの処理が可能になる。<BR>Hive では Java で書かれたユーザー定義の関数を使用したユーザー拡張が可能。<BR> EMR では DynamoDB や S3 との直接統合など、Hive に多数の改善点を追加した。<BR>例えば、Amazon EMR では Amazon S3 からの自動的なテーブルパーティションの読み込み、一時ファイルを使用しない S3 テーブルへのデータの書き込み、カスタム map/reduce 操作のスクリプトや追加のライブラリといった S3 のリソースへのアクセスが可能。|[What is Apache Hive?](https://aws.amazon.com/jp/big-data/what-is-hive/)<BR>[Apache Hive on Amazon EMR](https://aws.amazon.com/jp/emr/features/hive/) |
| |Presto | Presto は、OSSの分散 SQL クエリエンジンで、低レイテンシーでアドホックなデータ分析用に最適化されている。<BR>ANSI SQL 標準をサポートしており、複雑なクエリ、集計、結合、ウィンドウ関数が実行可能。<BR>Presto を使用して、HDFS や S3 など、複数のデータソースのデータを処理できる。|[Introduction to Presto (PrestoDB)](https://aws.amazon.com/jp/big-data/what-is-presto/) <BR>[Amazon EMR での Presto](https://aws.amazon.com/jp/emr/features/presto/)|
| | Apache Phoenix| Phoenix を使用すると SQL のレイテンシーが低下するうえ、HBase の保存データで ACID トランザクション機能を利用できる。<BR>パフォーマンスを高めるためにセカンダリインデックスを簡単に作成し、同一の基盤となる HBase テーブルでさまざまなビューを作成できる。|[Apache Phoenix](https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-phoenix.html)|
|NoSQL | Apache HBase| Apache HBase は、Google の BigTable に基づいて設計されたオープンソースのリレーショナルでない分散データベース。Apache Software Foundation の Hadoop プロジェクトの一部として開発され、HDFS上で動作し、Hadoop に BigTable のような機能を提供する。<BR>HBase では、列ベースの圧縮と保存により、耐障害性に優れた効率的な方法で大量の疎データを保存できる。さらに、HBase ではデータがメモリ内にキャッシュされるため、データをすばやく参照できる。<BR>HBase は、シーケンシャル書き込み操作用に最適化されており、バッチ挿入、更新、削除処理も非常に効率的。<BR>HBase は Hadoop とシームレスに連携し、ファイルシステムを共有し、Hadoop ジョブへの直接入出力として機能を提供できる。<BR>また、HBase は Apache Hive と統合されており、HBase テーブルで SQL に似たクエリを利用できる。Hive ベースのテーブルとの結合、JDBC もサポートする。EMR を使用すると、S3 を HBase のデータストアとして使用できるため、コストを削減し、運用の複雑さを軽減できる。<BR>HDFS をデータストアとして使用する場合は、HBase を S3 にバックアップしたり、以前に作成したバックアップから復元できる。|[What is Apache HBase?](https://aws.amazon.com/jp/big-data/what-is-hbase/)|
|インタラクティブ分析 | EMR Studio|EMR Studio は、R、Python、Scala、PySparkで書き込まれたデータエンジニアリングおよびデータサイエンスアプリケーションを、データサイエンティストやデータエンジニアが簡単に開発、視覚化、デバッグできるようにしたIDE。EMR Studio では、フルマネージド型の Jupyter ノートブックと、Spark UI や YARN Timeline Service などのツールを使用して、デバッグを簡素化できる。| |
| | Hue |Hue は Hadoop 用のオープンソースのユーザーインターフェイスで、下記を簡単にできる。<BR>・Hive クエリの実行と開発<BR>・HDFS のファイルの管理<BR>・Pig スクリプトの実行と開発<BR>・テーブルの管理<BR>・EMR の Hue を S3 と統合し、S3 に対して直接クエリを実行すること<BR>・HDFS と S3 間で簡単にファイルを転送すること。 |[Hue](https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-hue.html)|
| |Jupyter Notebook |Jupyter Notebook はOSSのウェブアプリケーションで、ライブコード、方程式、可視化ツール、ナラティブテキストを含むドキュメントの作成と共有に使用できる。JupyterHub を使用すると、Jupyter Notebook サーバーの単一ユーザーの複数インスタンスをホストできる。JupyterHub で EMR クラスターを作成すると、EMR ではクラスターのマスターノードに Docker コンテナが作成される。<BR>このコンテナ内では、JupyterHub、Jupyter に必要なすべてのコンポーネント、Sparkmagic が実行される。 | |
| |Apache Zeppelin |Apache Zeppelin は、Spark を使用してデータ探索を実行するインタラクティブな共同作業用のノートブックを作成するためのオープンソースの GUI。<BR>Scala、Python、Spark SQL、HiveQL を使用してデータを操作し、結果を迅速に可視化できる。<BR>Zeppelin ノートブックは複数のユーザー間で共有でき、可視化した結果は外部のダッシュボードに公開できる。| |
|スケジューリングとワークフロー | Apache Oozie | Apache Oozie は Hadoop のワークフロースケジューラ。<BR>Oozie を使用して、アクションの Directed Acyclic Graphs (DAG) を作成できる。<BR>また、Hadoop ワークフローをアクションまたは時間で簡単にトリガーできる。<BR>AWS Step Functions を使うと、サーバーレスワークフローの自動化をアプリケーションに追加できる。ワークフローのステップは、AWS Lambda 関数、EC2、オンプレミスなど、どこでも実行できる。| [Apache Oozie](https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-oozie.html)|
|その他のプロジェクトとツール | - |EMR では、ほかにも多くの主要なアプリケーションとツールをサポートしている。<BR>具体例として、下記が挙げられる。<BR>・R<BR>・Apache Pig (データ処理と ETL)<BR>・Apache Tez (複雑な DAG の実行)<BR>・Apache MXNet (深層学習)<BR>・Ganglia (モニタリング)<BR>・Apache Sqoop (リレーショナルデータベースコネクタ)<BR>・HCatalog (テーブルおよびストレージ管理)<BR><BR> Amazon EMR チームは、ブートストラップアクションのオープンソースリポジトリを管理している。このリポジトリは、追加ソフトウェアのインストールやクラスターの設定を行うために使用でき、独自のブートストラップアクションを作成する際のサンプルにもなる。 | |

### データのアクセスコントロール
デフォルトでは、Amazon EMR アプリケーションプロセスは他の AWS サービスを呼び出すときに EC2 インスタンスプロファイルを使用する。マルチテナントクラスターの場合、Amazon EMR は、S3 データへのユーザーアクセスを管理するための 3 つのオプションを提供する。

- AWS Lake Formation との統合により、AWS Lake Formation で詳細な承認ポリシーを定義および管理して、AWS Glue Data Catalog のデータベース、テーブル、および列にアクセスできる。インタラクティブな EMR Spark ワークロードに対して Amazon EMR Notebooks および Apache Zeppelin を介して送信されたジョブに承認ポリシーを適用し、監査イベントを CloudTrail に送信できる。<BR>この統合を有効にすることで、SAML2.0 と互換性のあるエンタープライズ ID システムから EMR Notebooks または Apache Zeppelin へのフェデレーション SSO も有効になる。

- Apache Ranger とのネイティブ統合により、新規または既存の Ranger サーバーをセットアップして、ユーザーが Hive Metastore 経由で Amazon S3 データのデータベース、テーブル、および列にアクセスするための詳細な承認ポリシーを定義および管理できる。<BR>このネイティブ統合により、Ranger ポリシー管理サーバーで 3 種類の認証ポリシーを定義できる。
    - Hive でテーブル、および列レベルの認証に対してテーブル、列、および行レベルの認証を設定できる。
    - Spark では、テーブルおよび列レベルの認証を定義できる。
    - S3 にはプレフィックスとオブジェクトレベルの認証を定義できる。

EMR は、対応する Apache Ranger プラグインをクラスターに自動的にインストールして構成する。Ranger プラグインはポリシー管理サーバーとの間で認証ポリシーを同期し、データアクセス制御を適用して、監査イベントを Amazon CloudWatch Logs に送信する。

- EMR User Role Mapper を使用すれば、IAM アクセス許可を利用して AWS リソースへのアクセスを管理できる。ユーザー (またはグループ) とカスタム IAM ロール間のマッピングを作成できる。ユーザーまたはグループは、カスタム IAM ロールによって許可されたデータにのみアクセスできる。この機能は現在、AWS ラボからご利用できるとのこと。

### ハイブリッドエクスペリエンス
AWS Outposts は、AWS のインフラストラクチャ、AWS のサービス、API、ツールをほぼすべてのデータセンター、コロケーションスペース、オンプレミスの施設に拡張し、真に安定したハイブリッドエクスペリエンスを実現するフルマネージドサービス。<BR>EMR on AWS Outposts では、同じ AWS マネジメントコンソール、同じソフトウェア開発キット (SDK)、同じコマンドラインインターフェイス (CLI) を EMR に使用して、データセンターの EMR クラスターをデプロイおよび管理することができる。

### その他の機能
#### クラスターに最適なインスタンスを選択
アプリケーションの要件に基づいて、クラスターにプロビジョニングする EC2 インスタンスのタイプを選択できる。すべてのインスタンスへのルートアクセス権限を持ち、要件に合わせてクラスターを自在にカスタマイズできる。Amazon EMR では、Graviton2 ベースのインスタンスで Spark ワークロードのコストを最大 30% 削減し、パフォーマンスを最大 15% 向上させることができる。

#### クラスターへのネットワークアクセスの制御
VPCでクラスターを起動できる。独自の IP アドレスの範囲の選択、サブネットの作成、ルートテーブルやネットワークゲートウェイの設定など、仮想ネットワーク環境を完全に制御できる。

#### アプリケーションのデバッグ
クラスターでデバッグを有効にすると、EMR によってログファイルが S3 にアーカイブされ、それらのファイルにインデックスが付けられる。その後、コンソールのグラフィカルインターフェイスを使用して、ログを直観的な方法で閲覧できる。

#### ユーザー、アクセス許可、暗号化の管理
IAM ユーザーや IAM ロールなどの IAMツールを使用して、アクセスおよびアクセス許可を制御できる。
例えば、特定のユーザーに対してクラスターへの読み取りを許可するが書き込みのアクセス許可は与えないといった制御を行える。また、EMR のセキュリティ設定を使用すれば、S3 暗号化への対応や Kerberos 認証など、保管中および移動中の暗号化に関するさまざまなオプションを設定が可能。

#### クラスターのモニタリング
CloudWatch を使用して、Map と Reduce タスクの平均実行数など、カスタム Amazon EMR メトリクスをモニタリングできる。また、これらのメトリクスではアラームを設定できる。

#### 追加ソフトウェアのインストール
ブートストラップアクションや Amazon Linux を実行しているカスタム AMI を使用して、追加ソフトウェアをクラスターにインストールが可能。(ブートストラップアクションは、Amazon EMR がクラスターを起動したときにクラスターノードで実行されるスクリプト。）Hadoop が起動され、ノードがデータ処理を開始する前に実行される。カスタム Amazon Linux AMI にソフトウェアを事前にロードして使用することもできる。

#### イベントに対応
CloudWatch Eventsで Amazon EMR イベントタイプを使用して、Amazon EMR クラスターの状態の変化に対応できる。すぐに設定できる簡単なルールを使用してイベントを一致させ、それらを SNS トピック、AWS Lambda 関数、Amazon SQS キューなどに振り分けられる。

#### 繰り返し発生するワークフローのスケジューリング
Data Pipeline を使って、Amazon EMR に関して繰り返し発生するワークフローをスケジューリングできる。Data Pipeline は、AWS のコンピューティングサービス、ストレージサービス、オンプレミスのデータソース間のデータを指定した間隔で確実に移動、処理できるウェブサービス。

#### データの効率的なコピー
EMR の S3DistCp は、MapReduce を使って大量のデータを効率的に移動させることができるOSSツールである Distcp の拡張。
これを使用すると、大量のデータを Amazon S3 から HDFS へ、HDFS から Amazon S3 へ、そしてAmazon S3 バケット間をすばやく移動させることができる。

#### 深層学習
Apache MXNet などの一般的な深層学習フレームワークを使用して、深層ニューラルネットワークを定義、トレーニング、デプロイできる。
これらのフレームワークは、EMR クラスターで GPU インスタンスとともに使用できる。

#### カスタム JAR
Java プログラムを書き込み、使用する Hadoop のバージョンにコンパイルして Amazon S3 にアップロードできる。
その後、Hadoop JobClient インターフェイスを使用して Hadoop ジョブをクラスターに送信する。

## アーキテクチャ
### EMRの概要
#### クラスターおよびノードについて
- クラスタ
    - 中心的なコンポーネントは、クラスタ。クラスターは、EC2の集合。
- ノード
    - クラスター内のインスタンスはノードと呼ばれる。
    - 各ノードには、クラスター内にロールがあり、ノードタイプと呼ばれる。
    - EMRは、各ノードタイプに様々なソフトウェアコンポーネントをインストールし、Hadoopなどの分散型アプリケーションでのロールを各ノードに付与する。
- ノードタイプ
    - 下記に整理します。

    | ノードタイプ|概要 |動作するサービス、プロセスおよび、デーモン | 
    |:--|:--|:--|
    | マスターノード（プライマリーノード） | 処理を行うために他のノード間でのデータ、タスクの分散を調整するソフトウェアコンポーネントを実行することで、クラスターを管理するノード. <BR>タスクのステータスを追跡し、クラスタの状態を監視する。全てのクラスタには、マスターノードがあり、マスターノードのみで1つのノードクラスターを作成することができる<BR><BR>※EMR5.23.0以降では、高可用性サポートのため、3つのプライマリーノードを持つクラスタを起動できる。|NameNode<BR>ResourceManager |
    | コアノード | プライマリーノードにより管理される。<BR>タスクを実行し、クラスタ上のHDFSにデータを保存するソフトウェアコンポーネントを持つノード。マルチノードクラスタには、少なくとも1つのコアノードがある。<BR>コアインスタンスグループ、またはインスタンスフリートは、クラスタ毎に1つだけ。その中で複数のEC2インスタンスノードを実行できる。インスタンスグループの場合に、クラスタ実行中にノードの追加、およびオートスケーリングで追加も可能。 |DataNode<BR>NodeManager<BR>MapReduceタスク<BR>Spark Executor | 
    | タスクノード | タスクを実行するのみで、HDFSにデータを保存しないソフトウェアコンポーネントを持つノード。<BR>※タスクノードはオプション<BR>| NodeManager<BR>MapReduceタスク<BR>Spark Executor|

#### クラスターへのワークの送信
EMR でクラスターを実行する場合、行う必要があるワークを指定する方法についてはいくつかのオプションがある。
- クラスターの作成時にステップとして指定する関数で実行するワークの、完全な定義を提供する。
    - 通常、一定量のデータを処理し処理が完了したときに終了するクラスターに対して実行される。
- 長時間稼働クラスターを作成し、EMR コンソール、Amazon EMR API、または AWS CLI を使用してステップを送信する。
    - ステップには、1つ以上のジョブが含まれている場合がある
- クラスターを作成し、SSH を使用してマスターノードや必要に応じて他のノードに接続して、インストール済みアプリケーションが提供するインターフェイスを使用する。
    - スクリプト化を使用するか、インタラクティブにタスクを実行し、クエリを送信する。

#### データの処理
クラスターを起動するとき、データ処理の必要に合わせてインストールするフレームワークとアプリケーションを選択する。
EMR クラスターでデータを処理するには、インストールされたアプリケーションにジョブまたはクエリを直接送信するか、クラスターでステップを実行することもできる。

##### アプリケーションへのジョブの直接送信
EMR クラスターにインストールされたソフトウェアを使用し、直接ジョブを送信して操作できる。
これを行うには、通常安全な接続経由でマスターノードに接続し、クラスターで直接実行されるソフトウェアに使用できるインターフェイスとツールにアクセスする。

##### クラスターライフサイクルについて
EMR クラスターは次のプロセスに従う。
1. 最初に、EMR は指定に従って、各インスタンスのクラスターで EC2 インスタンスをプロビジョニングする。 EMR は、すべてのインスタンスに対して、EMR 用のデフォルト AMI または指定するカスタム Amazon Linux AMI を使用する。

1. 各インスタンスで指定したブートストラップアクションが EMR によって実行される。ブートストラップアクションを使用してカスタムアプリケーションをインストールし、必要なカスタマイズを実行できる。

1. Amazon EMR は、Hive、Hadoop、Spark など、クラスターの作成時に指定するネイティブアプリケーションをインストールする。

1. ブートストラップアクションが正常に完了し、ネイティブアプリケーションがインストールされると、クラスターの状態は RUNNING になる。この時点で、クラスターインスタンスに接続できる。クラスターは、クラスターの作成時に指定されたステップを順番に実行する。前のステップの完了後に実行される追加のステップを送信できる。

1. ステップが正常に実行されると、クラスターは WAITING 状態になる。最後のステップの完了後に自動終了するようクラスターが設定されている場合は、TERMINATING 状態になり、次に TERMINATED 状態になる。クラスターが待機するように設定されている場合は、不要になったときに手動でシャットダウンする必要がある。クラスターを手動でシャットダウンすると、クラスターは TERMINATING 状態になり、次に TERMINATED 状態になる。

クラスターのライフサイクル中にエラーが発生すると、削除保護を有効にしていない限り、EMR はクラスターとそのすべてのインスタンスを終了させる。
エラーのためにクラスターが終了した場合、そのクラスターに保存されているデータは削除され、クラスターの状態は TERMINATED_WITH_ERRORS に設定される。削除保護を有効にした場合、クラスターからデータを取得し、削除保護を解除してクラスターを終了できる。

クラスターのライフサイクルと、ライフサイクルの各ステージが特定のクラスターの状態にどのようにマッピングされるかを下記に記載する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b7fbba9e-3ed0-5e36-def2-a80dbc29ad84.png)
[出典：クラスターライフサイクルについて](https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-overview.html)

### Amazon EMR アーキテクチャの概要
EMR サービスアーキテクチャは複数のレイヤーで構成されており、各レイヤーはクラスターに特定の機能を提供する。

#### ストレージ
##### Hadoop Distributed File System（HDFS）
- HDFS は Hadoop が採用する、分散型のスケーラブルなファイルシステム。
- HDFS はデータをクラスター内の各インスタンスに分散して保存する。データの複数のコピーが複数のインスタンスに保存されるため、個々のインスタンスが障害を起こしてもデータが失われることはない。
- HDFS はエフェメラルストレージであり、クラスターを終了するときに消去される。HDFS は、 MapReduce 処理中の中間結果をキャッシュする場合や、大量のランダム I/O が発生するワークロードに役立つ。


##### EMR ファイルシステム (EMRFS)
- EMRFSを使用すると、EMR で Hadoop が拡張され、まるで HDFS などのファイルシステムのように、Amazon S3 に保存されたデータに直接アクセスできる。
- クラスターではファイルシステムとして HDFS または Amazon S3 のいずれかを使用できる。ほとんどの場合、Amazon S3 は入力データおよび出力データを格納する場合に使用され、中間結果は HDFS に格納される。

##### ローカルファイルシステム
- ローカルファイルシステムとは、ローカルに接続されているディスクを指す。
- Hadoop クラスターを作成すると、インスタンスストアと呼ばれる、あらかじめアタッチされたディスクストレージのブロックが事前設定されている EC2 インスタンスから、各ノードが作成される。
- インスタンスストアボリューム上のデータは、EC2 インスタンスのライフサイクル中のみ使用できる。

#### クラスターリソース管理
リソース管理レイヤーは、クラスターリソースの管理とデータを処理するジョブのスケジューリングを行う。

- デフォルトでは、EMR は Apache Hadoop 2.0 に導入されたコンポーネントである YARNを使用し、複数のデータ処理フレームワークのクラスターリソースを集中管理する。
    - ただし、Amazon EMR で提供されているフレームワークやアプリケーションの中には、リソースマネージャーとして YARN を使用しないものも存在する。
- EMR の各ノードには、YARN コンポーネントの管理、クラスターの正常な状態の維持、Amazon EMR とのやり取りを行うエージェントもある。
- スポットインスタンスはタスクノードの実行に使用されることが多いため、EMR には、タスクノードが終了しても実行中のジョブが失敗しないように YARN ジョブをスケジュールするための機能がデフォルトで備えられている。
- EMR は、アプリケーションマスタープロセスをコアノードでのみ実行できるようにすることで、これを実現している。
    - アプリケーションマスタープロセスは実行中のジョブを制御し、ジョブが有効である間は存続する必要がある。
- EMR リリース 5.19.0 以降では、組み込みの YARN ノードラベル機能を使用して、これを実現している。
    - (以前のバージョンではコードパッチを使用していた。)。yarn-site と capacity-scheduler の設定分類のプロパティは、YARN capacity-scheduler と fair-scheduler がノードラベルを利用できるように、デフォルトで設定されている。
- EMR は、CORE ラベルでコアノードに自動的にラベルを付け、アプリケーションマスターが CORE ラベルを持つノードでのみスケジュールされるようにプロパティを設定する。
    - **yarn-site および capacity-scheduler 設定分類の関連プロパティを手動で変更したり、関連する XML ファイルで直接変更したりすると、この機能が停止したり、この機能が変更されたりする可能性がある。**

#### データ処理フレームワーク
データ処理フレームワークレイヤーは、データの処理と分析に使用されるエンジン。YARN で実行されるフレームワークや、独自のリソース管理を持つフレームワークも多数用意 バッチ、インタラクティブ、メモリ内、ストリーミングなど、処理のニーズの種類に合わせて異なるフレームワークを使用できる。
選択するフレームワークは、ユースケースによって異なる。これは、アプリケーションレイヤー (処理するデータの操作に使用されるレイヤー) から使用可能な言語とインターフェイスに影響を与える。EMR で使用できる主な処理フレームワークは、Hadoop MapReduce と Spark。

##### MapReduce
- 分散コンピューティング用のOSSプログラミングモデルです。
- Map と Reduce という 2 つの機能を提供しながら、全てのロジックを処理することで並行分散アプリケーションを書くプロセスを単純化するもの。
    - Map 機能は「中間結果」と呼ばれるキーと値のペアにデータをマップ。
    - Reduce 機能は中間結果を集計し、追加アルゴリズムを適用して、最終出力を発生させる。
- Map Reduceには、Map および Reduce プログラムを自動的に生成する Hive など、複数のフレームワークが用意される。

##### Apache Spark
- Spark は、ビッグデータワークロードの処理に役立つクラスターフレームワークおよびプログラミングモデル。
- Hadoopと同様に MapReduce、SparkはOSSの分散処理システムですが、実行計画には有向非循環グラフを使用し、データセットにはメモリ内キャッシュを使用する。
- Spark を EMR で実行すると、EMRFS を使用して S3 内のデータに直接アクセスできる。Spark では、SparkSQL などの複数のインタラクティブクエリモジュールがサポートされる。

#### アプリケーションとプログラム
- EMR では、Hive、Pig、Spark Streaming ライブラリなどの多くのアプリケーションがサポートされ、高レベルな言語を使用したワークロード処理の作成、機械学習アルゴリズムの利用、ストリーミング処理アプリケーションの作成、データウェアハウスの構築などの機能が提供されている。加えて、EMR では、YARN を使用する代わりに独自のクラスター管理機能を持つオープンソースプロジェクトもサポートされます。
- さまざまなライブラリと言語を使用して、EMR で実行したアプリケーションを操作します。たとえば、Java、Hive、または Pig を Spark と、 MapReduce または Spark ストリーミング、Spark SQL、MLLib、および GraphX と Spark で使用できる。


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

https://aws.amazon.com/jp/emr/features/?nc=sn&loc=2&dn=1

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-plan-vpc-subnet.html

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-plan-ec2-instances.html

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

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

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

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-manage-cloudwatch-events.html

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

https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/UsingEMR_s3distcp.html

https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-mxnet.html

https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/UseCase_CustomJar.html

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-connect-master-node.html

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

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

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-work-with-steps.html

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

https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-spark.html

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-master-core-task-nodes.html