

# 開発エンドポイント
<a name="development"></a>

**注記**  
 **開発エンドポイントのコンソール体験は、2023 年 3 月 31 日に削除されました。**開発エンドポイントの作成、更新、モニタリングは、[開発エンドポイント API](aws-glue-api-dev-endpoint.md) および [ AWS Glue CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/index.html#cli-aws-glue) を介して引き続きご使用いただけます。

 以下に示す理由により、開発エンドポイントからインタラクティブセッションに移行することを強くお勧めします。開発エンドポイントからインタラクティブセッションへの移行に必要なアクションについては、「[開発エンドポイントからインタラクティブセッションへ移行する](https://docs.aws.amazon.com/glue/latest/dg/development-migration-checklist.html)」を参照してください。


| 説明 | 開発者エンドポイント | インタラクティブセッション | 
| --- | --- | --- | 
| Glue バージョンサポート | AWS Glue バージョン 0.9 および 1.0 をサポートしています | AWS Glue バージョン 2.0 以降をサポートしています | 
| 開発エンドポイントは、アジアパシフィック (ジャカルタ) (ap-southeast-3)、中東 (UAE) (me-central-1)、欧州 (スペイン) (eu-south-2)、欧州 (チューリッヒ) (eu-central-2) や、今後開設される新しいリージョンでは利用できません。 | 現在、インタラクティブセッションは中東 (UAE) (me-central-1) リージョンでは利用できませんが、今後は利用できるようになる可能性があります | 
| Spark クラスターへのアクセス方法 | SSH、REPL シェル、Jupyter Notebook、および IDE (PyCharm など) をサポートしています | AWS Glue Studio ノートブック、Jupyter Notebook、さまざまな IDE (Visual Studio Code、PyCharm など)、および SageMaker AI ノートブックをサポートしています | 
| 先頭クエリまでの時間 | Spark クラスターのセットアップには 10～15 分かかります | エフェメラル Spark クラスターの設定には、最大 1 分程度かかる場合があります | 
| 料金モデル | AWS は、エンドポイントがプロビジョニングされた時間と DPU の数に基づいて、開発エンドポイントの料金を請求します。開発エンドポイントはタイムアウトしません。プロビジョニングされた開発エンドポイントごとに 10 分の最小課金時間が適用されます。さらに、AWS は、Amazon EC2 インスタンスでの Jupyter Notebook と、開発エンドポイントで設定した場合の SageMaker AI ノートブックに対して料金を請求します。 | AWS は、セッションがアクティブになっている時間と DPU の数に基づいて、インタラクティブセッションの料金を請求します。インタラクティブセッションには、設定可能なアイドルタイムアウトがあります。 AWS Glue Studio ノートブックには、インタラクティブなセッション用の組み込みインターフェイスが用意されており、追加費用なしで提供されます。インタラクティブセッションごとに 1 分の最小課金時間が適用されます。AWS Glue Studio ノートブックには、インタラクティブなセッション用の組み込みインターフェイスが用意されているため、追加コストなしで提供されます | 
| コンソールエクスペリエンス | CLI および API 経由でのみ使用可能 | AWS Glue コンソール、CLI、および API を介して使用可能 | 

# 開発エンドポイントからインタラクティブセッションへ移行する
<a name="development-migration-checklist"></a>

 次のチェックリストを使用して、開発エンドポイントからインタラクティブセッションに移行する適切な方法を決定してください。

 **スクリプトは AWS Glue 0.9 または 1.0 の特定の機能 (HDFS、YARN など) に依存していますか?**

 答えが「はい」の場合は、「[AWS Glue ジョブの  AWS Glue バージョン 3.0 への移行](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-30.html)」を参照して、Glue 0.9 または 1.0 から Glue 3.0 以降に移行する方法を確認してください。

 **開発エンドポイントへのアクセスにはどの方法を使用していますか?**


| この方法を使用する場合 | こちらを実行してください | 
| --- | --- | 
| SageMaker AI ノートブック、Jupyter Notebook、または JupyterLab | Jupyter で .ipynb ファイルをダウンロードして [AWS Glue Studio ノートブック](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-gs-notebook.html)に移行し、 .ipynb ファイルをアップロードして新しい AWS Glue Studio ノートブックジョブを作成します。または、[SageMaker AI Studio](https://aws.amazon.com/blogs/machine-learning/prepare-data-at-scale-in-amazon-sagemaker-studio-using-serverless-aws-glue-interactive-sessions/) を使用して AWS Glue カーネルを選択することもできます。 | 
| Zeppelin ノートブック | ノートブックの Jupyter Notebook への変換は、コードをコピーして貼り付ける操作を手動で行うか、ze2nb などのサードパーティコンバータを使用して自動で行います。次に、ノートブックを AWS Glue Studio ノートブックまたは SageMaker AI Studio で使用します。 | 
| IDE |  「[AWS Glue インタラクティブセッションを使用した PyCharm による AWS Glue ジョブのオーサリング](https://aws.amazon.com/blogs/big-data/author-aws-glue-jobs-with-pycharm-using-aws-glue-interactive-sessions/)」、または「[Microsoft Visual Studio Code によるインタラクティブセッションの使用](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-vscode.html)」を参照してください。 | 
| REPL |   [https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions.html](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions.html) をローカルでインストールしたら、次のコマンドを実行します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/development-migration-checklist.html)  | 
| SSH | インタラクティブセッションでは対応するオプションがありません。または、Docker イメージを使用することもできます。詳細は「[Docker イメージによる開発](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html#develop-local-docker-image)」をご覧ください。 | 

以下のセクションでは、デベロッパーエンドポイントを使用してジョブを開発する方法の情報を提供します。AWS Glueバージョン 1.0

**Topics**
+ [開発エンドポイントからインタラクティブセッションへ移行する](development-migration-checklist.md)
+ [開発エンドポイントを使用してスクリプトを開発する](dev-endpoint.md)
+ [ノートブックの管理](notebooks-with-glue.md)

# 開発エンドポイントを使用してスクリプトを開発する
<a name="dev-endpoint"></a>

**注記**  
 開発エンドポイントは、AWS Glue 2.0 より前のバージョンでのみサポートされます。ETL スクリプトを作成およびテストできるインタラクティブな環境の場合は、[AWS Glue Studio でノートブック](https://docs.aws.amazon.com/glue/latest/ug/notebooks-chapter.html)を使用します。

AWS Glue では、*開発エンドポイント*と呼ばれる環境を作成できます。この環境を使用して、抽出、変換、ロード (ETL) スクリプトを反復的に開発およびテストできます。開発エンドポイントを作成、編集、削除するには、 AWS Glue コンソールまたは API を使用します。

## 開発環境の管理
<a name="dev-endpoint-managing-dev-environment"></a>

開発エンドポイントを作成するときは、開発環境をプロビジョニングするための設定値を指定します。これらの値は、ユーザーが開発エンドポイントに安全にアクセスできるように、またエンドポイントがデータストアにアクセスできるように、ネットワークを設定する方法を AWS Glue に指示します。

次に、開発エンドポイントに接続するノートブックを作成し、このノートブックを使用して ETL スクリプトを作成およびテストできます。開発プロセスの結果に満足したら、スクリプトを実行する ETL ジョブを作成します。このプロセスにより、インタラクティブな方法で機能を追加してスクリプトをデバッグできます。

このセクションのチュートリアルに従って、ノートブックで開発エンドポイントを使用する方法を学習します。

**Topics**
+ [開発環境の管理](#dev-endpoint-managing-dev-environment)
+ [開発エンドポイントのワークフロー](dev-endpoint-workflow.md)
+ [AWS Glue 開発エンドポイントで SageMaker ノートブックを使用する方法](dev-endpoint-how-it-works.md)
+ [開発エンドポイントの追加](add-dev-endpoint.md)
+ [開発エンドポイントへのアクセス](dev-endpoint-elastic-ip.md)
+ [チュートリアル: JupyterLab で Jupyter Notebook をセットアップして ETL スクリプトをテストおよびデバッグする](dev-endpoint-tutorial-local-jupyter.md)
+ [チュートリアル: 開発エンドポイントで Amazon SageMaker AI ノートブックを使用する](dev-endpoint-tutorial-sage.md)
+ [チュートリアル: 開発エンドポイントで REPL シェルを使用する](dev-endpoint-tutorial-repl.md)
+ [チュートリアル: 開発エンドポイントで PyCharm Professional をセットアップする](dev-endpoint-tutorial-pycharm.md)
+ [高度な設定: 複数のユーザー間で開発エンドポイントを共有する](dev-endpoint-sharing.md)

# 開発エンドポイントのワークフロー
<a name="dev-endpoint-workflow"></a>

AWS Glue の開発エンドポイントを使用するには、次のワークフローに従います。

1. API を使用して開発エンドポイントを作成します。このエンドポイントは、定義したセキュリティグループを使用して、Virtual Private Cloud (VPC) 内で起動されます。

1. API は、開発エンドポイントがプロビジョニングされて使用可能になるまで、開発エンドポイントをポーリングします。使用可能になると、次のいずれかの方法を使用して開発エンドポイントに接続し、AWS Glue スクリプトを作成してテストします。
   + アカウントに SageMaker AI ノートブックを作成します。ノートブックの作り方の詳細については、「[AWS Glue Studio ノートブックによるコードの作成](notebooks-chapter.md)」を参照してください。
   + ターミナルウィンドウを開いて、開発エンドポイントに直接接続します。
   + JetBrains [PyCharm Python IDE](https://www.jetbrains.com/pycharm/) の Professional エディションがある場合は、これを開発エンドポイントに接続し、これを使用してインタラクティブに開発を行います。スクリプトに `pydevd` ステートメントを挿入すると、PyCharm でリモートブレークポイントをサポートできます。

1. 開発エンドポイントでのデバッグとテストが完了したら、削除することができます。

# AWS Glue 開発エンドポイントで SageMaker ノートブックを使用する方法
<a name="dev-endpoint-how-it-works"></a>

開発エンドポイントにアクセスする一般的な方法の 1 つは、SageMaker ノートブックの [Jupyter](https://jupyter.org/) を使用することです。Jupyter Notebook は、可視化、分析、機械学習などで広く使用されているオープンソースのウェブアプリケーションです。AWS Glue SageMaker ノートブックにより、AWS Glue 開発エンドポイントを使用した Jupyter Notebook を使用できます。AWS Glue SageMaker ノートブックでは、Jupyter Notebook 環境は [SparkMagic](https://github.com/jupyter-incubator/sparkmagic) (リモートの Spark クラスターに Spark ジョブを送信するオープンソースの Jupyter プラグイン) で事前設定されています。[Apache Livy](https://livy.apache.org)は、REST API を介してリモート Spark クラスターとのやり取りを可能にするサービスです。AWS Glue SageMaker ノートブックでは、SparkMagic は、AWS Glue 開発エンドポイントで実行されている Livy サーバーに対して REST API を呼び出すように設定されています。

各コンポーネントの動作について、次のテキストフローで説明します。

 *AWS Glue SageMaker ノートブック: (Jupyter → SparkMagic) → (ネットワーク) →  AWS Glue 開発エンドポイント: (Apache Livy → Apache Spark)* 

Jupyter Notebook 上の各段落に記述された Spark スクリプトを実行すると、Spark コードが SparkMagic 経由で Livy サーバーに送信され、「livy-session-N」という名前の Spark ジョブが Spark クラスター上で実行されます。このジョブは、Livy セッションと呼ばれます。ノートブックセッションが存続している間、Spark ジョブは実行されます。Spark ジョブは、ノートブックから Jupyter カーネルをシャットダウンしたとき、またはセッションがタイムアウトしたときに終了します。ノートブック (.ipynb) ファイルごとに 1 つの Spark ジョブが起動します。

単一の AWS Glue 開発エンドポイントで複数の SageMaker ノートブックインスタンスを使用でき ます。SageMaker ノートブックインスタンスごとに、複数のノートブックファイルを作成できます。各ノートブックファイルを開いて段落を実行すると、SparkMagic 経由で Spark クラスター上のノートブックファイルごとに Livy セッションが起動します。各 Livy セッションは、単一の Spark ジョブに対応します。

## AWS Glue 開発エンドポイントと SageMaker ノートブックのデフォルトの動作
<a name="dev-endpoint-default-behavior"></a>

Spark ジョブは、[[Spark configuration](https://spark.apache.org/docs/2.4.3/configuration.html)] (Spark の設定) に基づいて実行されます。Spark の設定には複数の方法があります (Spark クラスター設定、SparkMagic の設定など)。

デフォルトでは、Spark は Spark クラスター設定に基づいて Livy セッションにクラスターリソースを割り当てます。AWS Glue 開発エンドポイントでは、クラスター設定はワーカーのタイプによって異なります。ワーカータイプごとの共通設定について説明した表を次に示します。


****  

|  | 標準 | G.1X | G.2X | 
| --- | --- | --- | --- | 
|  spark.driver.memory  | 5G | 10G | 20G | 
|  spark.executor.memory  | 5G | 10G | 20G | 
|  spark.executor.cores  | 4 | 8 | 16 | 
|  spark.dynamicAllocation.enabled  | TRUE | TRUE | TRUE | 

Sparkエグゼキュターの最大数は、DPU (または `NumberOfWorkers`) とワーカータイプの組み合わせによって自動的に計算されます。


****  

|  | 標準 | G.1X | G.2X | 
| --- | --- | --- | --- | 
| Spark エグゼキュターの最大数 |  (DPU - 1) \$1 2 - 1  |  (NumberOfWorkers - 1)   |  (NumberOfWorkers - 1)   | 

例えば、開発エンドポイントに 10 ワーカーあり、ワーカータイプが ` G.1X` の場合、Spark エグゼキュターは 9 つになり、各エグゼキュターは 10G のメモリを持つため、クラスター全体のエグゼキュターメモリは 90G になります。

指定されたワーカータイプに関係なく、Spark 動的リソース割り当てが有効になります。データセットが十分に大きい場合、`spark.dynamicAllocation.maxExecutors` はデフォルトで設定されていないため、Spark はすべてのエグゼキュターを単一の Livy セッションに割り当てることができます。つまり、同じ開発エンドポイント上の他の Livy セッションは、新しいエグゼキュターの起動を待つことになります。データセットが小さい場合、Spark は同時に複数の Livy セッションにエグゼキュターを割り当てることができます。

**注記**  
さまざまなユースケースでリソースがどのように割り当てられるか、および動作を変更するための設定方法の詳細については、「[高度な設定: 複数のユーザー間で開発エンドポイントを共有する](dev-endpoint-sharing.md)」を参照してください。

# 開発エンドポイントの追加
<a name="add-dev-endpoint"></a>

開発エンドポイントを使用して、AWS Glue で抽出、変換、ロード (ETL) スクリプトを反復的に開発およびテストします。開発エンドポイントは、AWS Command Line Interface を介してのみ使用できます。

1. コマンドラインウィンドウで、次のようなコマンドを入力します。

   ```
   aws glue create-dev-endpoint --endpoint-name "endpoint1" --role-arn "arn:aws:iam::account-id:role/role-name" --number-of-nodes "3" --glue-version "1.0" --arguments '{"GLUE_PYTHON_VERSION": "3"}' --region "region-name"
   ```

   このコマンドでは、AWS Glue バージョン 1.0 を指定します。このバージョンは Python 2 と Python 3 の両方をサポートしているため、必要な Python バージョンを指定するには `arguments` パラメータを使用します。`glue-version` パラメータを省略すると、AWS Glue バージョン 0.9 が想定されます。AWS Glue のバージョンの詳細については、「[Glue version job property](add-job.md#glue-version-table)」を参照してください。

   追加のコマンドラインパラメータについては、*AWS CLI コマンドリファレンス*の「[create-dev-endpoint](https://docs.aws.amazon.com/cli/latest/reference/glue/create-dev-endpoint.html)」を参照してください。

1. (オプション) 次のコマンドを入力して、開発エンドポイントのステータスを確認します。ステータスが `READY` に変わったら、開発エンドポイントの使用を開始できます。

   ```
   aws glue get-dev-endpoint --endpoint-name "endpoint1"
   ```

# 開発エンドポイントへのアクセス
<a name="dev-endpoint-elastic-ip"></a>

Virtual Private Cloud (VPC) に開発エンドポイントを作成すると、AWS Glue はプライベート IP アドレスのみを返します。パブリック IP アドレスフィールドは返されません。VPC 以外の開発エンドポイントを作成する場合、AWS Glue はパブリック IP アドレスのみを返します。

開発エンドポイントに**パブリックアドレス**がある場合は、次の例のように、開発エンドポイントの SSH プライベートキーを使用して、このアドレスに到達できることを確認します。

```
ssh -i dev-endpoint-private-key.pem glue@public-address
```

開発エンドポイントに**プライベートアドレス**があり、VPC サブネットがパブリックインターネットからルーティング可能であり、そのセキュリティグループがクライアントからのインバウンドアクセスを許可するとします。この場合は、以下のステップに従って *Elastic IP アドレス*を開発エンドポイントにアタッチし、インターネットからのアクセスを許可します。

**注記**  
Elastic IP アドレスを使用する場合、使用されているサブネットには、ルートテーブルを通じて関連付けられたインターネットゲートウェイが必要です。

**Elastic IP アドレスをアタッチして開発エンドポイントにアクセスするには**

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) で AWS Glue コンソール を開きます。

1. ナビゲーションペインで、[**開発エンドポイント**] を選択し、開発エンドポイントの詳細ページに移動します。次のステップで使用するために**プライベートアドレス**を書き留めます。

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインの [**Network & Security**] で、[**ネットワークインターフェイス**] を選択します。

1. AWS Glue コンソールの [development endpoint details] (開発エンドポイントの詳細) ページで、**プライベートアドレス**に対応する**プライベート DNS (IPv4)** を検索します。

   必要に応じて Amazon EC2 コンソールで表示する列を変更します。このアドレスの**ネットワークインターフェイス ID** (ENI) を書き留めます (例: `eni-12345678`)。

1. Amazon EC2 コンソールの [**Network & Security**] (ネットワーク & セキュリティ) で、[**Elastic IPs**] (Elastic IP) をクリックします。

1. [**新しいアドレスの割り当て**]、[**割り当て**] の順に選択して、新しい Elastic IP アドレスを割り当てます。

1. [**Elastic IP**] ページで、新しく割り当てた **Elastic IP** を選択します。[**アクション**]、[**アドレスの関連付け**] の順に選択します。

1. [**アドレスの関連付け**] ページで、以下の操作を行います。
   + [**リソースタイプ**] で、[**ネットワークインターフェイス**] を選択してください。
   + [**ネットワークインターフェイス**] ボックスに、プライベートアドレスの**ネットワークインターフェイス ID** (ENI) を入力します。
   + **[関連付ける]** を選択してください。

1. 次の例に示すように、開発エンドポイントに関連付けられた SSH プライベートキーを使用して、新しく関連付けられた Elastic IP アドレスに到達できることを確認します。

   ```
   ssh -i dev-endpoint-private-key.pem glue@elastic-ip
   ```

   踏み台ホストを使用して、開発エンドポイントのプライベートアドレスへの SSH アクセスを取得する方法については、AWS セキュリティブログの投稿「[Securely Connect to Linux Instances Running in a Private Amazon VPC](https://aws.amazon.com/blogs/security/securely-connect-to-linux-instances-running-in-a-private-amazon-vpc/)」を参照してください。

# チュートリアル: JupyterLab で Jupyter Notebook をセットアップして ETL スクリプトをテストおよびデバッグする
<a name="dev-endpoint-tutorial-local-jupyter"></a>

このチュートリアルでは、ローカルマシンで実行されている JupyterLab の Jupyter Notebook を開発エンドポイントに接続します。これは、デプロイする前に、AWS Glue 抽出、変換、ロード (ETL) スクリプトを対話的に実行、デバッグ、およびテストできるようにするためです。このチュートリアルでは、Secure Shell (SSH) ポートフォワーディングを使用して、ローカルマシンを AWS Glue 開発エンドポイントに接続します。詳細については、Wikipedia の「[Port forwarding](https://en.wikipedia.org/wiki/Port_forwarding)」を参照してください。

## ステップ1: JupyterLab と Sparkmagic をインストールする
<a name="dev-endpoint-tutorial-local-jupyter-install"></a>

JupyterLab は `conda` または `pip` を使用してインストールできます。`conda` は、Windows、macOS、および Linux で稼働するオープンソースのパッケージ管理システムおよび環境管理システムです。`pip` は Python のパッケージインストーラです。

macOS にインストールする場合は、Sparkmagic をインストールする前に Xcode をインストールしておく必要があります。

1. JupyterLab、Sparkmagic、および関連する拡張機能をインストールします。

   ```
   $ conda install -c conda-forge jupyterlab
   $ pip install sparkmagic
   $ jupyter nbextension enable --py --sys-prefix widgetsnbextension
   $ jupyter labextension install @jupyter-widgets/jupyterlab-manager
   ```

1. `Location` から `sparkmagic` ディレクトリをチェックします。

   ```
   $ pip show sparkmagic | grep Location
   Location: /Users/username/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages
   ```

1. ディレクトリを、`Location` に対して返されたディレクトリに変更し、Scala と PySpark 用のカーネルをインストールします。

   ```
   $ cd /Users/username/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages
   $ jupyter-kernelspec install sparkmagic/kernels/sparkkernel
   $ jupyter-kernelspec install sparkmagic/kernels/pysparkkernel
   ```

1. サンプルの `config` ファイルをダウンロードします。

   ```
   $ curl -o ~/.sparkmagic/config.json https://raw.githubusercontent.com/jupyter-incubator/sparkmagic/master/sparkmagic/example_config.json
   ```

   この設定ファイルでは、`driverMemory` や `executorCores` などの Spark 関連のパラメータを設定できます。

## ステップ 2: JupyterLab を起動する
<a name="dev-endpoint-tutorial-local-jupyter-start"></a>

JupyterLab を起動すると、デフォルトのウェブブラウザが自動的に開き、`http://localhost:8888/lab/workspaces/{workspace_name}` という URL が表示されます。

```
$ jupyter lab
```

## ステップ 3: 開発エンドポイントに接続するための SSH ポート転送を開始する
<a name="dev-endpoint-tutorial-local-jupyter-port-forward"></a>

次に、SSH ローカルポート転送を使用して、ローカルポート (ここでは `8998`) を AWS Glue で定義されたリモート送信先 (`169.254.76.1:8998`) に転送します。

1. SSH へのアクセスができる別のターミナルウィンドウを開きます。Microsoft Windows の場合、[Git for Windows](https://git-scm.com/downloads) に用意されている BASH シェルを使用するか、[Cygwin](https://www.cygwin.com/) をインストールすることができます。

1. 次のように変更した、以下の SSH コマンドを実行します。
   + `private-key-file-path` を、開発エンドポイントを作成するのに使用したパブリックキーに対応するプライベートキーを含む `.pem` ファイルへのパスに置き換えます。
   + `8998` とは異なるポートを転送している場合は、`8998` をローカルで実際に使用しているポート番号に置き換えます。この `169.254.76.1:8998` というアドレスはリモートポートです。変更することはできません。
   + `dev-endpoint-public-dns` を開発エンドポイントのパブリック DNS アドレスで置き換えます。このアドレスを確認するには、AWS Glue コンソールで開発エンドポイントに移動して名前を選択し、[**Endpoint details**] (エンドポイントの詳細) ページに一覧表示されている [**Public address**] (パブリックアドレス) をコピーします。

   ```
   ssh -i private-key-file-path -NTL 8998:169.254.76.1:8998 glue@dev-endpoint-public-dns
   ```

   以下のような警告メッセージが表示されます。

   ```
   The authenticity of host 'ec2-xx-xxx-xxx-xx.us-west-2.compute.amazonaws.com (xx.xxx.xxx.xx)'
   can't be established.  ECDSA key fingerprint is SHA256:4e97875Brt+1wKzRko+JflSnp21X7aTP3BcFnHYLEts.
   Are you sure you want to continue connecting (yes/no)?
   ```

   **yes** と入力し、JupyterLab を使用中はターミナルウィンドウを開いたままにしておきます。

1. SSH ポート転送が開発エンドポイントで正しく機能していることを確認します。

   ```
   $ curl localhost:8998/sessions
   {"from":0,"total":0,"sessions":[]}
   ```

## ステップ 4: ノートブックの段落でシンプルスクリプトフラグメントを実行する
<a name="dev-endpoint-tutorial-local-jupyter-list-schema"></a>

JupyterLab のノートブックは、開発エンドポイントで動作するようになっています。次のスクリプトフラグメントをノートブックに入力して実行します。

1. Spark が正常に実行されていることを確認します。次のコマンドによって、Sparkが `1` を計算して値を出力します。

   ```
   spark.sql("select 1").show()
   ```

1. AWS Glue Data Catalog 統合が機能しているかどうか確認します。次のコマンドで、データカタログ内のテーブルが一覧表示されます。

   ```
   spark.sql("show tables").show()
   ```

1. AWS Glue ライブラリを使用するシンプルスクリプトフラグメントが機能していることを確認します。

   次のスクリプトでは、AWS Glue Data Catalog の `persons_json` テーブルメタデータを使用して、サンプルデータから `DynamicFrame` を作成します。次に、このデータの項目数およびスキーマが出力されます。

```
import sys
from pyspark.context import SparkContext
from awsglue.context import GlueContext
 
# Create a Glue context
glueContext = GlueContext(SparkContext.getOrCreate())
 
# Create a DynamicFrame using the 'persons_json' table
persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json")
 
# Print out information about *this* data
print("Count:  ", persons_DyF.count())
persons_DyF.printSchema()
```

スクリプトの出力は次のとおりです。

```
 Count:  1961
 root
 |-- family_name: string
 |-- name: string
 |-- links: array
 |    |-- element: struct
 |    |    |-- note: string
 |    |    |-- url: string
 |-- gender: string
 |-- image: string
 |-- identifiers: array
 |    |-- element: struct
 |    |    |-- scheme: string
 |    |    |-- identifier: string
 |-- other_names: array
 |    |-- element: struct
 |    |    |-- note: string
 |    |    |-- name: string
 |    |    |-- lang: string
 |-- sort_name: string
 |-- images: array
 |    |-- element: struct
 |    |    |-- url: string
 |-- given_name: string
 |-- birth_date: string
 |-- id: string
 |-- contact_details: array
 |    |-- element: struct
 |    |    |-- type: string
 |    |    |-- value: string
 |-- death_date: string
```

## トラブルシューティング
<a name="dev-endpoint-tutorial-local-jupyter-troubleshooting"></a>
+ JupyterLab のインストール中に、コンピュータが企業のプロキシまたはファイアウォールの内側にある場合、企業の IT 部門によって管理されるカスタムセキュリティプロファイルにより HTTP および SSL エラーが発生することがあります。

  `conda` が独自のリポジトリに接続できないときに、よく発生するエラーの例を次に示します。

  ```
  CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>
  ```

  これは、会社が Python および JavaScript コミュニティで広く使用されているリポジトリへの接続をブロックすることがあるために発生した可能性があります。詳細については、JupyterLab ウェブサイトの「[Installation Problems](https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html#installation-problems)」を参照してください。
+ 開発エンドポイントに接続しようとしたときに「*connection refused (接続拒否)*」エラーが発生した場合、古い開発エンドポイントを使用している可能性があります。新しい開発エンドポイントを作成して再接続してみます。

# チュートリアル: 開発エンドポイントで Amazon SageMaker AI ノートブックを使用する
<a name="dev-endpoint-tutorial-sage"></a>

 AWS Glue では、開発エンドポイントを作成し、ETL および機械学習スクリプトの開発に役立つ SageMaker AI ノートブックを作成できます。SageMaker AI ノートブックは、Jupyter Notebook アプリケーションを実行しているフルマネージド型機械学習コンピューティングインスタンスです。

1. AWS Glue コンソールで [**Dev endpoints (開発エンドポイント)**] を選択して、開発エンドポイントのリストに移動します。

1. 使用する開発エンドポイントの名前の横にあるチェックボックスをオンにし、[**アクション**] メニューで [**Create SageMaker notebook (SageMaker ノートブックの作成)**] を選択します。

1. [**Create and configure a notebook (ノートブックの作成と設定)**] ページに次のように入力します。

   1. ノートブック名を入力します。

   1. [**Attach to development endpoint (開発エンドポイントにアタッチ**] で、開発エンドポイントを確認します。

   1. AWS Identity and Access Management (IAM) ロールを作成または選択します。

      ロールを作成することをお勧めします。既存のロールを使用する場合は、必要な権限があることを確認します。(詳細については、[ステップ 6: SageMaker AI ノートブック用の IAM ポリシーを作成する](create-sagemaker-notebook-policy.md) を参照してください)。

   1. (オプション) VPC、サブネット、および 1 つ以上のセキュリティグループを選択します。

   1. (オプション) AWS Key Management Service 暗号化キーを選択します。

   1. (オプション) ノートブックインスタンスのタグを追加します。

1. [**Create notebook (ノートブックの作成)**] を選択します。[**ノートブック**] ページで、右上にある更新アイコンを選択し、[**ステータス**] に `Ready` と表示されるまで続行します。

1. 新しいノートブック名の横にあるチェックボックスをオンにし、[**ノートブックを開く**] を選択します。

1. 新しいノートブックを作成する: **jupyter** ページで [**新規**] を選択し、[**Sparkmagic (PySpark)**] を選択します。

   これで、画面は以下のようになります。  
![\[jupyter ページには、メニューバー、ツールバー、およびステートメントを入力できる横長のテキストフィールドがあります。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/sagemaker-notebook.png)

1. (オプション) ページの上部にある [**Untitled (無題)**] を選択し、ノートブックに名前を付けます。

1. Spark アプリケーションを起動するには、次のコマンドをノートブックに入力し、ツールバーで [**実行**] を選択します。

   ```
   spark
   ```

   しばらくすると、次のようなレスポンスが表示されます。  
![\[システムレスポンスには、Spark アプリケーションのステータスが示され、次のメッセージが出力されます: SparkSession available as 'spark'。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/spark-command-response.png)

1. 動的フレームを作成し、それに対してクエリを実行します。`persons_json` テーブルのカウントとスキーマを出力する次のコードをコピー、貼り付け、実行します。

   ```
   import sys
   from pyspark.context import SparkContext
   from awsglue.context import GlueContext
   from awsglue.transforms import *
   glueContext = GlueContext(SparkContext.getOrCreate())
   persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json")
   print ("Count:  ", persons_DyF.count())
   persons_DyF.printSchema()
   ```

# チュートリアル: 開発エンドポイントで REPL シェルを使用する
<a name="dev-endpoint-tutorial-repl"></a>

 AWS Glue では、開発エンドポイントを作成してから、REPL (Read-Evaluate-Print Loop) シェルを呼び出して PySpark コードを増分的に実行し、ETL スクリプトをデプロイする前にインタラクティブにデバッグできるようにします。

 開発エンドポイントで REPL を使用するには、エンドポイントに SSH で接続するための承認が必要です。

1. ローカルコンピュータで、SSH コマンドを実行できるターミナルウィンドウを開き、編集した SSH コマンドを貼り付けます。コマンドを実行します。

   開発エンドポイントで AWS Glue バージョン 1.0 (Python 3 を使用) を受け入れた場合、出力は次のようになります。

   ```
   Python 3.6.8 (default, Aug  2 2019, 17:42:44)
   [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
   Type "help", "copyright", "credits" or "license" for more information.
   SLF4J: Class path contains multiple SLF4J bindings.
   SLF4J: Found binding in [jar:file:/usr/share/aws/glue/etl/jars/glue-assembly.jar!/org/slf4j/impl/StaticLoggerBinder.class]
   SLF4J: Found binding in [jar:file:/usr/lib/spark/jars/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]
   SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
   SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
   Setting default log level to "WARN".
   To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
   2019-09-23 22:12:23,071 WARN  [Thread-5] yarn.Client (Logging.scala:logWarning(66)) - Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
   2019-09-23 22:12:26,562 WARN  [Thread-5] yarn.Client (Logging.scala:logWarning(66)) - Same name resource file:/usr/lib/spark/python/lib/pyspark.zip added multiple times to distributed cache
   2019-09-23 22:12:26,580 WARN  [Thread-5] yarn.Client (Logging.scala:logWarning(66)) - Same path resource file:///usr/share/aws/glue/etl/python/PyGlue.zip added multiple times to distributed cache.
   2019-09-23 22:12:26,581 WARN  [Thread-5] yarn.Client (Logging.scala:logWarning(66)) - Same path resource file:///usr/lib/spark/python/lib/py4j-src.zip added multiple times to distributed cache.
   2019-09-23 22:12:26,581 WARN  [Thread-5] yarn.Client (Logging.scala:logWarning(66)) - Same path resource file:///usr/share/aws/glue/libs/pyspark.zip added multiple times to distributed cache.
   Welcome to
         ____              __
        / __/__  ___ _____/ /__
       _\ \/ _ \/ _ `/ __/  '_/
      /__ / .__/\_,_/_/ /_/\_\   version 2.4.3
         /_/
   
   Using Python version 3.6.8 (default, Aug  2 2019 17:42:44)
   SparkSession available as 'spark'.
   >>>
   ```

1. ステートメント `print(spark.version)` を入力して REPL シェルが正常に動作しているかテストします。Spark のバージョンが表示されれば、REPL を使用する準備ができたことになります。

1. シェルで次のシンプルなスクリプトを行単位で実行することができます。

   ```
   import sys
   from pyspark.context import SparkContext
   from awsglue.context import GlueContext
   from awsglue.transforms import *
   glueContext = GlueContext(SparkContext.getOrCreate())
   persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json")
   print ("Count:  ", persons_DyF.count())
   persons_DyF.printSchema()
   ```

# チュートリアル: 開発エンドポイントで PyCharm Professional をセットアップする
<a name="dev-endpoint-tutorial-pycharm"></a>

このチュートリアルでは、ローカルマシンで実行中の [PyCharm Professional](https://www.jetbrains.com/pycharm/) Python IDE を開発エンドポイントに接続し、AWS Glue ETL (抽出、転送、およびロード) スクリプトをデプロイ前にインタラクティブに実行、デバッグ、およびテストします。チュートリアルの手順とスクリーンショットは、PyCharm Professional バージョン 2019.3 に基づいています。

開発エンドポイントをインタラクティブに接続するには、PyCharm Professional がインストールされている必要があります。無料版を使用してこれを行うことはできません。

**注記**  
このチュートリアルでは、Amazon S3 をデータソースとして使用します。代わりに JDBC データソースを使用する場合は、Virtual Private Cloud (VPC) で開発エンドポイントを実行する必要があります。SSH を使用して VPC の開発エンドポイントに接続するには、SSH トンネルを作成する必要があります。このチュートリアルには、SSH トンネルを作成する手順は含まれていません。SSH を使用して VPC の開発エンドポイントに接続する方法については、AWS セキュリティブログの「[Securely Connect to Linux Instances Running in a Private Amazon VPC](https://aws.amazon.com/blogs/security/securely-connect-to-linux-instances-running-in-a-private-amazon-vpc/)」を参照してください。

**Topics**
+ [PyCharm Professional を開発エンドポイントに接続する](#dev-endpoint-tutorial-pycharm-connect)
+ [開発エンドポイントにスクリプトをデプロイする](#dev-endpoint-tutorial-pycharm-deploy)
+ [リモートインタープリタの設定](#dev-endpoint-tutorial-pycharm-interpreter)
+ [開発エンドポイントでスクリプトを実行する](#dev-endpoint-tutorial-pycharm-debug-run)

## PyCharm Professional を開発エンドポイントに接続する
<a name="dev-endpoint-tutorial-pycharm-connect"></a>

1. PyCharm に `legislators` という名前の新しい純粋な Python プロジェクトを作成します。

1. プロジェクトに `get_person_schema.py` という名前のファイルを、次の内容で作成します。

   ```
   from pyspark.context import SparkContext
   from awsglue.context import GlueContext
   
   
   def main():
       # Create a Glue context
       glueContext = GlueContext(SparkContext.getOrCreate())
   
       # Create a DynamicFrame using the 'persons_json' table
       persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json")
   
       # Print out information about this data
       print("Count:  ", persons_DyF.count())
       persons_DyF.printSchema()
   
   
   if __name__ == "__main__":
       main()
   ```

1. 次のいずれかを行います。
   + AWS Glue バージョン 0.9 の場合、AWS Glue Python ライブラリファイル `PyGlue.zip` を `https://s3.amazonaws.com/aws-glue-jes-prod-us-east-1-assets/etl/python/PyGlue.zip` から、ローカルマシンの便利な場所にダウンロードします。
   + AWS Glue バージョン 1.0 以降の場合、AWS Glue Python ライブラリファイル `PyGlue.zip` を `https://s3.amazonaws.com/aws-glue-jes-prod-us-east-1-assets/etl-1.0/python/PyGlue.zip` から、ローカルマシンの便利な場所にダウンロードします。

1. PyCharm のプロジェクトのコンテンツルートとして `PyGlue.zip` を追加します。
   + PyCharm で、[**File**] (ファイル)、[**Settings**] (設定) の順に選択し、[**Settings**] (設定) ダイアログボックスを開きます。(`Ctrl+Alt+S` キーを押す方法もあります。)
   + `legislators` プロジェクトを展開し、[**Project Structure**] (プロジェクト構造) を選択します。次に、右ペインで [**\$1Add Content Root**] (\$1 コンテンツルートの追加) を選択します。
   + `PyGlue.zip` を保存した場所に移動して選択し、[**Apply**] (適用) を選択します。

    [**Settings**] (設定) 画面は以下のようになります。  
![\[PyGlue.zip がコンテンツルートとして追加された PyCharm 設定画面。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/PyCharm_AddContentRoot.png)

   [**Apply**] (適用) を選択した後は、[**Settings**] (設定) ダイアログボックスを開いたままにします。

1. デプロイオプションを設定し、SFTP を使用してローカルスクリプトを開発エンドポイントにアップロードします (この機能は、PyCharm Professional でのみ使用できます)。
   + [**Settings**] (設定) ダイアログボックスで、[**Build, Execution, Deployment**] (ビルド、実行、デプロイ) セクションを展開します。[**Deployment**] (デプロイ) サブセクションを選択します。
   + 中央のペインの一番上にある [**\$1**] アイコンを選択し、新しいサーバーを追加します。[**タイプ**] を `SFTP` に設定し、名前を付けます。
   + 詳細ページにリストされているように、[**SFTP ホスト**] を開発エンドポイントの [**パブリックアドレス**] に設定します (詳細ページを表示するには、AWS Glue コンソールで開発エンドポイントの名前を選択します)。VPC で実行されている開発エンドポイントの場合、[**SFTP ホスト**] をホストアドレスに設定し、SSH トンネルのローカルポートを開発エンドポイントに設定します。
   + [**User name**] (ユーザー名) を `glue` に設定します。
   + [**Auth type**] (認証タイプ) を [**Key pair (OpenSSH or Putty)**] (キーペア、OpenSSH または Putty) に設定します。開発エンドポイントのプライベートキーファイルがある場所を参照し、**プライベートキーファイル**を設定します。PyCharm は DSA、RSA、ECDSA の OpenSSH キータイプのみをサポートし、Putty のプライベート形式のキーは受け入れないことに注意してください。`ssh-keygen` の最新バージョンを使用して、PyCharm が受け入れるキーペアタイプを以下のような構文で生成できます。

     ```
     ssh-keygen -t rsa -f <key_file_name> -C "<your_email_address>"
     ```
   + [**Test connection (接続のテスト)**] を選択し、接続をテストします。接続が成功したら、[**Apply**] (適用) を選択します。

    [**Settings**] (設定) 画面は以下のようになります。  
![\[SFTP サーバーが定義された PyCharm 設定画面。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/PyCharm_SFTP.png)

   再び、[**Apply**] (適用) を選択した後は、[**Settings**] (設定) ダイアログボックスを開いたままにします。

1. ローカルディレクトリをデプロイ用のリモートディレクトリにマッピングします。
   + 右のペインの [**Deployment**] (デプロイ) ページで、[**Mappings**] (マッピング) と書かれた中央上部のタブを選択します。
   + [**Deployment Path**] (デプロイパス) 列で、プロジェクトパスのデプロイ用に `/home/glue/scripts/` の下にパスを入力します。例: `/home/glue/scripts/legislators`。
   + **[Apply]** (適用) を選択します。

    [**Settings**] (設定) 画面は以下のようになります。  
![\[デプロイマッピング後の PyCharm 設定画面。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/PyCharm_Mapping.png)

   [**OK**] を選択し、[**設定**] ダイアログボックスを閉じます。

## 開発エンドポイントにスクリプトをデプロイする
<a name="dev-endpoint-tutorial-pycharm-deploy"></a>

1. [**Tools (ツール)**]、[**Deployment (デプロイ)**] の順に選択した後、次の図に示すように、開発エンドポイントをセットアップする名前を選択します。  
![\[スクリプトをデプロイするためのメニュー項目。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/PyCharm_Deploy.png)

   スクリプトがデプロイされた後、画面の下部は、次のようになります。  
![\[デプロイが成功した後の PyCharm 画面の下部。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/PyCharm_Deployed.png)

1. メニューバーで、[**Tools (ツール)**]、[**Deployment (デプロイ)**]、[**Automatic Upload (always) (自動アップロード (常時))**] の順に選択します。[**Automatic Upload (always) (自動アップロード (常時))**] の横にチェックマークが表示されていることを確認します。

   このオプションを有効にすると、PyCharm は変更されたファイルを開発エンドポイントに自動的にアップロードします。

## リモートインタープリタの設定
<a name="dev-endpoint-tutorial-pycharm-interpreter"></a>

開発エンドポイントで Python インタプリタを使用するように PyCharm を設定します。

1. [**ファイル**] メニューの [**設定**] を選択します。

1. プロジェクトの [**legislators (立法者)**] を展開し、[**Project Interpreter (プロジェクトインタープリタ)**] を選択します。

1. [**Project Interpreter (プロジェクトインタープリタ)**] リストの横にある歯車アイコンを選択し、[**追加**] を選択します。

1. [**Add Python Interpreter (Python インタープリタを追加)**] ダイアログボックスの左ペインで、[**SSH Interpreter (SSH インタープリタ)**] を選択します。

1. [**Existing server configuration (既存のサーバー設定)**] を選択し、[**Deployment configuration (展開設定)**] リストで設定を選択します。

   これで、画面は以下の図のようになります。  
![\[左側のペインで [SSH Interpreter (SSH インタープリタ)] が選択され、右側のペインで [Existing server configuration (既存のサーバー設定)] ラジオボタンが選択されています。[Deployment configuration (デプロイ設定)] フィールドには、設定名と「Remote SDK is saved in IDE settings, so it needs the deployment server to be saved there too。Which do you prefer? (リモート SDK は IDE 設定に保存されているため、デプロイサーバーもそこに保存する必要があります。どちらを選択しますか?」というメッセージが表示されます。このメッセージの下には、[Create copy of this deployment server in IDE settings (IDE 設定でこのデプロイサーバーのコピーを作成する)] と [Move this server to IDE settings (このサーバーを IDE 設定に移動する)] という選択項目があります。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/PyCharm_Interpreter1.png)

1. [**Move this server to IDE settings (このサーバーを IDE 設定に移動する)**] を選択し、[**次へ**] を選択します。

1. [**Interpreter (インタプリタ)**] フィールドで、Python 2 を使用している場合は、パスを ` /usr/bin/gluepython` に変更し、Python 3 を使用している場合は `/usr/bin/gluepython3` に変更します。次に、**[Finish]** (終了) を選択します。

## 開発エンドポイントでスクリプトを実行する
<a name="dev-endpoint-tutorial-pycharm-debug-run"></a>

スクリプティングを実行するには:
+ 左ペインでファイル名を右クリックし、[***<filename>* を実行**] を選択します。

  一連のメッセージの後、最終的な出力にはカウントとスキーマが表示されます。

  ```
  Count:   1961
  root
  |-- family_name: string
  |-- name: string
  |-- links: array
  |    |-- element: struct
  |    |    |-- note: string
  |    |    |-- url: string
  |-- gender: string
  |-- image: string
  |-- identifiers: array
  |    |-- element: struct
  |    |    |-- scheme: string
  |    |    |-- identifier: string
  |-- other_names: array
  |    |-- element: struct
  |    |    |-- lang: string
  |    |    |-- note: string
  |    |    |-- name: string
  |-- sort_name: string
  |-- images: array
  |    |-- element: struct
  |    |    |-- url: string
  |-- given_name: string
  |-- birth_date: string
  |-- id: string
  |-- contact_details: array
  |    |-- element: struct
  |    |    |-- type: string
  |    |    |-- value: string
  |-- death_date: string
  
  
  Process finished with exit code 0
  ```

これで開発エンドポイントでスクリプトをリモートでデバッグするためのセットアップができました。

# 高度な設定: 複数のユーザー間で開発エンドポイントを共有する
<a name="dev-endpoint-sharing"></a>

このセクションでは、一般的なユースケースで SageMaker ノートブックを使用して開発エンドポイントを活用し、複数のユーザー間で開発エンドポイントを共有する方法について説明します。

## シングルテナンシーの設定
<a name="dev-endpoint-sharing-sharing-single"></a>

シングルテナントのユースケースでは、デベロッパーの作業をシンプルにし、リソースの競合を避けるために、各デベロッパーが、作業しているプロジェクトに適したサイズの独自の開発エンドポイントを使用することをお勧めします。これにより、ワーカータイプと DPU 数に関する決定がシンプルになり、デベロッパーおよび作業しているプロジェクトの裁量に任せられます。

複数のノートブックファイルを同時に実行しない限り、リソースの割り当てを検討する必要はありません。同時に複数のノートブックファイルでコードを実行すると、複数の Livy セッションが同時に起動します。複数の Livy セッションを同時に実行するために、Spark クラスター設定を分離するには、マルチテナントのユースケースで導入された手順に従います。

例えば、開発エンドポイントに 10 ワーカーあり、ワーカータイプが ` G.1X` の場合、Spark エグゼキュターは 9 つになり、各エグゼキュターは 10G のメモリを持つため、クラスター全体のエグゼキュターメモリは 90G になります。

指定されたワーカータイプに関係なく、Spark 動的リソース割り当てが有効になります。データセットが十分に大きい場合、`spark.dynamicAllocation.maxExecutors` はデフォルトで設定されていないため、Spark はすべてのエグゼキュターを単一の Livy セッションに割り当てることができます。つまり、同じ開発エンドポイント上の他の Livy セッションは、新しいエグゼキュターの起動を待つことになります。データセットが小さい場合、Spark は同時に複数の Livy セッションにエグゼキュターを割り当てることができます。

**注記**  
さまざまなユースケースでリソースがどのように割り当てられるか、および動作を変更するための設定方法の詳細については、「[高度な設定: 複数のユーザー間で開発エンドポイントを共有する](#dev-endpoint-sharing)」を参照してください。

### マルチテナンシーの設定
<a name="dev-endpoint-sharing-sharing-multi"></a>

**注記**  
開発エンドポイントは、シングルテナント環境として AWS Glue ETL 環境をエミュレートするためのものであることに留意してください。マルチテナントの使用は可能ですが、これは高度なユースケースであり、ほとんどのユーザーには、開発エンドポイントごとにシングルテナンシーのパターンを維持することをお勧めします。

マルチテナントのユースケースでは、リソース割り当てを検討する必要があることがあります。重要な要因は、同時に Jupyter Notebook を使用するユーザーの数です。チームが「フォローザサン」ワークフローで作業し、各タイムゾーンに Jupyter ユーザーが 1 人しかいない場合、同時ユーザーの数は 1 人であるため、リソースの割り当てについて心配する必要はありません。ただし、ノートブックが複数のユーザー間で共有され、各ユーザーがアドホックベースでコードを送信する場合は、以下の点を考慮する必要があります。

Spark クラスターリソースを複数のユーザー間でパーティション化するには、SparkMagic の設定を使用します。Spark Magic の設定には、2 つの異なる方法があります。

#### (A) %%configure -f ディレクティブを使用する
<a name="dev-endpoint-sharing-sharing-multi-a"></a>

ノートブックから Livy セッションごとの設定を変更したい場合は、`%%configure -f` ディレクティブをノートブックの段落で実行します。

例えば、5 つのエグゼキュターで Spark アプリケーションを実行する場合は、ノートブックの段落で次のコマンドを実行します。

```
%%configure -f
{"numExecutors":5}
```

そうすると、Spark UI 上でジョブに対して実行されているエグゼキュターが 5 つだけ表示されます。

動的リソース割り当てでは、エグゼキュターの最大数を制限することをお勧めします。

```
%%configure -f
{"conf":{"spark.dynamicAllocation.maxExecutors":"5"}}
```

#### (B) SparkMagic Config ファイルを変更する
<a name="dev-endpoint-sharing-sharing-multi-b"></a>

SparkMagic は、[Livy API](https://livy.incubator.apache.org/docs/latest/rest-api.html) に基づいて動作します。SparkMagic は、`driverMemory`、` driverCores`、`executorMemory`、`executorCores`、` numExecutors`、`conf` などの設定で Livy セッションを作成します。これらは、Spark クラスター全体で消費されるリソースの量を決定する重要な要素です。SparkMagic を使用すると、Livy に送信されるパラメータを指定するための設定ファイルを指定することができます。この [GitHub リポジトリ](https://github.com/jupyter-incubator/sparkmagic/blob/master/sparkmagic/example_config.json) にサンプルの設定ファイルがあります。

ノートブックからすべての Livy セッションの設定を変更したい場合は、`/home/ec2-user/.sparkmagic/config.json` を変更して `session_config` を追加します。

SageMaker ノートブックインスタンスの設定ファイルを変更するには、以下の手順に従います。

1. SageMaker ノートブックを開きます。

1. ターミナルカーネルを開きます。

1. 以下の コマンドを実行します。

   ```
   sh-4.2$ cd .sparkmagic
   sh-4.2$ ls
   config.json logs
   sh-4.2$ sudo vim config.json
   ```

   例えば、これらの行を ` /home/ec2-user/.sparkmagic/config.json` に追加し、ノートブックから Jupyter カーネルを再起動します。

   ```
     "session_configs": {
       "conf": {
         "spark.dynamicAllocation.maxExecutors":"5"
       }
     },
   ```

### ガイドラインとベストプラクティス
<a name="dev-endpoint-sharing-sharing-guidelines"></a>

このようなリソースの競合を避けるために、次のような基本的なアプローチを使用できます。
+ `NumberOfWorkers` (水平方向のスケーリング) を増やし、 `workerType` (垂直スケーリング) をアップグレードして、Spark クラスターを大きくする
+ ユーザーあたりの割り当てリソースを削減 (Livy セッションあたりのリソースの削減)

アプローチはユースケースによって異なります。開発エンドポイントが大きく、大量のデータがない場合、Spark は動的割り当て戦略に基づいてリソースを割り当てることができるため、リソースの競合の可能性が大幅に低下します。

上記のように、Spark エグゼキュターの数は、DPU (または `NumberOfWorkers`) とワーカータイプの組み合わせに基づいて自動的に計算できます。各 Spark アプリケーションは、1つのドライバーと複数のエグゼキュターを起動します。計算するには、` NumberOfWorkers` = `NumberOfExecutors + 1` が必要です。以下のマトリックスは、同時ユーザー数に基づいて、開発エンドポイントに必要な容量を示しています。


****  

| 同時に実行するノートブックユーザーの数 | ユーザーごとに割り当てる Spark エグゼキュターの数 | 開発エンドポイントの NumberOfWorkers 合計 | 
| --- | --- | --- | 
| 3 | 5 | 18 | 
| 10 | 5 | 60 | 
| 50 | 5 | 300 | 

ユーザーごとに割り当てるリソースを少なくしたい場合、` spark.dynamicAllocation.maxExecutors` (または `numExecutors`) は、Livy セッションパラメータとして設定する最も簡単なパラメータです。`/home/ec2-user/.sparkmagic/config.json` で以下のように設定した場合、SparkMagic は Livy セッションごとに最大 5 つのエグゼキュターを割り当てます。これは、Livy セッションごとにリソースを分離するのに役立ちます。

```
"session_configs": {
    "conf": {
      "spark.dynamicAllocation.maxExecutors":"5"
    }
  },
```

18 のワーカー (G.1X) が使用されている開発エンドポイントで、同時実行するノートブックユーザー数が 3 とします。セッション設定に ` spark.dynamicAllocation.maxExecutors=5` が含まれていると、各ユーザーは 1 つのドライバーと 5 つのエグゼキュターを使用できます。複数のノートブックの段落を同時に実行しても、リソースの競合は発生しません。

#### トレードオフ
<a name="dev-endpoint-sharing-sharing-multi-tradeoffs"></a>

この `"spark.dynamicAllocation.maxExecutors":"5"` というセッション設定で、リソースの競合エラーを回避することができ、同時ユーザーアクセスがあるときにリソース割り当てを待つ必要はありません。ただし、多くの空きリソースがある場合 (例えば、他の同時ユーザーがいない場合) でも、Spark は Livy セッションに 5 つまでしかエグゼキュターを割り当てることができません。

#### その他の注意事項
<a name="dev-endpoint-sharing-sharing-multi-notes"></a>

ノートブックの使用を停止するときは、Jupyter カーネルを停止することをお勧めします。これにより、リソースが解放され、他のノートブックユーザーはカーネルの有効期限 (自動シャットダウン) を待たずにすぐにこれらのリソースを使用できます。

### 一般的な問題
<a name="dev-endpoint-sharing-sharing-issues"></a>

ガイドラインに従っている場合でも、特定の問題が発生する可能性があります。

#### セッションが見つからない
<a name="dev-endpoint-sharing-sharing-issues-session"></a>

Livy セッションがすでに終了しているにもかかわらず、ノートブック段落を実行しようとすると、以下のメッセージが表示されます。Livy セッションをアクティブにするには、Jupyter カーネルを再起動する必要があります。Jupyter メニューで [**Kernel**] (カーネル) > [**Restart**] (再起動) を選択し、ノートブックの段落をもう一度実行します。

```
An error was encountered:
Invalid status code '404' from http://localhost:8998/sessions/13 with error payload: "Session '13' not found."
```

#### YARN リソースが不足
<a name="dev-endpoint-sharing-sharing-issues-yarn-resources"></a>

Spark クラスターに新しい Livy セッションを開始するのに十分なリソースがないにもかかわらず、ノートブックの段落を実行しようとすると、以下のメッセージが表示されます。多くの場合、ガイドラインに従うことでこの問題を回避できますが、この問題に直面する可能性があります。この問題を回避するには、不要なアクティブな Livy セッションがあるかどうかを確認します。不要な Livy セッションがある場合、クラスターリソースを解放するためにセッションを終了する必要があります。詳細については、次のセクションを参照ください。

```
Warning: The Spark session does not have enough YARN resources to start. 
The code failed because of a fatal error:
    Session 16 did not start up in 60 seconds..

Some things to try:
a) Make sure Spark has enough available resources for Jupyter to create a Spark context.
b) Contact your Jupyter administrator to make sure the Spark magics library is configured correctly.
c) Restart the kernel.
```

### モニタリングとデバッグ
<a name="dev-endpoint-sharing-sharing-debugging"></a>

このセクションでは、リソースとセッションをモニタリングするための手法について説明します。

#### クラスターリソース割り当てのモニタリングとデバッグ
<a name="dev-endpoint-sharing-sharing-debugging-a"></a>

Spark UI を見て、Livy セッションごとに割り当てられているリソースの数と、ジョブで有効な Spark 設定をモニタリングできます。Spark UI をアクティブ化するには、「[Enabling the Apache Spark Web UI for Development Endpoints](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-dev-endpoints.html)」を参照してください。

(オプション) Spark UI のリアルタイムビューが必要な場合は、Spark クラスターで実行されている Spark 履歴サーバーに対して SSH トンネルを設定できます。

```
ssh -i <private-key.pem> -N -L 8157:<development endpoint public address>:18080 glue@<development endpoint public address>
```

ブラウザで http://localhost:8157 を開き、Spark UI を表示できます。

#### 不要な Livy セッションの解放
<a name="dev-endpoint-sharing-sharing-debugging-b"></a>

ノートブックまたは Spark クラスターから不要な Livy セッションをすべてシャットダウンするには、以下の手順を確認してください。

**(a)。ノートブックから Livy セッションを終了する**  
Jupyter Notebook でカーネルをシャットダウンして、不要な Livy セッションを終了できます。

**(b)。Spark クラスターから Livy セッションを終了する**  
不要な Livy セッションがまだ実行されている場合は、Spark クラスターで Livy セッションをシャットダウンできます。

この手順を実行するための前提条件として、開発エンドポイントの SSH パブリックキーを設定する必要があります。

Spark クラスターにログインするには、次のコマンドを実行します。

```
$ ssh -i <private-key.pem> glue@<development endpoint public address>
```

次のコマンドを実行して、アクティブな Livy セッションを表示できます。

```
$ yarn application -list
20/09/25 06:22:21 INFO client.RMProxy: Connecting to ResourceManager at ip-255-1-106-206.ec2.internal/172.38.106.206:8032
Total number of applications (application-types: [] and states: [SUBMITTED, ACCEPTED, RUNNING]):2
Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
application_1601003432160_0005 livy-session-4 SPARK livy default RUNNING UNDEFINED 10% http://ip-255-1-4-130.ec2.internal:41867
application_1601003432160_0004 livy-session-3 SPARK livy default RUNNING UNDEFINED 10% http://ip-255-1-179-185.ec2.internal:33727
```

その後、次のコマンドを使用して Livy セッションをシャットダウンできます。

```
$ yarn application -kill application_1601003432160_0005
20/09/25 06:23:38 INFO client.RMProxy: Connecting to ResourceManager at ip-255-1-106-206.ec2.internal/255.1.106.206:8032
Killing application application_1601003432160_0005
20/09/25 06:23:39 INFO impl.YarnClientImpl: Killed application application_1601003432160_0005
```

# ノートブックの管理
<a name="notebooks-with-glue"></a>

**注記**  
 開発エンドポイントは、AWS Glue 2.0 より前のバージョンでのみサポートされます。ETL スクリプトを作成およびテストできるインタラクティブな環境の場合は、[AWS Glue Studio でノートブック](https://docs.aws.amazon.com/glue/latest/ug/notebooks-chapter.html)を使用します。

ノートブックを使用すると、開発エンドポイントでの ETL (抽出、変換、ロード) スクリプトのインタラクティブな開発とテストを行うことができます。AWS Glue には、SageMaker AI Jupyter Notebook に対するインターフェイスが用意されています。AWS Glue を使用して、SageMaker AI ノートブックを作成および管理します。AWS Glue コンソールから SageMaker AI ノートブックを開くこともできます。

また、SageMaker AI (AWS Glue ETL ジョブではない) をサポートする AWS Glue 開発エンドポイント上の SageMaker AI で Apache Spark を使用できます。SageMaker Spark は、オープンソースの SageMaker AI 用 Apache Spark ライブラリです。詳細については、「[Amazon SageMaker で Apache Spark を使う](https://docs.aws.amazon.com/sagemaker/latest/dg/apache-spark.html)」を参照してください。


| リージョン | Code | 
| --- | --- | 
|   AWS Glue 開発エンドポイントでの SageMaker AI ノートブックの管理は、以下の AWS リージョンで利用できます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/notebooks-with-glue.html)   | 
| 米国東部(オハイオ) | `us-east-2` | 
| 米国東部 (バージニア北部) | `us-east-1` | 
| 米国西部 (北カリフォルニア) | `us-west-1` | 
| 米国西部 (オレゴン） | `us-west-2` | 
| アジアパシフィック (東京) | `ap-northeast-1` | 
| アジアパシフィック (ソウル) | `ap-northeast-2` | 
| アジアパシフィック (ムンバイ) | `ap-south-1` | 
| アジアパシフィック (シンガポール) | `ap-southeast-1` | 
| アジアパシフィック (シドニー) | `ap-southeast-2` | 
| カナダ (中部) | `ca-central-1` | 
| 欧州 (フランクフルト) | `eu-central-1` | 
| 欧州 (アイルランド) | `eu-west-1` | 
| 欧州 (ロンドン) | `eu-west-2` | 

**Topics**