セルフホスト型 Jupyter Notebook を使用する - Amazon EMR

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

セルフホスト型 Jupyter Notebook を使用する

Jupyter または JupyterLab ノートブックは、Amazon EC2インスタンスまたは独自の Amazon EKSクラスターで、セルフホスト型の Jupyter Notebook としてホストおよび管理できます。その後、セルフホスト型 Jupyter Notebook でインタラクティブワークロードを実行できます。以下のセクションでは、セルフホスト型の Jupyter Notebook を Amazon EKSクラスターにセットアップしてデプロイするプロセスについて説明します。

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

インタラクティブエンドポイントを作成してセルフホスト型の Jupyter または JupyterLab ノートブックを実行する前に、ノートブックとインタラクティブエンドポイント間のトラフィックを制御するセキュリティグループを作成する必要があります。Amazon EC2コンソールまたは Amazon を使用してセキュリティグループEC2SDKを作成するには、「Amazon EC2 ユーザーガイド」の「セキュリティグループを作成する」の手順を参照してください。ノートブックサーバーをデプロイVPCする にセキュリティグループを作成する必要があります。

このガイドの例に従うには、Amazon EKSクラスターVPCと同じ を使用します。Amazon EKSクラスターの VPCとは異なる でノートブックVPCをホストする場合は、これら 2 つの 間にピアリング接続を作成する必要がある場合がありますVPCs。2 つの 間でピアリング接続を作成する手順についてはVPCs、Amazon VPC入門ガイドのVPC「ピアリング接続の作成」を参照してください。

次のステップでEKSインタラクティブエンドポイントEMRに Amazon を作成するには、セキュリティグループの ID が必要です。

EKS インタラクティブエンドポイントEMRで Amazon を作成する

ノートブックのセキュリティグループを作成したら、「仮想クラスターのインタラクティブエンドポイントを作成する」に記載されている手順に従ってインタラクティブエンドポイントを作成します。「セキュリティグループの作成」でノートブック用に作成したセキュリティグループ ID を指定する必要があります。

の代わりにセキュリティ ID を挿入する your-notebook-security-group-id 次の設定オーバーライド設定の :

--configuration-overrides '{ "applicationConfiguration": [ { "classification": "endpoint-configuration", "properties": { "notebook-security-group-id": "your-notebook-security-group-id" } } ], "monitoringConfiguration": { ...'

インタラクティブエンドポイントURLのゲートウェイサーバーを取得する

インタラクティブエンドポイントを作成したら、 の describe-managed-endpoint コマンドURLを使用してゲートウェイサーバーを取得します AWS CLI。ノートブックをエンドポイントに接続するURLには、これが必要です。ゲートウェイサーバーはプライベートエンドポイントURLです。

aws emr-containers describe-managed-endpoint \ --region region \ --virtual-cluster-id virtualClusterId \ --id endpointId

最初、エンドポイントの状態は CREATING です。数分後、ACTIVE 状態に遷移します。エンドポイントが ACTIVE となっていれば、使用準備が完了しています。

serverUrl コマンドがアクティブなエンドポイントから返す aws emr-containers describe-managed-endpoint 属性を書き留めておきます。セルフホスト型 Jupyter またはノートブック をデプロイするときに JupyterLab 、ノートブックをエンドポイントURLに接続するには、これが必要です。

認証トークンを取得してインタラクティブエンドポイントに接続します。

Jupyter または JupyterLab ノートブックからインタラクティブエンドポイントに接続するには、 GetManagedEndpointSessionCredentials を使用してセッショントークンを生成する必要がありますAPI。このトークンは、インタラクティブエンドポイントサーバーに接続するための認証証明として機能します。

次のコマンドについて、出力例を示してさらに詳しく説明します。

aws emr-containers get-managed-endpoint-session-credentials \ --endpoint-identifier endpointArn \ --virtual-cluster-identifier virtualClusterArn \ --execution-role-arn executionRoleArn \ --credential-type "TOKEN" \ --duration-in-seconds durationInSeconds \ --region region
endpointArn

エンドポイントARNの 。は、describe-managed-endpoint呼び出しARNの結果で確認できます。

virtualClusterArn

仮想クラスターARNの 。

executionRoleArn

実行ロールARNの 。

durationInSeconds

トークンの有効期間 (秒単位)。デフォルトの有効期間は 15 分 (900) で、最長は 12 時間 (43200) です。

region

エンドポイントと同じリージョン。

出力は次の例のようになります。セルフホスト型 Jupyter または JupyterLab ノートブック をデプロイするときに使用するsession-token値を書き留めます。

{ "id": "credentialsId", "credentials": { "token": "session-token" }, "expiresAt": "2022-07-05T17:49:38Z" }

例: ノートブックを JupyterLabデプロイする

上記のステップを完了したら、このサンプル手順を試して、インタラクティブエンドポイントを使用して Amazon EKSクラスターに JupyterLab ノートブックをデプロイできます。

  1. ノートブックサーバーを実行する名前空間を作成します。

  2. notebook.yaml というファイルを次の内容でローカルに作成します。ファイルの内容は次のとおりです。

    apiVersion: v1 kind: Pod metadata: name: jupyter-notebook namespace: namespace spec: containers: - name: minimal-notebook image: jupyter/all-spark-notebook:lab-3.1.4 # open source image ports: - containerPort: 8888 command: ["start-notebook.sh"] args: ["--LabApp.token=''"] env: - name: JUPYTER_ENABLE_LAB value: "yes" - name: KERNEL_LAUNCH_TIMEOUT value: "400" - name: JUPYTER_GATEWAY_URL value: "serverUrl" - name: JUPYTER_GATEWAY_VALIDATE_CERT value: "false" - name: JUPYTER_GATEWAY_AUTH_TOKEN value: "session-token"

    Jupyter Notebook を Fargate 専用クラスターにデプロイする場合は、次の例のように Jupyter ポッドに role ラベルを付けます。

    ... metadata: name: jupyter-notebook namespace: default labels: role: example-role-name-label spec: ...
    namespace

    ノートブックをデプロイする Kubernetes 名前空間。

    serverUrl

    インタラクティブエンドポイントURLのゲートウェイサーバーを取得する describe-managed-endpoint コマンドが返した serverUrl 属性。

    session-token

    認証トークンを取得してインタラクティブエンドポイントに接続します。get-managed-endpoint-session-credentials コマンドが返した session-token 属性。

    KERNEL_LAUNCH_TIMEOUT

    インタラクティブエンドポイントが、カーネルが RUNNING 状態になるのを待つ時間 (秒単位)。カーネル起動タイムアウトを適切な値 (最大 400 秒) に設定して、カーネルの起動が完了するまで十分な時間を確保します。

    KERNEL_EXTRA_SPARK_OPTS

    オプションで、Spark カーネルに追加の Spark 構成を渡すことができます。以下の例のように、この環境変数に Spark 設定プロパティとして値を設定します。

    - name: KERNEL_EXTRA_SPARK_OPTS value: "--conf spark.driver.cores=2 --conf spark.driver.memory=2G --conf spark.executor.instances=2 --conf spark.executor.cores=2 --conf spark.executor.memory=2G --conf spark.dynamicAllocation.enabled=true --conf spark.dynamicAllocation.shuffleTracking.enabled=true --conf spark.dynamicAllocation.minExecutors=1 --conf spark.dynamicAllocation.maxExecutors=5 --conf spark.dynamicAllocation.initialExecutors=1 "
  3. ポッド仕様を Amazon EKSクラスターにデプロイします。

    kubectl apply -f notebook.yaml -n namespace

    これにより、EKSインタラクティブエンドポイントEMRで Amazon に接続された最小限の JupyterLab ノートブックが起動します。ポッドが RUNNING になるまでお待ちください。次のコマンドを使用して、ポッドのステータスを確認します。

    kubectl get pod jupyter-notebook -n namespace

    ポッドの準備が整うと、get pod コマンドは次のような出力を返します。

    NAME READY STATUS RESTARTS AGE jupyter-notebook 1/1 Running 0 46s
  4. ノートブックセキュリティグループを、ノートブックがスケジュールされているノードにアタッチします。

    1. まず、jupyter-notebook ポッドがスケジュールされているノードを describe pod コマンドで特定します。

      kubectl describe pod jupyter-notebook -n namespace
    2. https://console.aws.amazon.com/eks/home#/clusters で Amazon EKSコンソールを開きます。

    3. Amazon EKSクラスターのコンピューティングタブに移動し、 describe pod コマンドで識別されるノードを選択します。ノードのインスタンス ID を選択します。

    4. [アクション] メニューから [セキュリティ] > [セキュリティグループを変更] を選択し、セキュリティグループの作成 で作成したセキュリティグループをアタッチします。

    5. Jupyter Notebook ポッドを にデプロイする場合は AWS Fargate、 を作成して、ロールラベルを使用して Jupyter Notebook ポッドSecurityGroupPolicyに適用します。

      cat >my-security-group-policy.yaml <<EOF apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: example-security-group-policy-name namespace: default spec: podSelector: matchLabels: role: example-role-name-label securityGroups: groupIds: - your-notebook-security-group-id EOF
  5. 次に、ポートフォワードして、 JupyterLab インターフェイスにローカルにアクセスできるようにします。

    kubectl port-forward jupyter-notebook 8888:8888 -n namespace

    実行したら、ローカルブラウザに移動し、 localhost:8888 にアクセスして JupyterLab インターフェイスを確認します。

    JupyterLab 開始画面のスクリーンショット。
  6. から JupyterLab、新しい Scala ノートブックを作成します。Pi の値を概算するために実行できるサンプルコードスニペットを次に示します。

    import scala.math.random import org.apache.spark.sql.SparkSession /** Computes an approximation to pi */ val session = SparkSession .builder .appName("Spark Pi") .getOrCreate() val slices = 2 // avoid overflow val n = math.min(100000L * slices, Int.MaxValue).toInt val count = session.sparkContext .parallelize(1 until n, slices) .map { i => val x = random * 2 - 1 val y = random * 2 - 1 if (x*x + y*y <= 1) 1 else 0 }.reduce(_ + _) println(s"Pi is roughly ${4.0 * count / (n - 1)}") session.stop()
    の Scala ノートブックコード例のスクリーンショット JupyterLab。

セルフホスト型 Jupyter Notebook を削除する

セルフホスト型ノートブックを削除する準備ができたら、インタラクティブエンドポイントとセキュリティグループも削除できます。次の順番でアクションを実行します。

  1. 次のコマンドを使用して、jupyter-notebook ポッドを削除します。

    kubectl delete pod jupyter-notebook -n namespace
  2. 次に、delete-managed-endpoint コマンドを使用してインタラクティブエンドポイントを削除します。インタラクティブエンドポイントを削除する手順については、「インタラクティブエンドポイントを削除する」を参照してください。最初、エンドポイントは TERMINATING 状態になります。すべてのリソースがクリーンアップされると、TERMINATED 状態に移行します。

  3. セキュリティグループの作成 で作成したノートブックセキュリティグループを他の Jupyter Notebook デプロイに使用する予定がない場合は、削除できます。詳細については、「Amazon ユーザーガイド」の「セキュリティグループの削除」を参照してください。 EC2