자체 호스팅 Jupyter Notebook 사용 - 아마존 EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

자체 호스팅 Jupyter Notebook 사용

Amazon EC2 인스턴스 또는 자체 Amazon EKS 클러스터에서 자체 호스팅 Jupyter JupyterLab 노트북으로 Jupyter 또는 노트북을 호스팅하고 관리할 수 있습니다. 그런 다음 자체 호스팅 Jupyter Notebook으로 대화형 워크로드를 실행할 수 있습니다. 다음 섹션에서는 Amazon 클러스터에서 셀프 호스팅 Jupyter 노트북을 설정하고 배포하는 프로세스를 안내합니다. EKS

보안 그룹 생성

대화형 엔드포인트를 생성하고 자체 호스팅된 Jupyter 또는 JupyterLab 노트북을 실행하려면 먼저 노트북과 대화형 엔드포인트 간의 트래픽을 제어하는 보안 그룹을 생성해야 합니다. Amazon EC2 콘솔 또는 Amazon을 사용하여 보안 그룹을 EC2 SDK 생성하려면 Amazon 사용 EC2설명서의 보안 그룹 생성에 나와 있는 단계를 참조하십시오. 노트북 서버를 배포하려는 VPC 위치에 보안 그룹을 생성해야 합니다.

이 가이드의 예제를 따르려면 Amazon VPC EKS 클러스터와 동일하게 사용하십시오. Amazon EKS 클러스터와 다른 환경에서 노트북을 VPC 호스팅하려면 두 VPCs 클러스터 사이에 피어링 연결을 생성해야 할 수 있습니다. VPC 둘 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인 경우 사용할 준비가 된 것입니다.

aws emr-containers describe-managed-endpoint 명령이 활성 엔드포인트에서 반환하는 serverUrl 속성을 기록합니다. 자체 호스팅된 Jupyter 또는 노트북을 배포할 때 노트북을 엔드포인트에 URL 연결하려면 이것이 필요합니다. JupyterLab

인증 토큰을 검색하여 대화형 엔드포인트에 연결

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 또는 노트북을 배포할 때 사용할 session-token 가치를 기록해 두십시오. JupyterLab

{ "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. 먼저 describe pod 명령을 사용하여 jupyter-notebook 포드가 예약된 노드를 식별합니다.

      kubectl describe pod jupyter-notebook -n namespace
    2. https://console.aws.amazon.com/eks/홈#/클러스터에서 Amazon EKS 콘솔을 엽니다.

    3. Amazon EKS 클러스터의 Compute 탭으로 이동하여 describe pod 명령으로 식별되는 노드를 선택합니다. 노드의 인스턴스 ID를 선택합니다.

    4. 작업 메뉴에서 보안 > 보안 그룹 변경을 선택하여 보안 그룹 생성에서 생성한 보안 그룹을 연결합니다.

    5. Jupyter 노트북 포드를 배포하는 경우 역할 AWS Fargate레이블을 사용하여 Jupyter 노트북 포드에 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 사용 설명서의 보안 그룹 삭제를 참조하십시오.