Spark 中的纱线客户端模式是啥?

Posted

技术标签:

【中文标题】Spark 中的纱线客户端模式是啥?【英文标题】:What is yarn-client mode in Spark?Spark 中的纱线客户端模式是什么? 【发布时间】:2014-01-14 15:10:47 【问题描述】:

Apache Spark 最近将版本更新到 0.8.1,其中yarn-client 模式可用。我的问题是,yarn-client 模式的真正含义是什么?在文档中它说:

使用 yarn-client 模式,应用程序将在本地启动。就像在 Local / Mesos / Standalone 模式下运行应用程序或 spark-shell 一样。启动方式也和他们类似,只要确保当你需要指定master url时,使用“yarn-client”代替

“本地启动”是什么意思?当地哪里?在 Spark 集群上? 与 yarn-standalone 模式的具体区别是什么?

【问题讨论】:

【参考方案1】:

所以在 spark 中你有两个不同的组件。有司机和工人。在纱线集群模式下,驱动程序在数据节点上远程运行,工作人员在单独的数据节点上运行。在纱线客户端模式下,驱动程序位于启动作业的机器上,工作人员位于数据节点上。在本地模式下,司机和工人在开始工作的机器上。

当您运行 .collect() 时,来自工作节点的数据会被拉入驱动程序。它基本上是最后一点处理发生的地方。

就我自己而言,我发现当我在家使用 *** 时,yarn-cluster 模式会更好,但当我在数据中心内运行代码时,yarn-client 模式会更好。

Yarn-client 模式也意味着您可以为驱动程序少一个工作节点。

【讨论】:

很好的解释... :) 这是一个很好的解释。谢谢。【参考方案2】:

一个 Spark 应用程序由一个驱动程序和一个或多个执行程序组成。驱动程序是主程序(您在其中实例化SparkContext),它协调执行程序以运行 Spark 应用程序。执行器运行由驱动程序分配的任务。

YARN 应用程序具有以下角色:yarn 客户端、yarn 应用程序主控器和在节点管理器上运行的容器列表。

当 Spark 应用程序在 YARN 上运行时,它有自己的纱线客户端和纱线应用程序主控实现。

在这些背景下,主要区别在于驱动程序的运行位置。

    Yarn 独立模式:您的驱动程序作为 yarn 应用程序主线程的线程运行,它本身在集群中的一个节点管理器上运行。 Yarn 客户端只是从应用程序主机中提取状态。此模式与 mapreduce 作业相同,MR 应用程序主机协调容器以运行 map/reduce 任务。 Yarn 客户端模式:您的驱动程序运行在 Yarn 客户端上,您可以在其中键入命令提交 Spark 应用程序(可能不是 Yarn 集群中的机器)。在这种模式下,虽然驱动程序是在客户端机器上运行,但任务是在 YARN 集群的节点管理器中的执行器上执行的。

参考:http://spark.incubator.apache.org/docs/latest/cluster-overview.html

【讨论】:

所以如果服务器上没有安装hadoop,这意味着它没有Yarn,在这种情况下我不能在集群模式下运行spark作业,是否正确【参考方案3】:

运行在其中的 Spark 应用程序

yarn-client 模式:

    驱动程序在客户端机器或应用程序启动的本地机器上运行。

    资源分配由YARN资源管理器根据数据节点上的数据局部性完成,本地机器的驱动程序将控制spark集群上的执行器(节点管理器)。

请参阅此 cloudera article 了解更多信息。

standalone模式和yarn部署模式的区别,

    资源优化在独立模式下效率不高。 在独立模式下,驱动程序会在集群的每个节点中启动一个执行程序,而与数据位置无关。 独立适用于仅执行 Spark 应用程序且集群不需要以高效方式为其他作业分配资源的用例。

【讨论】:

【参考方案4】:

spark和yarn都是分布式框架,但作用不同:

Yarn 是一个资源管理框架,对于每个应用程序,它都有以下角色:

ApplicationMaster:单个应用程序的资源管理,包括为应用程序和监视器从 Yarn 请求/释放资源。

尝试:尝试只是一个正常的过程,它完成了应用程序的整个工作的一部分。比如一个mapreduce作业,它由多个mapper和reducer组成,每个mapper和reducer都是一个Attempt。

将应用程序提交到 yarn 的常见过程是:

    客户端向yarn提交应用请求。在里面 请求,Yarn 应该知道 ApplicationMaster 类;为了 SparkApplication,它是 org.apache.spark.deploy.yarn.ApplicationMaster,用于 MapReduce 作业, 它是org.apache.hadoop.mapreduce.v2.app.MRAppMaster

    Yarn 为 ApplicationMaster 进程分配一些资源并 在其中一个集群节点中启动 ApplicationMaster 进程;

    ApplicationMaster 启动后,ApplicationMaster 会从 Yarn 中为这个 Application 请求资源并启动 worker;

对于分布式计算框架Spark来说,一个计算作业被分成许多小任务,每个Executor负责每个任务,Driver会收集所有Executor任务的结果,得到一个全局的结果。 Spark 应用程序只有一个驱动程序和多个执行程序。

那么,当 Spark 使用 Yarn 作为集群中的资源管理工具时,问题就来了:

在 Yarn Cluster 模式下,Spark 客户端将提交 Spark 应用程序到 yarn,Spark Driver 和 Spark Executor 都在监管之下 纱线。从 yarn 的角度来看,Spark Driver 和 Spark Executor 有 没有区别,但正常的java进程,即一个应用程序 工作进程。因此,当客户端进程消失时,例如客户端 进程被终止或杀死,纱线上的 Spark 应用程序是 仍在运行。

在yarn客户端模式下,只有Spark Executor在 纱线的监督。 Yarn ApplicationMaster 将请求资源 只是火花执行者。驱动程序在客户端运行 与yarn无关的过程,只是一个提交的过程 应用到纱线。所以,当客户离开时,例如客户 进程退出,Driver宕机,计算终止。

【讨论】:

【参考方案5】:

首先,让我们弄清楚在独立模式下运行 Spark 和在集群管理器(Mesos 或 YARN)上运行 Spark 之间的区别。


在独立模式下运行 Spark 时,您有:

一个 Spark 主节点 一些 Spark 从属节点,已向 Spark 主节点“注册”

所以:

主节点将执行 Spark 驱动程序,将任务发送给执行程序,并且还将执行任何资源协商,这是非常基本的。例如,默认情况下,每个作业都会消耗所有现有资源。 从节点将运行 Spark 执行器,运行从驱动程序提交给它们的任务。

当使用集群管理器时(我将描述 YARN,这是最常见的情况),您有:

YARN 资源管理器(持续运行),接受对新应用程序和新资源(YARN 容器)的请求 多个 YARN 节点管理器(持续运行),由工作人员池组成,资源管理器将在其中分配容器。 Application Master(在 YARN 应用程序期间运行),负责从资源管理器请求容器并向分配的容器发送命令。

请注意,在这种情况下有 2 种模式:cluster-modeclient-mode。在客户端模式下,也就是你提到的那个:

Spark 驱动程序将在执行命令的机器中运行。 Application Master 将在集群中分配的容器中运行。 Spark 执行器将在分配的容器中运行。 Spark 驱动程序将负责指示 Application Master 请求资源并向分配的容器发送命令,接收它们的结果并提供结果。

那么,回到你的问题:

“本地启动”是什么意思?当地哪里?在火花上 集群?

本地表示在您正在执行命令的服务器中(可以是spark-submitspark-shell)。这意味着您可以在集群的主节点中运行它,或者您也可以在集群外部的服务器(例如您的笔记本电脑)中运行它,只要适当的配置到位,以便该服务器可以与集群通信并反之亦然。

与yarn-standalone模式的具体区别是什么?

如上所述,不同之处在于,在独立模式下,根本没有集群管理器。此article 提供了对每种模式的所有差异的更详细的分析和分类。

【讨论】:

【参考方案6】:

使用 yarn-client 模式,您的 spark 应用程序正在本地机器上运行。在 yarn-standalone 模式下,您的 spark 应用程序将作为 yarn ApplicationMaster 提交到 YARN 的 ResourceManager,并且您的应用程序在运行 ApplicationMaster 的 yarn 节点中运行。 在这两种情况下,yarn 都充当 spark 的集群管理器。您的应用程序(SparkContext)将任务发送到纱线。

【讨论】:

以上是关于Spark 中的纱线客户端模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

纱线集群模式下的 Pyspark

无法在纱线簇模式下读取带有火花的Hbase数据

spark 提交 pyspark 脚本上的纱线投掷超过最大递归深度

纱线上的哪个目录触发应用程序将其日志输出到?每个节点中的 spark.eventLog.dir 或 var/log/?

如何提高纱线应用并行度

锁文件解释,每一行到底是啥意思?纱线锁