Jupyter笔记本执行器是否在Apache Spark中动态分配?

时间:2016-08-19 07:44:05

标签: python apache-spark pyspark jupyter jupyter-notebook

我有一个问题是为了更好地理解Apache Hadoop Spark中的大数据概念。不确定这个论坛是否偏离主题,但请告诉我。

想象一下Apache Hadoop集群,其中包含由Yarn资源管理器管理的8台服务器。我将文件上传到HDFS(文件系统),配置为64MB blocksize,复制计数为3.然后将该文件拆分为64MB的块。现在让我们想象一下,这些块由HDFS分配到节点1,2和3上。

但现在我用Jupyter笔记本编写了一些Python代码。因此,使用此命令启动笔记本:

  

PYSPARK_DRIVER_PYTHON = jupyter PYSPARK_DRIVER_PYTHON_OPTS =" notebook"   pyspark --master yarn-client --num-executors 3 --executor-cores 4   --executor-memory 16G

在笔记本中我从HDFS加载文件以进行一些分析。当我执行我的代码时,我可以在YARN Web-UI中看到我有3个执行程序以及如何将作业提交(分发)给执行程序。

有趣的是,我的执行器在启动命令之后立即被固定到特定的计算节点(见上文)。例如节点6,7和8.

我的问题是:

  1. 我的假设是否正确,执行器节点是否固定在计算节点上,一旦我从HDFS访问(加载)文件,HDFS块就会被转移到执行器上?
  2. 或者,是否在数据所在的节点(节点1,2和3)上动态分配和启动执行程序。在这种情况下,我在YARN网站上的观察结果肯定是错误的。
  3. 我真的很想更好地理解这一点。

    cluster setup

1 个答案:

答案 0 :(得分:4)

  

Jupyter笔记本执行器是否在Apache Spark中动态分发

为了清楚起见,让我们区分

  • Jupyter笔记本及其相关内核 - 内核是笔记本UI背后的Python流程。内核执行您键入的任何代码并在笔记本中提交。内核由Jupyter管理,而不是Spark。

  • Spark执行程序 - 这些是在YARN群集上分配的计算资源,用于执行spark作业

  • HDFS数据节点 - 这些是您的数据所在的位置。数据节点可能与执行程序节点相同或不同。

  

我的假设是否正确,执行器节点是固定在计算节点上的,一旦我从HDFS访问(加载)文件,HDFS块就会被传送到执行程序

是和否 - 是的,Spark在计划工作时会考虑data locality。不,没有保证。根据{{​​3}}:

(...)有两个选项:a)等待忙碌的CPU释放以启动同一服务器上的数据任务,或b)立即在更远的地方启动新任务需要在那里移动数据。 Spark通常会做的是等待繁忙的CPU释放的希望。一旦超时到期,它就开始将数据从远处移动到空闲CPU。 (...)

  

或者,是否在数据所在的节点(节点1,2和3)上动态分配和启动执行程序。

这取决于配置。通常,执行器动态地分配给spark应用程序(即SparkContext),并且在不再使用时被解除分配。但是,根据Spark documentation

,执行程序会保留一段时间

(...)Spark应用程序在空闲时间超过spark.dynamicAllocation.executorIdleTimeout秒时删除执行程序。(...)

为了更好地控制在哪里运行,您可以使用Job scheduling documentation