Mat*_*ias 2 python apache-spark pyspark jupyter jupyter-notebook
我有一个问题是为了更好地理解 Apache Hadoop Spark 中的大数据概念。不确定它在本论坛中是否偏离主题,但请告诉我。
想象一个 Apache Hadoop 集群有 8 个服务器,由 Yarn 资源管理器管理。我将一个文件上传到 HDFS(文件系统),该文件配置了 64MB 块大小和 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。
我的问题是:
我真的很想更好地理解这一点。
Jupyter notebook 执行器是否在 Apache Spark 中动态分布
为了清楚起见,让我们区分
Jupyter 笔记本及其相关内核 - 内核是笔记本 UI 背后的 Python 进程。内核会执行您在笔记本中键入和提交的任何代码。内核由 Jupyter 管理,而不是由 Spark 管理。
Spark 执行器 - 这些是在 YARN 集群上分配的用于执行 Spark 作业的计算资源
HDFS 数据节点 - 这些是您的数据所在的位置。数据节点可能与执行器节点相同,也可能不同。
我的假设是否正确,即执行器节点固定到计算节点,并且一旦我从 HDFS 访问(加载)文件,HDFS 块将被传输到执行器
是和否 - 是的,Spark在计划作业时会考虑数据局部性。不,没有保证。根据Spark 文档:
(...) 有两种选择:a) 等到繁忙的 CPU 腾出时间来启动同一服务器上的数据任务,或者 b) 立即在需要移动数据的较远地方启动新任务。Spark 通常做的是稍等片刻,希望繁忙的 CPU 腾出时间。一旦超时到期,它就会开始将数据从远处移动到空闲 CPU。(……)
或者,执行器是否在数据所在的节点(节点 1、2 和 3)上动态分配和启动。
这取决于配置。通常,执行器会动态分配给 Spark 应用程序(即 SparkContext),并在不再使用时解除分配。但是,根据作业调度文档,执行程序会保持活动一段时间:
(...) Spark 应用程序在空闲时间超过 spark.dynamicAllocation.executorIdleTimeout 秒时删除执行程序。(...)
为了更好地控制运行位置,您可以使用Scheduler Pools。
| 归档时间: |
|
| 查看次数: |
1874 次 |
| 最近记录: |