什么情况下应该使用集群部署模式而不是客户端?
文档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会自动杀死所有的执行者。