什么情况下应该使用集群部署模式而不是客户端?

文档https://spark.apache.org/docs/1.1.0/submitting-applications.html

描述部署模式为:

--deploy-mode: Whether to deploy your driver on the worker nodes (cluster) or locally as an external client (client) (default: client) 

使用图fig1作为指导(取自http://spark.apache.org/docs/1.2.0/cluster-overview.html ):

在这里输入图像说明

如果我启动Spark工作:

 ./bin/spark-submit \ --class com.driver \ --master spark://MY_MASTER:7077 \ --executor-memory 845M \ --deploy-mode client \ ./bin/Driver.jar 

然后, Driver Program将被MY_MASTER指定为MY_MASTER

如果我使用--deploy-mode cluster那么Driver Program将在工作节点之间共享? 如果这是真的,那么这是否意味着图1中的Driver Program框可以被丢弃(因为它不再被利用),因为SparkContext也将在工作节点之间共享?

应该使用什么条件来代替client

不,部署模式是client ,驱动程序不一定是主节点。 您可以在笔记本电脑上运行spark-submit,而Driver Program将在您的笔记本电脑上运行。

相反,当部署模式为cluster ,则使用集群pipe理器(主节点)来查找具有足够可用资源的从站来执行驱动程序。 结果,驱动程序将在一个从节点上运行。 当它的执行被委托,你不能从驱动程序得到的结果,它必须将其结果存储在文件,数据库等。

  • 客户端模式
    • 想获得工作结果(dynamic分析)
    • 更容易开发/debugging
    • 控制你的驱动程序在哪里运行
    • 总是启动应用程序:将您的Spark作业启动程序作为REST服务或Web UI公开
  • 集群模式
    • 更容易资源分配(让主人决定):火,忘了
    • 像其他工作人员一样从Master Web UI监控您的驱动程序
    • 最后停下来:一个工作完成,分配的资源被释放

我认为这可能会帮助你理解。在文档https://spark.apache.org/docs/latest/submitting-applications.html它说:“一个常见的部署策略是提交你的应用程序从物理上的网关机器; – 在您的工作机器中安装(例如独立EC2集群中的主节点)在这种设置中,客户端模式是合适的,在客户端模式下,驱动程序直接在spark-submit进程中启动,作为集群的客户端。应用程序的input和输出连接到控制台,因此这种模式特别适用于涉及REPL的应用程序(例如Spark shell)。

或者,如果您的应用程序是从远离工作人员机器的机器提交的(例如,在本地笔记本电脑上),则通常使用群集模式来尽量减less驱动程序和执行程序之间的networking延迟。 请注意,Mesos群集或Python应用程序目前不支持群集模式。“

那么HADR呢?

  • 在集群模式下,YARN重新启动驱动程序而不杀死执行程序。
  • 在客户端模式下,如果你的驱动程序被终止,YARN会自动杀死所有的执行者。