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

What conditions should cluster deploy mode be used instead of client?

文档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,如 fig1 MY_MASTER

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

什么条件下应该使用 cluster 而不是 client

不,当部署模式为client时,驱动程序不一定是主节点。您可以 运行 在笔记本电脑上提交 spark-submit,然后驱动程序会 运行 在您的笔记本电脑上。

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

  • 客户端模式
    • 想得到工作结果(动态分析)
    • developing/debugging
    • 更容易
    • 控制你的驱动程序运行宁
    • Always up 应用程序:将您的 Spark 作业启动器公开为 REST 服务或 Web UI
  • 集群模式
    • 更容易分配资源(让主人决定):即发即弃
    • 像其他工作人员一样从 Master Web UI 监控您的驱动程序
    • 最后停止:一个作业完成,分配的资源被释放

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

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

HADR 怎么样?

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