YARN 如何知道集群模式下 Apache Spark 中的数据局部性

How YARN knows data locality in Apache spark in cluster mode

假设有一个 Spark 作业将从 HDFS 中读取一个名为 records.txt 的文件并进行一些转换和一个操作(将处理后的输出写入 HDFS)。作业将提交到 YARN 集群模式

还假设 records.txt 是一个 128 MB 的文件,它的一个 HDFS 复制块也在节点 1 中

假设 YARN 正在分配是 NODE 1 内的执行程序。

YARN是如何准确的在输入数据所在的节点分配一个executor的?

谁告诉 YARN records.txt 的复制 HDFS 块之一在节点 1 中可用?

Spark 应用程序如何找到数据位置?它是由在 Application Master 中运行的 Driver 完成的吗?

YARN 知道数据局部性吗?

这里的基本问题是:

Does YARN know about the datalocality ?

YARN "knows" 应用程序告诉它什么,它了解集群的结构(拓扑)。当应用程序发出资源请求时,它可以包含特定的 位置限制 ,在分配资源时可能会或可能不会满足这些限制。

如果无法指定约束,YARN(或任何其他集群管理器)将根据其对集群拓扑的了解尝试提供最佳替代匹配。

那么如何申请"knows"?

如果应用程序使用支持某种形式的数据局部性的输入源(文件系统或其他),它可以查询相应的目录(在 HDFS 的情况下为名称节点)以获取它想要访问的数据块的位置.

从广义上讲,Spark RDD 可以定义 preferredLocations,具体取决于特定的 RDD 实现,稍后可以转化为集群管理器(不一定是 YARN)的资源约束。