

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EMR の Jupyter Notebook
<a name="emr-jupyter"></a>

[Jupyter ノートブック](https://jupyter.org/)はオープンソースのウェブアプリケーションで、ライブコード、方程式、視覚化、音声テキストを含むドキュメントの作成や共有に使用することができます。Amazon EMR には、Jupyter Notebook を使用する 3 つのオプションがあります。

**Topics**
+ [EMR Studio](emr-studio-jupyter.md)
+ [EMR ノートブック](emr-jupyter-emr-managed-notebooks.md)
+ [JupyterHub](emr-jupyterhub.md)

# EMR Studio
<a name="emr-studio-jupyter"></a>

Amazon EMR Studio は、Amazon EMR クラスターで実行される、フルマネージド型の [Jupyter Notebook](https://jupyter.org/) 用のウェブベースの統合開発環境 (IDE) です。チームが R、Python、Scala、および PySpark で記述されたアプリケーションの開発、視覚化、およびデバッグを行うために EMR Studio をセットアップできます。

Amazon EMR で Jupyter Notebook を使用する場合は、EMR Studio を使用することをお勧めします。詳細については、「Amazon EMR 管理ガイド」の「[EMR Studio](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio.html)」を参照してください。

# Jupyter ノートブックに基づく Amazon EMR Notebooks
<a name="emr-jupyter-emr-managed-notebooks"></a>

EMR Notebooks は Amazon EMR コンソールに組み込まれた [Jupyter Notebook](https://jupyter.org/) 環境です。これを使用して、Jupyter Notebooks を素早く作成し、それらを Spark クラスターにアタッチして、コンソールで Jupyter Notebook エディタを開き、クエリやコードをリモートで実行できます。EMR Notebooks はクラスターとは別個に Amazon S3 に保存されるため、耐久性の高いストレージ、迅速なアクセス、柔軟性が確保されます。複数のノートブックを開き、1 つのクラスターに複数のノートブックをアタッチし、異なるクラスターでノートブックを再利用できます。

詳細については、「*Amazon EMR 管理ガイド*」の「[EMR notebooks](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-managed-notebooks.html)」を参照してください。

# JupyterHub
<a name="emr-jupyterhub"></a>

[Jupyter Notebook ](https://jupyter.org/)はオープンソースのウェブアプリケーションで、ライブコード、方程式、視覚化、音声テキストを含むドキュメントの作成や共有に使用することができます。[JupyterHub](https://jupyterhub.readthedocs.io/en/latest/) を使うと、シングルユーザーモードの Jupyter Notebook サーバーの複数のインスタンスをホストできます。JupyterHub を使用してクラスターを作成すると、Amazon EMR がクラスターのマスターノードで Docker コンテナを作成します。Jupyter に必要なすべてのコンポーネントの JupyterHub と [Sparkmagic](https://github.com/jupyter-incubator/sparkmagic/blob/master/README.md) はコンテナ内で実行されます。

Sparkmagic は Jupyter Notebook が Amazon EMR で実行されている [Apache Spark](https://aws.amazon.com/big-data/what-is-spark/) (Spark の REST サーバーである [Apache Livy](emr-livy.md) を使用) と連携できるようにするカーネルのライブラリです。Spark と Apache Livy は JupyterHub を使用してクラスターを作成する時に自動的にインストールされます。Sparkmagic で使用可能な PySpark 3、PySpark、Spark カーネルと同様に、Jupyter のデフォルトの Python 3 カーネルを利用することができます。こうしたカーネルを使用して臨時の Spark コードや、Python、Scala を使ったインタラクティブな SQL クエリを実行できます。Docker コンテナ内で追加のカーネルを手動で追加することもできます。詳細については、「[追加のカーネルとライブラリをインストールする](emr-jupyterhub-install-kernels-libs.md)」を参照してください。

次の図は、Amazon EMR の JupyterHub のコンポーネントと対応するノートブックユーザーと管理者の認証方法を示しています。詳細については、「[Jupyter Notebook のユーザーと管理者を追加する](emr-jupyterhub-user-access.md)」を参照してください。

![\[JupyterHub architecture on EMR showing user authentication and component interactions.\]](http://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/images/jupyter-arch.png)


次の表は、Amazon EMR 7.x シリーズの最新リリースに含まれている JupyterHub のバージョンと、Amazon EMR で JupyterHub と共にインストールされるコンポーネントを示しています。

このリリースで JupyterHub と共にインストールされるコンポーネントのバージョンについては、[「リリース 7.12.0 コンポーネントバージョン](emr-7120-release.md)」を参照してください。


**emr-7.12.0 の JupyterHub バージョン情報**  

| Amazon EMR リリースラベル | JupyterHub バージョン | JupyterHub と共にインストールされるコンポーネント | 
| --- | --- | --- | 
| emr-7.12.0 | JupyterHub 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-hdfs-zkfc, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 

次の表は、Amazon EMR 6.x シリーズの最新リリースに含まれている JupyterHub のバージョンと、Amazon EMR で JupyterHub と共にインストールされるコンポーネントを示しています。

このリリースで JupyterHub と共にインストールされるコンポーネントのバージョンについては、「[リリース 6.15.0 コンポーネントバージョン](emr-6150-release.md)」を参照してください。


**emr-6.15.0 の JupyterHub バージョン情報**  

| Amazon EMR リリースラベル | JupyterHub バージョン | JupyterHub と共にインストールされるコンポーネント | 
| --- | --- | --- | 
| emr-6.15.0 | JupyterHub 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 

次の表は、Amazon EMR 5.x シリーズの最新リリースに含まれている JupyterHub のバージョンと、Amazon EMR で JupyterHub と共にインストールされるコンポーネントを示しています。

このリリースで JupyterHub と共にインストールされるコンポーネントのバージョンについては、「[Release 5.36.2 Component Versions](emr-5362-release.md)」を参照してください。


**emr-5.36.2 の JupyterHub バージョン情報**  

| Amazon EMR リリースラベル | JupyterHub バージョン | JupyterHub と共にインストールされるコンポーネント | 
| --- | --- | --- | 
| emr-5.36.2 | JupyterHub 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 

Amazon EMR で JupyterHub に含まれている Python 3 カーネルは 3.6.4 です。

`jupyterhub` コンテナ内にインストールされているライブラリは Amazon EMR リリースバージョンと Amazon EC2 AMI バージョンで異なる場合があります。

**`conda` を使用してインストール済みのライブラリをリストにする**
+ マスターノードのコマンドラインで次のコマンドを実行します。

  ```
  sudo docker exec jupyterhub bash -c "conda list"
  ```

**`pip` を使用してインストール済みのライブラリをリストにする**
+ マスターノードのコマンドラインで次のコマンドを実行します。

  ```
  sudo docker exec jupyterhub bash -c "pip freeze"
  ```

**Topics**
+ [JupyterHub でクラスターを作成する](emr-jupyterhub-launch.md)
+ [Amazon EMR で JupyterHub を使用する場合の考慮事項](emr-jupyterhub-considerations.md)
+ [JupyterHub の設定](emr-jupyterhub-configure.md)
+ [Amazon S3 でノートブックの永続性を設定するには](emr-jupyterhub-s3.md)
+ [マスターノードとノートブックサーバーに接続する](emr-jupyterhub-connect.md)
+ [JupyterHub の設定と管理](emr-jupyterhub-administer.md)
+ [Jupyter Notebook のユーザーと管理者を追加する](emr-jupyterhub-user-access.md)
+ [追加のカーネルとライブラリをインストールする](emr-jupyterhub-install-kernels-libs.md)
+ [JupyterHub リリース履歴](JupyterHub-release-history.md)

# JupyterHub でクラスターを作成する
<a name="emr-jupyterhub-launch"></a>

JupyterHub を使用して Amazon EMR クラスターを作成するには AWS マネジメントコンソール、、 AWS Command Line Interface、または Amazon EMR API を使用します。ステップ完了後に自動終了するオプションでクラスターを作成していないことを確認します ( AWS CLIの `--auto-terminate` オプション)。また、管理者とノートブックユーザーがクラスターの作成時に使用するキーペアにアクセスできることを確認します。詳細は、「*Amazon EMR 管理ガイド*」の「[SSH 認証情報にキーペアを使用する](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-access-ssh.html)」を参照してください。

## コンソールを使用して JupyterHub を含むクラスターを作成する
<a name="emr-jupyterhub-launch-console"></a>

以下の手順に従って、Amazon EMR コンソールで **[Advanced Options]** (詳細オプション) を使用し、JupyterHub を含むクラスターを作成します。

**Amazon EMR コンソールを使用して、JupyterHub をインストールした Amazon EMR クラスターを作成するには**

1. 新しい Amazon EMR コンソールに移動し、サイドナビゲーションから **[古いコンソールに切り替え]** を選択します。古いコンソールに切り替えたときの動作の詳細については、「[Using the old console](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)」を参照してください。

1. [**Create cluster (クラスターの作成)**]、[**Go to advanced options (詳細オプションに移動する)**] の順に選択します。

1. [**Software Configuration (ソフトウェア設定)**] で次を実行します。
   + **[リリース]** では emr-5.36.2 を選択し、[JupyterHub] を選択します。
   + Spark を使用する場合、Spark SQL のメタストアとして AWS Glue データカタログを使用するには、「Use **for Spark table metadata**」を選択します。詳細については、「[Amazon EMR AWS で Spark で Glue データカタログカタログを使用する](emr-spark-glue.md)」を参照してください。
   + [**Edit software settings (ソフトウェア設定の編集)**] には [**Enter configuration (設定の入力)**] を選択し、値を指定するか [**Load JSON from S3 (S3 からの JSON のロード)**] を選び JSON 設定ファイルを指定します。詳細については、「[JupyterHub の設定](emr-jupyterhub-configure.md)」を参照してください。

1. クラスターを作成した時点で [**Add steps (optional) (ステップの追加 (オプション))**] で実行するステップを設定する場合は、[**Auto-terminate cluster after the last step is completed (最後のステップが完了したらクラスターを自動終了する)**] を選択せずに、[**Next (次へ)**] を選びます。

1. [**Hardware Configuration (ハードウェア構成)**] オプション、[**Next (次へ)**] の順に選択します。詳細については、「*Amazon EMR 管理ガイド*」の「[クラスターハードウェアとネットワークを構成する](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-instances.html)」を参照してください。

1. [**General Cluster Settings (クラスターの全般設定)**] オプションを選択し [**Next (次へ)**] を選びます。

1. [**Security Options (セキュリティオプション)**] でキーペアを指定し、[**Create Cluster (クラスターの作成)**] を選択します。

## を使用して JupyterHub でクラスターを作成する AWS CLI
<a name="emr-jupyterhub-launch-cli"></a>

JupyterHub を含むクラスターを起動するには、`aws emr create-cluster` コマンドを使用し、`--applications` オプションに `Name=JupyterHub` を指定します。次の例は Amazon EMR で 2 つの EC2 インスタンス (マスターインスタンスとコアインスタンス) を使用する JupyterHub クラスターを起動します。デバッグも有効になっています。`--log-uri` が指定する Amazon S3 ロケーションにログが保存されています。指定されたキーペアはクラスター内の Amazon EC2 インスタンスへのアクセスを提供します。

**注記**  
読みやすくするために、Linux 行連続文字 (\$1) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

```
aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \
--applications Name=JupyterHub --log-uri s3://amzn-s3-demo-bucket/MyJupyterClusterLogs \
--use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair
```

# Amazon EMR で JupyterHub を使用する場合の考慮事項
<a name="emr-jupyterhub-considerations"></a>

Amazon EMR で JupyterHub を使用するときは、以下について検討します。
+ 
**警告**  
ユーザーノートブックとファイルはマスターノードのファイルシステムに保存されています。これはクラスター終了で保持されないエフェメラルストレージです。クラスターが終了すると、バックアップされていないデータは失われます。`cron` ジョブまたは別のアプリケーションに適したものを使用して、定期的にバックアップを行うことを推奨します。  
また、コンテナ内で行った設定変更はコンテナの再起動時に保持されない場合があります。カスタマイズをより再現しやすくするため、スクリプトを使用するかコンテナ設定の自動化を推奨します。
+ Amazon EMR セキュリティ設定を使用してセットアップした Kerberos 認証はサポートされていません。
+ [OAuthenticator](https://github.com/jupyterhub/oauthenticator) はサポートされていません。

# JupyterHub の設定
<a name="emr-jupyterhub-configure"></a>

また、クラスターマスターノードに接続し設定ファイルを編集することで、Amazon EMR の JupyterHub や各ユーザーノートブックの設定をカスタマイズすることができます。値を変更したら `jupyterhub` コンテナを再起動します。

次のファイルのプロパティを変更して、JupyterHub と各 Jupyter Notebook を設定します。
+ `jupyterhub_config.py` - デフォルトでは、このファイルはマスターノードの `/etc/jupyter/conf/` ディレクトリに保存されています。詳細については、JupyterHub ドキュメントの「[Configuration Basics](http://jupyterhub.readthedocs.io/en/latest/getting-started/config-basics.html)」を参照してください。
+ `jupyter_notebook_config.py` - このファイルは、デフォルトで `/etc/jupyter/` ディレクトリに保存され、デフォルトとして `jupyterhub` コンテナにコピーされます。詳細については、Jupyter Notebook のドキュメントで「[Config file and command line options](https://jupyter-notebook.readthedocs.io/en/5.7.4/config.html)」を参照してください。

`jupyter-sparkmagic-conf` 設定分類を使用して Sparkmagic をカスタマイズすることもできます。これにより Sparkmagic の `config.json` ファイルの値が更新されます。使用可能な設定の詳細については GitHub の「[example\$1config.json](https://github.com/jupyter-incubator/sparkmagic/blob/master/sparkmagic/example_config.json)」を参照してください。Amazon EMR のアプリケーションで設定分類を使用する方法について詳しくは「[アプリケーションの設定](emr-configure-apps.md)」を参照してください。

次の例では、Sparkmagic 設定分類設定`MyJupyterConfig.json`の ファイルを参照して AWS CLI、 を使用してクラスターを起動します。

**注記**  
読みやすくするために、Linux 行連続文字 (\$1) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

```
aws emr create-cluster --use-default-roles --release-label emr-5.14.0 \
--applications Name=Jupyter --instance-type m4.xlarge --instance-count 3 \
--ec2-attributes KeyName=MyKey,SubnetId=subnet-1234a5b6 --configurations file://MyJupyterConfig.json
```

`MyJupyterConfig.json` のサンプルコンテンツは次のようになります。

```
[
    {
    "Classification":"jupyter-sparkmagic-conf",
    "Properties": {
      "kernel_python_credentials" : "{\"username\":\"diego\",\"base64_password\":\"mypass\",\"url\":\"http:\/\/localhost:8998\",\"auth\":\"None\"}"
      }
    }
]
```

**注記**  
Amazon EMR バージョン 5.21.0 以降では、実行中のクラスター内のインスタンスグループごとに、クラスター設定を上書きして追加の設定分類を指定できます。これを行うには、Amazon EMR コンソール、 AWS Command Line Interface (AWS CLI)、または AWS SDK を使用します。詳細については、「[実行中のクラスター内のインスタンスグループの設定を指定する](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html)」を参照してください。

# Amazon S3 でノートブックの永続性を設定するには
<a name="emr-jupyterhub-s3"></a>

Amazon EMR で JupyterHub クラスターを設定して、ユーザーが保存したノートブックが Amazon S3 (クラスター EC2 インスタンスのエフェメラルストレージの外) に残るようにします。

クラスターの作成時に、`jupyter-s3-conf` 設定分類を使用して Amazon S3 の永続性を指定します。詳細については、「[アプリケーションの設定](emr-configure-apps.md)」を参照してください。

`s3.persistence.enabled` プロパティを使用して Amazon S3 の永続性を有効にすることに加えて、`s3.persistence.bucket` プロパティを使用してノートブックが保存される Amazon S3 でバケットを指定します。各ユーザーのノートブックは、指定したバケットの `jupyter/jupyterhub-user-name` フォルダに保存されます。バケットは Amazon S3 に存在している必要があります。また、クラスターの作成時に指定した EC2 インスタンスプロファイルのロールには、バケットへのアクセス権限が必要です (デフォルトでは、ロールは `EMR_EC2_DefaultRole` です)。詳細については、[AWS 「サービスへの Amazon EMR アクセス許可の IAM ロールを設定する](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-roles.html)」を参照してください。

同じ設定分類プロパティを使用して新しいクラスターを起動するとき、ユーザーは保存した場所からの内容を含むノートブックを開くことができます。

Amazon S3 を有効にした状態でノートブックでモジュールとしてファイルをインポートすると、ファイルは Amazon S3 にアップロードされます。Amazon S3 の永続性を有効にせずにファイルをインポートすると、ファイルは JupyterHub コンテナにアップロードされます。

次の例では、Amazon S3 の永続性を有効にします。ユーザーが保存したノートブックは、各ユーザーの `s3://MyJupyterBackups/jupyter/jupyterhub-user-name` フォルダに保存されます。`jupyterhub-user-name` は `diego` などのユーザー名です。

```
[
    {
        "Classification": "jupyter-s3-conf",
        "Properties": {
            "s3.persistence.enabled": "true",
            "s3.persistence.bucket": "MyJupyterBackups"
        }
    }
]
```

# マスターノードとノートブックサーバーに接続する
<a name="emr-jupyterhub-connect"></a>

JupyterHub の管理者やノートブックユーザーは SSH トンネルを使用してクラスターマスターノードに接続する必要があります。その後、マスターノードの JupyterHub によるウェブインターフェイスに接続します。SSH トンネルの設定やウェブ接続をプロキシするためにトンネルを使用する場合の詳細については、「*Amazon EMR 管理ガイド*」の「[クラスターに接続する](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node.html)」を参照してください。

デフォルトでは、Amazon EMR の JupyterHub はマスターノードの**ポート 9443** で利用できます。JupyterHub の内部プロキシはポート 9443 を使用してノートブックインスタンスも提供します。次のパターンを使用する URL で JupyterHub と Jupyter ウェブインターフェイスにアクセスできます。

**https://***MasterNodeDNS***:9443**

`c.JupyterHub.port` プロパティ (`jupyterhub_config.py` ファイル) を使用して別のポートを指定することができます。詳細については、JupyterHub ドキュメントの「[Networking Basics](http://jupyterhub.readthedocs.io/en/latest/getting-started/networking-basics.html)」を参照してください。

デフォルトでは、Amazon EMR の JupyterHub は HTTPS を使用する SSL 暗号化の自己署名証明書を使います。接続が完了すると、自己署名証明書を信頼することを確認するメッセージが表示されます。ご自分の信頼済みの証明書とキーを使用できます。デフォルトの証明書ファイル、`server.crt`、キーファイル `server.key` をマスターノードの `/etc/jupyter/conf/` ディレクトリでご自分の証明書とキーファイルに置き換えます。`c.JupyterHub.ssl_key` と `c.JupyterHub.ssl_cert` プロパティ (`jupyterhub_config.py` ファイル) を使用して SSL マテリアルを指定します。詳細については、JupyterHub ドキュメントの「[Security Settings](https://jupyterhub.readthedocs.io/en/latest/tutorial/getting-started/security-basics.html)」を参照してください。`jupyterhub_config.py` を更新したら、コンテナを再起動します。

# JupyterHub の設定と管理
<a name="emr-jupyterhub-administer"></a>

JupyterHub と Docker コンテナ内で実行される関連のコンポーネント (`jupyterhub`) は Ubuntu オペレーティングシステムを使用します。コンテナ内で実行するコンポーネントを管理する方法はいくつかあります。

**警告**  
コンテナ内で行うカスタマイズはコンテナの再起動時に保持されない場合があります。カスタマイズをより再現しやすくするため、スクリプトを使用するかコンテナ設定の自動化を推奨します。

## コマンドラインを使用して管理する
<a name="emr-jupyterhub-administer-cli"></a>

SSH を使用してマスターノードに接続する場合は、Docker コマンドラインインターフェイス (CLI) を使用してコマンドを実行できます。その場合はコンテナを名前または ID で指定します (`jupyterhub`)。たとえば、`sudo docker exec jupyterhub command` はオペレーティングシステムまたはコンテナ内で実行されるアプリケーションが認識するコマンドを実行します。このメソッドを使用し、オペレーティングシステムにユーザーを追加して Docker コンテナ内に追加アプリケーションやライブラリをインストールすることができます。たとえば、デフォルトのコンテナイメージにはパッケージのインストールの Conda が含まれているので、マスターノードラインで次のコマンドを実行し、コンテナ内でアプリケーション、Keras をインストールすることができます。

```
sudo docker exec jupyterhub conda install keras
```

## ステップを送信して管理する
<a name="emr-jupyterhub-administer-steps"></a>

ステップはクラスターに作業を送信する方法です。クラスターを起動するときにステップを送信、または実行中のクラスターにステップを送信することができます。`command-runner.jar` を使用し、コマンドラインで実行するコマンドをステップとして送信できます。詳細については「*Amazon EMR 管理ガイド*」の「[CLI およびコンソールを使用した手順の作業](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html)」と「[Amazon EMR クラスターでのコマンドとスクリプトの実行](emr-commandrunner.md)」を参照してください。

たとえば、ローカルコンピュータで次の AWS CLI コマンドを使用して、前の例のマスターノードのコマンドラインから行ったのと同じ方法で Keras をインストールできます。

```
aws emr add-steps --cluster-id MyClusterID --steps Name="Command Runner",Jar="command-runner.jar",Args="/usr/bin/sudo","/usr/bin/docker","exec","jupyterhub","conda","install","keras"
```

一連のステップをスクリプトにし、そのスクリプトを Amazon S3 にアップロードすると、クラスターの作成時またはステップとしてスクリプトを追加する場合に `script-runner.jar` を使用してスクリプトを実行できます。詳細については、「[Amazon EMR クラスターでのコマンドとスクリプトの実行](emr-commandrunner.md)」を参照してください。例については、[例: Bash スクリプトで複数のユーザーを追加する](emr-jupyterhub-pam-users.md#emr-jupyterhub-script-multuser)を参照してください。

## REST API を使用して管理する
<a name="emr-jupyterhub-administer-rest"></a>

Jupyter、JupyterHub、JupyterHub の HTTP プロキシはリクエスト送信に使用できる REST API を提供します。JupyterHub にリクエストを送信するには、リクエストを含む API トークンを渡す必要があります。マスターノードのコマンドラインから `curl` コマンドを使用して、REST コマンドを実行できます。詳細については、以下のリソースを参照してください。
+ JupyterHub のドキュメント「[Using JupyterHub's REST API](http://jupyterhub.readthedocs.io/en/latest/reference/rest.html)」(API トークンを生成する方法も記載されています)
+ GitHub の [Jupyter Notebook Server API](https://github.com/jupyter/jupyter/wiki/Jupyter-Notebook-Server-API)
+ GitHub の [configurable-http-proxy](https://github.com/jupyterhub/configurable-http-proxy)

次の例では REST API を使用して JupyterHub がユーザーリストを取得する方法を示しています。コマンドは以前生成された admin トークンを渡し、JupyterHub にデフォルトのポート 9443 を使用して出力を [jq](https://stedolan.github.io/jq/) にパイピングすることで見やすくします。

```
curl -XGET -s -k https://$HOST:9443/hub/api/users \
-H "Authorization: token $admin_token" | jq .
```

# Jupyter Notebook のユーザーと管理者を追加する
<a name="emr-jupyterhub-user-access"></a>

ユーザーがノートブックを作成し、オプションで JupyterHub を管理できるように、JupyterHub でユーザーを認証させる方法 2 つのうち 1 つを使用することができます。JupyterHub の Pluggable Authentication Module (PAM) を使用するのがもっとも簡単な方法です。また、Amazon EMR の JupyterHub は Microsoft Active Directory サーバーのような LDAP サーバーからユーザー ID を取得するため、[LDAP authenticator plugin for JupyterHub](https://github.com/jupyterhub/ldapauthenticator/) をサポートしています。各認証方法でユーザーを追加する場合の手順や例については、こちらのセクションをご覧ください。

Amazon EMR の JupyterHub には管理者の権限を持つデフォルトユーザーが設定されています。ユーザー名は `jovyan` でパスワードは `jupyter` です。このユーザーを管理者の権限を持つ別のユーザーに置き換えることを強く推奨します。これを行うには、クラスターの作成時にステップを使用するか、クラスターの実行中にマスターノードに接続します。

**Topics**
+ [PAM 認証の使用](emr-jupyterhub-pam-users.md)
+ [LDAP 認証の使用](emr-jupyterhub-ldap-users.md)
+ [ユーザー偽装](emr-jupyterhub-user-impersonation.md)

# PAM 認証の使用
<a name="emr-jupyterhub-pam-users"></a>

Amazon EMR の JupyterHub で PAM ユーザーを作成するのは 2 段階のプロセスです。最初のステップは、マスターノードで `jupyterhub` コンテナを実行しているオペレーティングシステムにユーザーを追加し、対応するユーザーのホームディレクトリに各ユーザーを追加することです。次のステップは、こうしたオペレーティングシステムのユーザーを JupyterHub ユーザーとして追加することです。このプロセスは JupyterHub でホワイトリストと呼ばれています。JupyterHub ユーザーの追加が完了すると、ユーザーは JupyterHub URL に接続して、アクセスに必要なオペレーティングシステムの認証情報を提供することができます。

ユーザーがログインすると、JupyterHub はそのユーザー用にノートブックサーバーインスタンスを開きます。これはマスターノードのユーザーのホームディレクトリ (`/var/lib/jupyter/home/username`) に保存されています。ノートブックサーバーインスタンスがない場合は、ユーザーのホームディレクトリで JupyterHub がノートブックインスタンスを生成します。次のセクションは、各ユーザーをオペレーティングシステムと JupyterHub に追加する方法や、複数のユーザーを追加する基本的な bash スクリプトを示しています。

## コンテナにオペレーティングシステムユーザーを追加する
<a name="emr-jupyterhub-system-user"></a>

次の例は、最初にコンテナ内の [useradd](https://linux.die.net/man/8/useradd) コマンドを使用して 1 人のユーザー (diego) を追加してから、そのユーザー用のホームディレクトリを作成します。2 番目のコマンドは [chpasswd](https://linux.die.net/man/8/chpasswd) を使用して、このユーザーに diego のパスワードを確立します。SSH で接続中にマスターノードコマンドラインでコマンドが実行されます。[ステップを送信して管理する](emr-jupyterhub-administer.md#emr-jupyterhub-administer-steps)で説明されているように、ステップを使用してこうしたコマンドを実行することもできます。

```
sudo docker exec jupyterhub useradd -m -s /bin/bash -N diego
sudo docker exec jupyterhub bash -c "echo diego:diego | chpasswd"
```

## JupyterHub ユーザーを追加する
<a name="emr-jupyterhub-jupyterhub-user"></a>

JupyterHub の [**Admin (管理者)**] パネルを使用するか、REST API を使用してユーザーと管理者 (またはユーザーのみ) を追加できます。

**JupyterHub の [Admin] パネルを使用してユーザーと管理者を追加する**

1. SSH を使用してマスターノードに接続し、管理者の権限を持つ ID で https://*MasterNodeDNS*:9443 にログインします。

1. [**Control Panel (コントロールパネル)**]、[**Admin (管理者)**] の順に選択します。

1. [**User (ユーザー)**] を選択し、[**Add Users (ユーザーの追加)**] または [**Admin (管理者)**]、[**Add Admins (管理者の追加)**] を選択します。

**REST API を使用してユーザーを追加する**

1. SSH を使用してマスターノードに接続し、次のコマンドをマスターノードで使用するか、コマンドをステップとして実行します。

1. 管理者トークンを取得して API リクエストを行い、次のステップで *AdminToken* をそのトークンと置き換えます。

1. 次のコマンドを使用して *UserName* をコンテナ内で作成したオペレーティングシステムユーザーと置き換えます。

   ```
   curl -XPOST -H "Authorization: token AdminToken" "https://$(hostname):9443/hub/api/users/UserName
   ```

**注記**  
JupyterHub ウェブインターフェイスに初めてログインすると、JupyterHub の非管理者ユーザーとして自動的に追加されます。

## 例: Bash スクリプトで複数のユーザーを追加する
<a name="emr-jupyterhub-script-multuser"></a>

次のサンプル bash スクリプトは、複数の JupyterHub ユーザーを作成するために行ったステップを関連付けます。スクリプトは直接マスターノードで実行したり、Amazon S3 にアップロードしてステップとして実行することができます。

スクリプトは最初にユーザー名の配列を確立し、`jupyterhub token` コマンドを使用してデフォルトの管理者 (jovyan) に API トークンを作成します。そうすると、`jupyterhub` コンテナにオペレーティングシステムユーザーを作成し、ユーザー名に対応する初期パスワードを割り当てます。最後に、REST API オペレーションを呼び出して JupyterHub で各ユーザーを作成します。以前スクリプトで生成したトークンを渡し、REST レスポンスを `jq` にパイプして見やすくします。

```
# Bulk add users to container and JupyterHub with temp password of username
set -x
USERS=(shirley diego ana richard li john mary anaya)
TOKEN=$(sudo docker exec jupyterhub /opt/conda/bin/jupyterhub token jovyan | tail -1)
for i in "${USERS[@]}"; 
do 
   sudo docker exec jupyterhub useradd -m -s /bin/bash -N $i
   sudo docker exec jupyterhub bash -c "echo $i:$i | chpasswd"
   curl -XPOST --silent -k https://$(hostname):9443/hub/api/users/$i \
 -H "Authorization: token $TOKEN" | jq
done
```

`s3://amzn-s3-demo-bucket/createjupyterusers.sh` のような Amazon S3 の場所にスクリプトを保存します。ステップとして実行するために `script-runner.jar` を使えるようになります。

### 例: クラスターの作成時にスクリプトを実行する (AWS CLI)
<a name="emr-jupyterhub-multuser-createcluster"></a>

**注記**  
読みやすくするために、Linux 行連続文字 (\$1) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

```
aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \
--applications Name=JupyterHub --log-uri s3://amzn-s3-demo-bucket/MyJupyterClusterLogs \
--use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair \
--steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/createjupyterusers.sh"]
```

### 既存のクラスターでスクリプトを実行する (AWS CLI)
<a name="emr-jupyterhub-multuser-runningcluster"></a>

**注記**  
読みやすくするために、Linux 行連続文字 (\$1) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

```
aws emr add-steps --cluster-id j-XXXXXXXX --steps Type=CUSTOM_JAR,\
Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/createjupyterusers.sh"]
```

# LDAP 認証の使用
<a name="emr-jupyterhub-ldap-users"></a>

Lightweight Directory Access Protocol (LDAP) は、Active Directory または OpenLDAP サーバーのような LDAPとの互換性があるディレクトリサーバープロバイダーで保存されているユーザーやコンピュータなどのリソースに対応するオブジェクトのクエリや変更を行うアプリケーションプロトコルです。Amazon EMR の JupyterHub と [JupyterHub の LDAP 認証プラグイン](https://github.com/jupyterhub/ldapauthenticator/)を使用して、ユーザー認証に LDAP を使うことができます。プラグインは LDAP ユーザーのログインセッションを処理し、Jupyter にユーザー情報を提供します。これにより、ユーザーは LDAP と互換性のあるサーバーに保存している ID の認証情報を使用して JupyterHub とノートブックに接続できるようになります。

このセクションのステップは、JupyterHub の LDAP 認証プラグインを使用して LDAP をセットアップし有効にするための手順を示しています。このステップはマスターノードのコマンドラインに接続している状態で実行します。詳細については、「[マスターノードとノートブックサーバーに接続する](emr-jupyterhub-connect.md)」を参照してください。

1. ホスト IP アドレス、ポート、バインディング名など、LDAP サーバーに関する情報を使用して LDAP 設定ファイルを作成します。

1. `/etc/jupyter/conf/jupyterhub_config.py` を変更して、JupyterHub の LDAP 認証プラグインを有効にします。

1. `jupyterhub` コンテナ内で LDAP を設定するスクリプトを作成して実行します。

1. ユーザー用に LDAP をクエリしてから、各ユーザーのコンテナ内でホームディレクトリを作成します。ノートブックをホストするため、JupyterHub にはホームディレクトリが必要です。

1. JupyterHub を再開するスクリプトを実行する

**重要**  
LDAPを設定する前に、LDAP サーバーとクラスターマスターノードが必要に応じて通信できることを確認するため、ネットワークインフラストラクチャをテストしてください。TLS は通常、単純な TCP 接続でポート 389 を使用します。LDAP 接続が SSL を使用する場合の一般的な SSL の TCP ポートは 636 です。

## LDAP 設定ファイルを作成する
<a name="emr-jupyterhub-ldap-config"></a>

以下の例では、次のプレースホルダー設定の値を使用します。これらの値を実装と一致するパラメータに置き換えます。
+ LDAP サーバーはバージョン 3 を実行していて、ポート 389 で使用可能になっています。これは標準的な LDAP の非 SSL ポートです。
+ ベース識別子名 (DN) は `dc=example, dc=org` です。

テキストエディタを使用して、次のようなコンテンツを含む [ldap.conf](http://manpages.ubuntu.com/manpages/bionic/man5/ldap.conf.5.html) ファイルを作成します。LDAP 実装に適切な値を使用します。*host* を IP アドレスまたは LDAP サーバーの解決可能なホスト名に置き換えます。

```
base dc=example,dc=org
uri ldap://host
ldap_version 3
binddn cn=admin,dc=example,dc=org
bindpw admin
```

## JupyterHub の LDAP 認証プラグインを有効にする
<a name="emr-jupyterhub-ldap-plugin"></a>

テキストエディタを使用して `/etc/jupyter/conf/jupyterhub_config.py` ファイルを変更し、次のような [ldapauthenticator](https://github.com/jupyterhub/ldapauthenticator) プロパティを追加します。*host* を IP アドレスまたは LDAP サーバーの解決可能なホスト名に置き換えます。この例では、ユーザーオブジェクトが *people* という組織単位 (ou) にあり、先に `ldap.conf` を使って確立した識別名のコンポーネントを使用しているものとします。

```
c.JupyterHub.authenticator_class = 'ldapauthenticator.LDAPAuthenticator'
c.LDAPAuthenticator.use_ssl = False
c.LDAPAuthenticator.server_address = 'host' 
c.LDAPAuthenticator.bind_dn_template = 'cn={username},ou=people,dc=example,dc=org'
```

## コンテナ内で LDAP を設定する
<a name="emr-jupyterhub-ldap-container"></a>

テキストエディタを使用して、次のコンテンツを含む bash スクリプトを作成します。

```
#!/bin/bash

# Uncomment the following lines to install LDAP client libraries only if
# using Amazon EMR release version 5.14.0. Later versions install libraries by default.
# sudo docker exec jupyterhub bash -c "sudo apt-get update"
# sudo docker exec jupyterhub bash -c "sudo apt-get -y install libnss-ldap libpam-ldap ldap-utils nscd"
 
# Copy ldap.conf
sudo docker cp ldap.conf jupyterhub:/etc/ldap/
sudo docker exec jupyterhub bash -c "cat /etc/ldap/ldap.conf"
 
# configure nss switch
sudo docker exec jupyterhub bash -c "sed -i 's/\(^passwd.*\)/\1 ldap/g' /etc/nsswitch.conf"
sudo docker exec jupyterhub bash -c "sed -i 's/\(^group.*\)/\1 ldap/g' /etc/nsswitch.conf"
sudo docker exec jupyterhub bash -c "sed -i 's/\(^shadow.*\)/\1 ldap/g' /etc/nsswitch.conf"
sudo docker exec jupyterhub bash -c "cat /etc/nsswitch.conf"
 
# configure PAM to create home directories
sudo docker exec jupyterhub bash -c "echo 'session required        pam_mkhomedir.so skel=/etc/skel umask=077' >> /etc/pam.d/common-session"
sudo docker exec jupyterhub bash -c "cat /etc/pam.d/common-session"
 
# restart nscd service
sudo docker exec jupyterhub bash -c "sudo service nscd restart"
 
# Test
sudo docker exec jupyterhub bash -c "getent passwd"

# Install ldap plugin
sudo docker exec jupyterhub bash -c "pip install jupyterhub-ldapauthenticator"
```

マスターノードにスクリプトを保存し、マスターノードのコマンドラインから実行します。たとえば、`configure_ldap_client.sh` として保存されているスクリプトでファイルを実行可能にします。

```
chmod +x configure_ldap_client.sh
```

スクリプトを実行します。

```
./configure_ldap_client.sh
```

## Active Directory に属性を追加する
<a name="emr-jupyterhub-ldap-adproperties"></a>

ユーザーを見つけ、データベースに適切なエントリを作成するため、JupyterHub docker コンテナでは、Active Directory の該当するユーザーオブジェクトに次の UNIX プロパティが必要です。詳細については、記事「[Clarification regarding the status of identity management for Unix (IDMU) and NIS server role in Windows Server 2016 technical preview and beyond](https://blogs.technet.microsoft.com/activedirectoryua/2016/02/09/identity-management-for-unix-idmu-is-deprecated-in-windows-server/)」(Windows Server 2016テクニカルプレビュー以降でのUnix（IDMU）およびNISサーバーの役割のID管理のステータスに関する説明）、のセクション「*How do I continue to edit the GID/UID RFC 2307 attributes now that the Unix Attributes Plug-in is no longer available for the Active Directory Users and Computers MMC snap-in?*」(Unix属性プラグインがActiveDirectoryユーザーとコンピューターMMCスナップインで使用できなくなった場合、GID / UID RFC 2307属性を編集し続けるにはどうすればよいですか？) を参照してください。
+ `homeDirectory`

  これは、ユーザーのホームディレクトリへの場所 (通常は `/home/username`) です。
+ `gidNumber`

  これは、別のユーザーがすでに使用していない 60000 より大きい値です。使用中の GID については、`etc/passwd` ファイルを確認してください。
+ `uidNumber`

  これは、別のグループがすでに使用していない 60000 より大きい値です。使用中の UID については、`etc/group` ファイルを確認してください。
+ `uid`

  これは *username* と同じです。

## ユーザーのホームディレクトリを作成する
<a name="emr-jupyterhub-ldap-directories"></a>

LDAP ユーザーを認証しインスタンスデータを保存するため、JupyterHub はコンテナ内のホームディレクトリを必要とします。次の例は LDAP ディレクトリの*shirley* と *diego* という 2 人のユーザーを示しています。

まず、次の例のように [ldapsearch](http://manpages.ubuntu.com/manpages/xenial/man1/ldapsearch.1.html) を使用して、各ユーザーの ID とグループ ID 情報に LDAP サーバーをクエリします。*host* は LDAP サーバーの IP アドレスまたは解決可能なホスト名に置き換わります。

```
ldapsearch -x -H ldap://host \
 -D "cn=admin,dc=example,dc=org" \
 -w admin \
 -b "ou=people,dc=example,dc=org" \
 -s sub \
 "(objectclass=*)" uidNumber gidNumber
```

`ldapsearch` コマンドが *shirley* と *diego* といった 2 人のユーザーに見られるような LDIF 形式のレスポンスを返します。

```
# extended LDIF

# LDAPv3
# base <ou=people,dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: uidNumber gidNumber sn 

# people, example.org
dn: ou=people,dc=example,dc=org

# diego, people, example.org
dn: cn=diego,ou=people,dc=example,dc=org
sn: B
uidNumber: 1001
gidNumber: 100

# shirley, people, example.org
dn: cn=shirley,ou=people,dc=example,dc=org
sn: A
uidNumber: 1002
gidNumber: 100

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3
```

レスポンスからの情報を使用し、コンテナ内のコマンドを実行して各ユーザーの共通名 (`cn`) にホームディレクトリを作成します。`uidNumber` と `gidNumber` を使用して、そのユーザーのホームディレクトリの所有権を修正します。その操作を次の例のコマンドがユーザーの *shirley* に行います。

```
sudo docker container exec jupyterhub bash -c "mkdir /home/shirley"
sudo docker container exec jupyterhub bash -c "chown -R $uidNumber /home/shirley"
sudo docker container exec jupyterhub bash -c "sudo chgrp -R $gidNumber /home/shirley"
```

**注記**  
JupyterHub の LDAP オーセンティケータでは、ローカルユーザーの作成がサポートされていません。詳細については、「[LDAP authenticator configuration note on local user creation](https://github.com/jupyterhub/ldapauthenticator#configuration-note-on-local-user-creation)」を参照してください。  
ローカルユーザーを手動で作成するには、次のコマンドを使用します。  

```
sudo docker exec jupyterhub bash -c "echo 'shirley:x:$uidNumber:$gidNumber::/home/shirley:/bin/bash' >> /etc/passwd"
```

## JupyterHub コンテナの再起動
<a name="emr-jupyterhub-ldap-restart"></a>

以下のコマンドを実行して、`jupyterhub` コンテナを再起動します。

```
sudo docker stop jupyterhub
sudo docker start jupyterhub
```

# ユーザー偽装
<a name="emr-jupyterhub-user-impersonation"></a>

Jupyter Notebook 内で実行されている Spark ジョブは、Amazon EMR での実行中に、複数のアプリケーションを走査します。たとえば、Jupyter 内でユーザーが実行する PySpark3 コードが、HTTP POST リクエストを使用してそのコードを Livy に送信する Sparkmagic によって受信されます。それにより、YARN を使用してクラスターで実行する Spark ジョブが作成されます。

デフォルトでは、このように送信された YARN ジョブは、ジョブを開始したユーザーとは関係なく、ユーザー `livy` として実行されます。*ユーザー偽装*を設定することで、ノートブックユーザーのユーザー ID を、YARN ジョブに関連付けられているユーザーとすることができます。各ユーザーによって開始されるジョブは、ユーザー `shirley` と関連付けられた `diego` と `livy` の両方によって開始するのではなく、それぞれ `shirley` および `diego` に関連付けられます。これにより、Jupyter の使用を監査し、組織内でアプリケーションを管理できます。

この設定がサポートされるのは、Sparkmagic から Livy への呼び出しが認証されていない場合のみです。Hadoop アプリケーションと Livy (Apache Knox Gateway など) 間で認証またはプロキシレイヤーを提供するアプリケーションはサポートされません。このセクションでユーザー偽装を設定するステップでは、JupyterHub と Livy が同じマスターノードで実行されていることを前提としています。アプリケーションに別々のクラスターがある場合、[ステップ 3: ユーザーの HDFS ホームディレクトリを作成する](#Step3-UserImpersonation) を変更し、HDFS ディレクトリが Livy マスターノードで作成されるようにする必要があります。

**Topics**
+ [ステップ 1: Livy を設定する](#Step1-UserImpersonation)
+ [ステップ 2: ユーザーを追加する](#Step2-UserImpersonation)
+ [ステップ 3: ユーザーの HDFS ホームディレクトリを作成する](#Step3-UserImpersonation)

## ステップ 1: Livy を設定する
<a name="Step1-UserImpersonation"></a>

次の例に示すように、クラスターを作成して Livy のユーザー偽装を有効にする場合は、`livy-conf` および `core-site` 設定分類を使用します。設定分類を JSON として保存し、クラスターの作成時にその分類を参照するか、インラインで指定します。詳細については、「[アプリケーションの設定](emr-configure-apps.md)」を参照してください。

```
[
  {
    "Classification": "livy-conf",
    "Properties": {
      "livy.impersonation.enabled": "true"
    }
  },
  {
    "Classification": "core-site",
    "Properties": {
      "hadoop.proxyuser.livy.groups": "*",
      "hadoop.proxyuser.livy.hosts": "*"
    }
  }
]
```

## ステップ 2: ユーザーを追加する
<a name="Step2-UserImpersonation"></a>

PAM または LDAP を使用して JupyterHub ユーザーを追加します。詳細については、「[PAM 認証の使用](emr-jupyterhub-pam-users.md)」および「[LDAP 認証の使用](emr-jupyterhub-ldap-users.md)」を参照してください。

## ステップ 3: ユーザーの HDFS ホームディレクトリを作成する
<a name="Step3-UserImpersonation"></a>

ユーザーを作成するため、マスターノードに接続しました。マスターノードに接続中に、次のコンテンツをコピーして、スクリプトファイルに保存します。スクリプトにより、マスターノードの各 JupyterHub ユーザーごとに、HDFS ホームディレクトリが作成されます。このスクリプトでは、デフォルトの管理者ユーザー ID *jovyan* を使用することが前提となっています。

```
#!/bin/bash

CURL="curl --silent -k"
HOST=$(curl -s http://169.254.169.254/latest/meta-data/local-hostname)

admin_token() {
    local user=jovyan
    local pwd=jupyter
    local token=$($CURL https://$HOST:9443/hub/api/authorizations/token \
        -d "{\"username\":\"$user\", \"password\":\"$pwd\"}" | jq ".token")
    if [[ $token != null ]]; then
        token=$(echo $token | sed 's/"//g')
    else
        echo "Unable to get Jupyter API Token."
        exit 1
    fi
    echo $token
}

# Get Jupyter Admin token
token=$(admin_token)

# Get list of Jupyter users
users=$(curl -XGET -s -k https://$HOST:9443/hub/api/users \
 -H "Authorization: token $token" | jq '.[].name' | sed 's/"//g')

# Create HDFS home dir 
for user in ${users[@]}; 
do
 echo "Create hdfs home dir for $user"
 hadoop fs -mkdir /user/$user
 hadoop fs -chmod 777 /user/$user
done
```

# 追加のカーネルとライブラリをインストールする
<a name="emr-jupyterhub-install-kernels-libs"></a>

Amazon EMR で JupyterHub を使用してクラスターを作成すると、Jupyter のデフォルト Python 3 カーネルが、PySpark、Spark カーネル (Sparkmagic 用) と共に Docker コンテナにインストールされます。追加のカーネルをインストールできます。追加のライブラリやパッケージをインストールしてから、適切なシェルにインポートすることもできます。

## カーネルをインストールする
<a name="emr-jupyterhub-install-kernels"></a>

カーネルは Docker コンテナ内にインストールされます。これを簡単に行うには、インストールコマンドを使用して bash スクリプトを作成し、マスターノードに保存してから `sudo docker exec jupyterhub script_name` コマンドで `jupyterhub` コンテナ内にあるスクリプトを実行します。次の例のスクリプトはカーネルをインストールし、マスターノードでカーネルのライブラリをいくつかインストールすることで、後から Jupyter を使用してライブラリをインポートできるようにします。

```
#!/bin/bash

# Install Python 2 kernel
conda create -n py27 python=2.7 anaconda
source /opt/conda/envs/py27/bin/activate
apt-get update
apt-get install -y gcc
/opt/conda/envs/py27/bin/python -m pip install --upgrade ipykernel
/opt/conda/envs/py27/bin/python -m ipykernel install

# Install libraries for Python 2
/opt/conda/envs/py27/bin/pip install paramiko nltk scipy numpy scikit-learn pandas
```

コンテナ内でカーネルとライブラリをインストールするにはマスターノードへの接続を開き、スクリプトを `/etc/jupyter/install_kernels.sh` に保存してマスターノードのコマンドラインで次のコマンドを実行します。

```
sudo docker exec jupyterhub bash /etc/jupyter/install_kernels.sh
```

## ライブラリの使用と追加ライブラリのインストール
<a name="emr-jupyterhub-install-libs"></a>

Python 3 の機械学習とデータサイエンスライブラリのコアセットは、Amazon EMR の JupyterHub にあらかじめインストールされています。`sudo docker exec jupyterhub bash -c "conda list" ` と `sudo docker exec jupyterhub bash -c "pip freeze"` を使用できます。

Spark ジョブがワーカーノードでライブラリを必要とする場合は、ブートストラップアクションを使用してクラスターの作成時にライブラリをインストールし、スクリプトを実行することを推奨します。ブートストラップアクションは、クラスターの作成時にすべてのクラスターノードで実行され、インストールプロセスが簡素化されます。クラスターを実行してから、コアまたはワーカーノードにライブラリをインストールするとオペレーションが複雑になります。このセクションの Python プログラムの例では、こうしたライブラリのインストール方法を示しています。

このセクションの例のブートストラップアクションと Python プログラムは、Amazon S3 に保存している bash スクリプトを使用してすべてのノードにライブラリをインストールします。

次の例で参照されているスクリプトは、`pip` を使用して paramiko、nltk、scipy、scikit-learn、pandas (Python 3 カーネル用) をインストールします。

```
#!/bin/bash

sudo python3 -m pip install boto3 paramiko nltk scipy scikit-learn pandas
```

スクリプトを作成したら、Amazon S3 の場所にアップロードします (例: `s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh`)。ブートストラップアクションまたは Python プログラムで使用できるようにするには、*Amazon Simple Storage Service User Guide* の[オブジェクトのUploading](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)で詳細を確認してください。

**を使用してクラスターを作成するときにすべてのノードにライブラリをインストールするブートストラップアクションを指定するには AWS CLI**

1. 前の例のようなスクリプトを作成し、Amazon S3 の場所に保存します。`s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh` の例を使用します。

1. JupyterHub でクラスターを作成し、`Path` の引数 (`--bootstrap-actions` オプション) を使用して、次の例で表示されているようにスクリプトの場所を指定します。
**注記**  
読みやすくするために、Linux 行連続文字 (\$1) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

   ```
   aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \
   --applications Name=JupyterHub --log-uri s3://amzn-s3-demo-bucket/MyJupyterClusterLogs \
   --use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair \
   --bootstrap-actions Path=s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh,Name=InstallJupyterLibs
   ```

**コンソールを使用してクラスターを作成する場合にすべてのノードでライブラリをインストールするためのブートストラップアクションを指定するには**

1. 新しい Amazon EMR コンソールに移動し、サイドナビゲーションから **[古いコンソールに切り替え]** を選択します。古いコンソールに切り替えたときの動作の詳細については、「[Using the old console](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)」を参照してください。

1. [**Create cluster (クラスターの作成)**]、[**Go to advanced options (詳細オプションに移動する)**] の順に選択します。

1. アプリケーションの必要に応じて [**Software and Steps (ソフトウェアとステップ)**] および [**Hardware (ハードウェア)**] の設定を指定します。

1. [**General Cluster Settings ( (クラスターの全般設定))**] 画面で、[**Bootstrap Actions (ブートストラップアクション)**] を選択します。

1. [**Add bootstrap action (ブートストラップアクションの追加)**] で [**Custom action (カスタムアクション)**]、[**Configure and add (設定と追加)**] の順に選択します。

1. **[Name]** (名前) で、わかりやすい名前を入力します。**[スクリプトの場所]** にスクリプトの Amazon S3 の場所を入力します (この例では、*s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh* を使用)。[**Optional arguments (オプションの引数)**] は空白のままにして、[**Add (追加)**] を選択します。

1. クラスターのその他の設定を指定し、[**Next (次へ)**] を選択します。

1. セキュリティ設定を指定し、[**Create cluster (クラスターの作成)**] を選択します。

**Example 実行中のクラスターのコアノードにライブラリをインストールする**  
Jupyter 内からマスターノードでライブラリのインストールを完了すると、実行中のコアノードでライブラリをさまざまな方法でインストールできます。次の例は、ローカルマシンで実行するように書き込まれた Python プログラムを示しています。Python プログラムをローカルで実行すると、 の を使用して、このセクションの前半で示したサンプルスクリプト`AWS-RunShellScript` AWS Systems Manager を実行します。これにより、クラスターのコアノードにライブラリがインストールされます。  

```
import argparse
import time
import boto3


def install_libraries_on_core_nodes(cluster_id, script_path, emr_client, ssm_client):
    """
    Copies and runs a shell script on the core nodes in the cluster.

    :param cluster_id: The ID of the cluster.
    :param script_path: The path to the script, typically an Amazon S3 object URL.
    :param emr_client: The Boto3 Amazon EMR client.
    :param ssm_client: The Boto3 AWS Systems Manager client.
    """
    core_nodes = emr_client.list_instances(
        ClusterId=cluster_id, InstanceGroupTypes=["CORE"]
    )["Instances"]
    core_instance_ids = [node["Ec2InstanceId"] for node in core_nodes]
    print(f"Found core instances: {core_instance_ids}.")

    commands = [
        # Copy the shell script from Amazon S3 to each node instance.
        f"aws s3 cp {script_path} /home/hadoop",
        # Run the shell script to install libraries on each node instance.
        "bash /home/hadoop/install_libraries.sh",
    ]
    for command in commands:
        print(f"Sending '{command}' to core instances...")
        command_id = ssm_client.send_command(
            InstanceIds=core_instance_ids,
            DocumentName="AWS-RunShellScript",
            Parameters={"commands": [command]},
            TimeoutSeconds=3600,
        )["Command"]["CommandId"]
        while True:
            # Verify the previous step succeeded before running the next step.
            cmd_result = ssm_client.list_commands(CommandId=command_id)["Commands"][0]
            if cmd_result["StatusDetails"] == "Success":
                print(f"Command succeeded.")
                break
            elif cmd_result["StatusDetails"] in ["Pending", "InProgress"]:
                print(f"Command status is {cmd_result['StatusDetails']}, waiting...")
                time.sleep(10)
            else:
                print(f"Command status is {cmd_result['StatusDetails']}, quitting.")
                raise RuntimeError(
                    f"Command {command} failed to run. "
                    f"Details: {cmd_result['StatusDetails']}"
                )


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("cluster_id", help="The ID of the cluster.")
    parser.add_argument("script_path", help="The path to the script in Amazon S3.")
    args = parser.parse_args()

    emr_client = boto3.client("emr")
    ssm_client = boto3.client("ssm")

    install_libraries_on_core_nodes(
        args.cluster_id, args.script_path, emr_client, ssm_client
    )


if __name__ == "__main__":
    main()
```

# JupyterHub リリース履歴
<a name="JupyterHub-release-history"></a>

次の表は、Amazon EMR の各リリースに含まれている JupyterHub のバージョンと、アプリケーションと共にインストールされるコンポーネントを示しています。各リリースのコンポーネントバージョンについては、[Amazon EMR 7.x リリースバージョン](emr-release-7x.md)、[Amazon EMR 6.x リリースバージョン](emr-release-6x.md) または [Amazon EMR 5.x リリースバージョン](emr-release-5x.md) でリリースに応じたコンポーネントバージョンのセクションを参照してください。


**JupyterHub バージョン情報**  

| Amazon EMR リリースラベル | JupyterHub バージョン | JupyterHub と共にインストールされるコンポーネント | 
| --- | --- | --- | 
| emr-7.12.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-hdfs-zkfc, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.11.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-hdfs-zkfc, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.10.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.9.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.8.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.7.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.6.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.5.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.4.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.3.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.2.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.36.2 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.1.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.0.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.15.0 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.14.0 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.13.0 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.12.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.11.1 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.11.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.10.1 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.10.0 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.9.1 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.9.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.8.1 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.8.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.7.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.36.1 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.36.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.6.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.35.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.5.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.4.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.3.1 | 1.2.2 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.3.0 | 1.2.2 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.2.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.2.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.1.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.1.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.0.1 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.0.0 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.34.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.33.1 | 1.2.2 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.33.0 | 1.2.2 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.32.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.32.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.31.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.31.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.30.2 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.30.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.30.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.29.0 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.28.1 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.28.0 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.27.1 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.27.0 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.26.0 | 0.9.6 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.25.0 | 0.9.6 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.24.1 | 0.9.6 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.24.0 | 0.9.6 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.23.1 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.23.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.22.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.21.2 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.21.1 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.21.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.20.1 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.20.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.19.1 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.19.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.18.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.18.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.17.2 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.17.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.17.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.16.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.16.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.15.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.15.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.14.2 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.14.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.14.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 