假设有一个Spark作业将从HDFS读取名为records.txt的文件,并进行一些转换和一个动作(将处理后的输出写入HDFS) . 该作业将提交到YARN群集模式
还假设records.txt是一个128 MB的文件,其中一个HDFS复制块也在NODE 1中
让我们说YARN分配是NODE 1中的执行者 .
YARN如何在输入数据所在的节点中准确分配执行程序?
谁告诉YARN在NODE 1中有一个复制的record.txt HDFS块?
如何找到数据localilty Spark应用程序?它是由在Application Master中运行的Driver完成的吗?
YARN知道数据的性质吗?
1 回答
这里的基本问题是:
YARN "knows"什么应用程序告诉它,它理解集群的结构(拓扑) . 当应用程序发出资源请求时,它可以包括特定的位置约束,这些约束在分配资源时可能会或可能不会满足 .
如果无法指定约束,YARN(或任何其他集群管理器)将根据其对集群拓扑的了解,尝试提供最佳替代匹配 .
那怎么申请"knows"?
如果应用程序使用支持某种形式的数据局部性的输入源(文件系统或其他),它可以查询相应的目录(在HDFS的情况下为namenode)以获取它想要访问的数据块的位置 .
从广义上讲,Spark RDD可以定义
preferredLocations
,具体取决于特定的RDD
实现,后者可以在以后转换为资源约束,用于集群管理器(不一定是YARN) .