我有一个关于这张图片的问题,我在下面的教程。因此,在基于Yarn的体系结构中,基于此图像,spark应用程序的执行是否如下所示:
首先,您有一个在客户机节点或某个数据节点上运行的驱动程序。这个驱动程序(类似于java中的驱动程序?)由您提交到spark上下文的代码(用java、python、scala等编写)组成。然后,spark上下文表示到hdfs的连接,并将您的请求提交给hadoop生态系统中的资源管理器。然后,资源管理器与name节点通信,以确定集群中哪些数据节点包含客户机节点请求的信息。spark上下文还将在运行任务的worker节点上放置一个执行器。然后节点管理器将启动executor,executor将运行spark上下文赋予它的任务,并将客户机请求的数据从hdfs返回给驱动程序。
以上解释正确吗?
驱动程序是否会向每个数据节点发送三个执行器以从hdfs检索数据,因为hdfs中的数据会在不同的数据节点上复制三次?
1条答案
按热度按时间vlju58qv1#
你的解释接近现实,但似乎在某些方面你有点困惑。
让我看看能不能把这件事告诉你。
假设您有scala中的单词计数示例。
在每个spark作业中都有一个初始化步骤,创建一个sparkcontext对象,提供一些配置,如appname和master,然后读取一个输入文件,对其进行处理,并将处理结果保存在磁盘上。除了进行实际处理的匿名函数(传递到.flatmap、.map和reducebykey的函数)以及在集群上远程运行的i/o函数textfile和saveastextfile之外,所有这些代码都在驱动程序中运行。
在这里,驱动程序是在同一个节点上本地运行的程序部分的名称,在这个节点上使用spark submit提交代码(在您的图片中称为client node)。您可以从任何机器(clientnode、wordernode甚至masternode)提交代码,只要您有spark submit和对您的yarn集群的网络访问权。为了简单起见,我将假设客户机节点是您的笔记本电脑,而yarn集群是由远程机器组成的。
为了简单起见,我将省略这个图片缩放器,因为它用于为hdfs提供高可用性,并且不涉及运行spark应用程序。我必须提到,yarn resource manager和hdfs namenode是yarn和hdfs中的角色(实际上它们是在jvm中运行的进程),它们可以位于同一主节点或不同的机器上。即使是yarn节点管理器和数据节点也只是角色,但它们通常位于同一台机器上,以提供数据位置(靠近数据存储位置的处理)。
提交应用程序时,您首先联系资源管理器,该管理器与namenode一起尝试查找可用于运行spark任务的工作节点。为了利用数据局部性原则,资源管理器将优先选择在同一台机器上存储hdfs块(每个块的3个副本中的任意一个)的工作节点来处理您必须处理的文件。如果没有具有这些块的工作节点可用,它将使用任何其他工作节点。在这种情况下,由于数据在本地不可用,因此必须通过网络将hdfs块从任何数据节点移动到运行spark任务的节点管理器。这个过程是为每个生成文件的块完成的,因此有些块可以在本地找到,有些块必须移动。
当resourcemanager找到一个可用的worker节点时,它将联系该节点上的nodemanager,并要求它创建一个运行spark执行器的容器(jvm)。在其他集群模式(mesos或standalone)中,虽然没有Yarn容器,但spark executor的概念是相同的。spark执行器作为jvm运行,可以运行多个任务。
客户机节点上运行的驱动程序和spark执行器上运行的任务保持通信以运行作业。如果驱动程序在你的笔记本电脑上运行,而你的笔记本电脑崩溃了,你将失去与任务的连接,你的工作将失败。这就是为什么当spark在一个yarn集群中运行时,您可以指定是在膝上型电脑“-deploy mode=client”上运行驱动程序,还是在yarn集群上作为另一个yarn容器“-deploy mode=cluster”运行驱动程序。有关更多详细信息,请参阅spark submit