本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用自助託管的 Jupyter 筆記本
您可以在 Amazon EC2執行個體或您自己的 Amazon EKS叢集上託管和管理 Jupyter 或 JupyterLab 筆記本,作為自我託管 Jupyter 筆記本。然後,使用自助託管的 Jupyter 筆記本執行互動式工作負載。下列各節會逐步解說在 Amazon EKS叢集上設定和部署自我託管 Jupyter 筆記本的程序。
在EKS叢集上建立自我託管的 Jupyter 筆記本
建立安全群組
在建立互動式端點並執行自我託管的 Jupyter 或 JupyterLab 筆記本之前,您必須先建立安全群組,以控制筆記本和互動式端點之間的流量。若要使用 Amazon EC2主控台或 Amazon EC2SDK來建立安全群組,請參閱 Amazon EC2使用者指南 中的建立安全群組中的步驟。您應該在VPC您要部署筆記本伺服器的 中建立安全群組。
若要遵循本指南中的範例,請使用與您的 Amazon EKS叢集VPC相同的 。如果您想要在VPC不同於 Amazon EKS叢集VPC的 中託管筆記本,您可能需要在這兩個 之間建立對等連線VPCs。如需在兩個 之間建立對等連線的步驟VPCs,請參閱 Amazon VPC 入門指南中的建立VPC對等連線。
您需要安全群組的 ID,才能在下一個步驟中建立EKS互動式端點EMR上的 Amazon。
在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的閘道伺服器
建立互動式端點之後,URL請使用 中的 describe-managed-endpoint
命令來擷取閘道伺服器 AWS CLI。您需要此功能URL才能將筆記本連線至端點。閘道伺服器URL是私有端點。
aws emr-containers describe-managed-endpoint \ --region
region
\ --virtual-cluster-idvirtualClusterId
\ --idendpointId
最初,您的端點位於 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-identifiervirtualClusterArn
\ --execution-role-arnexecutionRoleArn
\ --credential-type "TOKEN" \ --duration-in-secondsdurationInSeconds
\ --regionregion
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筆記本
完成上述步驟後,您可以嘗試此範例程序,以您的互動式端點將 JupyterLab 筆記本部署到 Amazon EKS叢集。
-
建立命名空間,以執行筆記本伺服器。
-
在本機建立檔案
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 筆記本部署到僅限 Fargate 的叢集,請使用
role
標籤來標記 Jupyter Pod,如下列範例所示:... metadata: name: jupyter-notebook namespace: default labels: role:
example-role-name-label
spec: ...namespace
-
在其中部署筆記本的 Kubernetes 命名空間。
serverUrl
-
describe-managed-endpoint
命令在 擷取互動式端點URL的閘道伺服器 中傳回的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 "
-
將 Pod 規格部署到您的 Amazon EKS叢集:
kubectl apply -f notebook.yaml -n
namespace
這將啟動在EMREKS互動式端點上連接至 Amazon 的最小 JupyterLab 筆記本。等待直到 Pod RUNNING。 您可以使用下列命令來檢查其狀態:
kubectl get pod jupyter-notebook -n
namespace
當 Pod 準備就緒時,
get pod
命令會傳回類似以下輸出:NAME READY STATUS RESTARTS AGE jupyter-notebook 1/1 Running 0 46s
-
將筆記本安全群組附接至排程筆記本所在的節點。
-
首先,使用
describe pod
命令識別在其中排程jupyter-notebook
Pod 的節點。kubectl describe pod jupyter-notebook -n
namespace
開啟位於 https://console.aws.amazon.com/eks/home#/clusters
的 Amazon EKS主控台。 -
導覽至 Amazon EKS叢集的運算索引標籤,然後選取
describe pod
命令識別的節點。選取節點的執行個體 ID。 -
從動作功能表中,選取安全性 > 變更安全群組,以附接您在 建立安全群組 中建立的安全群組。
-
如果您要在 上部署 Jupyter 筆記本 Pod AWS Fargate,請建立
SecurityGroupPolicy
以套用至具有角色標籤的 Jupyter 筆記本 Pod: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
-
-
現在,連接埠轉送可讓您本機存取 JupyterLab 介面:
kubectl port-forward jupyter-notebook 8888:8888 -n
namespace
執行後,導覽至本機瀏覽器並造訪
localhost:8888
以查看 JupyterLab 介面: -
從 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()
刪除自助託管的 Jupyter 筆記本
當您準備好刪除自助託管的筆記本時,也可以刪除互動端點和安全群組。請依下列順序執行動作: