Spark纱线架构

LP4*_*496 10 hadoop scala hdfs apache-spark

在此输入图像描述

在我关注的教程中,我对此图像有疑问.因此,在基于纱线的体系结构中基于此图像,spark应用程序的执行看起来像这样:

首先,您有一个在客户端节点或某个数据节点上运行的驱动程序.在这个驱动程序中(类似于java中的驱动程序?)包含您提交给Spark Context的代码(用java,python,scala等编写).然后,spark上下文表示与HDFS的连接,并将您的请求提交给Hadoop生态系统中的资源管理器.然后,资源管理器与Name节点通信,以确定集群中的哪些数据节点包含客户机节点要求的信息.spark上下文还会将一个执行程序放在将运行任务的worker节点上.然后,节点管理器将启动执行程序,该执行程序将运行Spark Context提供给它的任务,并将客户端要求的数据从HDFS返回给驱动程序.

以上解释是否正确?

此外,驱动程序还会向每个数据节点发送三个执行程序以从HDFS检索数据,因为HDFS中的数据在各种数据节点上被复制3次?

Pin*_*San 12

你的解释接近现实,但似乎你在某些方面有点困惑.

让我们看看我能否让你更清楚.

假设你在Scala中有单词count的例子.

object WordCount {
    def main(args: Array[String]) {
      val inputFile = args(0)
      val outputFile = args(1)
      val conf = new SparkConf().setAppName("wordCount")

      val sc = new SparkContext(conf)

      val input =  sc.textFile(inputFile)

      val words = input.flatMap(line => line.split(" "))

      val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}

      counts.saveAsTextFile(outputFile)
    }
}
Run Code Online (Sandbox Code Playgroud)

在每个spark作业中,您都有一个初始化步骤,您可以在其中创建一个SparkContext对象,提供一些配置,如appname和master,然后您读取一个inputFile,您可以处理它并将处理结果保存在磁盘上.所有这些代码都在Driver中运行,除了进行实际处理的匿名函数(函数传递给.flatMap,.map和reduceByKey)以及在集群上远程运行的I/O函数textFile和saveAsTextFile.

这里DRIVER是在同一节点上本地运行的程序部分的名称,您在该节点上使用spark-submit提交代码(在您的图片中称为客户端节点).只要您具有对YARN群集的spark-submit和网络访问权限,您就可以从任何计算机(ClientNode,WorderNode甚至MasterNode)提交代码.为简单起见,我假设客户端节点是您的笔记本电脑,而Yarn集群是由远程机器组成的.

为简单起见,我将不再使用Zookeeper,因为它用于为HDFS提供高可用性,并且它不参与运行spark应用程序.我不得不提到Yarn Resource Manager和HDFS Namenode是Yarn和HDFS中的角色(实际上它们是在JVM中运行的进程),它们可以位于同一主节点或不同的机器上.甚至纱线节点管理器和数据节点也只是角色,但它们通常位于同一台机器上以提供数据局部性(处理接近存储数据的位置).

提交应用程序时,首先联系资源管理器,与NameNode一起尝试查找可用于运行spark任务的工作节点.为了利用数据局部性原则,资源管理器将更喜欢存储在同一台机器上的工作节点HDFS块(每个块的3个副本中的任何一个)用于您必须处理的文件.如果没有具有这些块的工作节点可用,则它将使用任何其他工作节点.在这种情况下,由于数据在本地不可用,因此必须通过网络将HDFS块从任何数据节点移动到运行spark任务的节点管理器.对于创建文件的每个块都执行此过程,因此可以在本地找到一些块,有些块必须移动.

当ResourceManager找到可用的工作节点时,它将联系该节点上的NodeManager并要求它创建一个Yarn Container(JVM)来运行spark执行器.在其他集群模式(Mesos或Standalone)中,您将没有Yarn容器,但spark executor的概念是相同的.spark执行器作为JVM运行,可以运行多个任务.

在客户机节点上运行的驱动程序和在spark执行程序上运行的任务保持通信以便运行您的作业.如果驱动程序在您的笔记本电脑上运行而您的笔记本电脑崩溃,您将失去与任务的连接,您的工作将失败.这就是为什么当火花在Yarn集群中运行时,您可以指定是否要在笔记本电脑上运行驱动程序"--deploy-mode = client"或在纱线集群上运行另一个纱线容器"--deploy-mode = cluster ".有关更多详细信息,请参阅spark-submit