我有一个问题是为了更好地理解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.
我的问题是:
答案 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。