

# AWS Glue 开发终端节点如何与 SageMaker 笔记本配合使用
<a name="dev-endpoint-how-it-works"></a>

访问开发终端节点的常见方法之一是使用 SageMaker 笔记本上的 [Jupyter](https://jupyter.org/)。Jupyter notebook 是一个开源的 Web 应用程序，广泛应用于可视化、分析和机器学习等领域。AWS Glue SageMaker 笔记本为您提供 AWS Glue 开发终端节点的 Jupyter notebook 体验。在 AWS Glue SageMaker 笔记本中，Jupyter notebook 环境预先配置了 [SparkMagic](https://github.com/jupyter-incubator/sparkmagic)，这是一个开源 Jupyter 插件，用于将 Spark 任务提交至远程 Spark 集群。[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 任务将在笔记本会话处于活跃状态时运行。当您从笔记本中关闭 Jupyter 内核或会话超时时，Spark 任务将终止。每个笔记本（.ipynb）文件启动一个 Spark 任务。

您可以将单个 AWS Glue 开发终端节点与多个 SageMaker 笔记本实例结合使用。您可以在每个 SageMaker 笔记本实例中创建多个笔记本文件。当您打开每个笔记本文件并运行段落时，将通过 SparkMagic 在 Spark 集群上针对每个笔记本文件启动一个 Livy 会话。每个 Livy 会话对应于一项 Spark 任务。

## AWS Glue 开发终端节点和 SageMaker 笔记本的默认行为
<a name="dev-endpoint-default-behavior"></a>

Spark 任务基于 [Spark 配置](https://spark.apache.org/docs/2.4.3/configuration.html)运行。有多种方法可以设置 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`，那么您将有 9 个 Spark 执行程序，整个集群将有 90G 的执行程序内存，因为每个执行程序都有 10G 的内存。

无论指定的工作线程类型如何，都将打开 Spark 动态资源分配。如果数据集足够大，Spark 可能会将所有执行程序分配给单个 Livy 会话，因为默认情况下 `spark.dynamicAllocation.maxExecutors` 未设置。这意味着同一开发端点上的其他 Livy 会话将等待启动新的执行程序。如果数据集很小，Spark 将能够同时将执行程序分配给多个 Livy 会话。

**注意**  
有关如何在不同使用案例中分配资源，以及如何设置配置以修改行为的详细信息，请参阅 [高级配置：在多个用户之间共享开发终端节点](dev-endpoint-sharing.md)。