Spark中的客户端模式和群集模式有什么区别?

时间:2019-04-25 17:47:47

标签: apache-spark pyspark

我不确定要了解什么是客户端模式和群集模式。让我们举个例子:

我有以下内容的test.py:

if __name__ == "__main__":

conf = (SparkConf()
     .setAppName(appName)
     .set("spark.executor.memory", ?)
     .set('spark.driver.memory', ?)
     .set('spark.executor.memoryOverhead',?)
     .set("spark.network.timeout", ?)
     .set("spark.files.overwrite", ?)
     .set("spark.executor.heartbeatInterval", ?)
     .set("spark.driver.maxResultSize", ?)
     .set("spark.executor.instances", ?)
     .set("spark.executor.cores", ?)
     .set("spark.driver.cores", ?)
     .set("spark.sql.shuffle.partitions", ?)
     )
spark = SparkSession.builder.config(conf=conf).getOrCreate()

start_time = time.time()
sc = spark.sparkContext
sqlContext = SQLContext(sparkContext = sc)

我在SSH Linux服务器上工作。为了能够运行test.py,我可以做两个选择:

1-使用以下命令保留节点:

salloc --time=03:00:00 --cpus-per-task=32 --mem=0 --account=def-myName

此命令允许我将节点保留三个小时。该节点具有以下规范:

Cores: 32
Available memory:   125 gb
CPU type:   2 x Intel E5-2683 v4 "Broadwell" @ 2.1Ghz                         
Storage: 2 x 480GB SSD

现在要运行test.py,我只需键入spark-submit test.py。这种方式是否称为客户端模式或群集模式?如果是客户端模式,我该如何设置:

Master Memory:
Master Cores:
Number of Worker Nodes:
Memory per worker node (gb):
Cores per worker node:

2-我可以运行job.sh,其定义如下:

    #SBATCH --nodes=1
    #SBATCH --time=
    #SBATCH --mem=128000M
    #SBATCH --cpus-per-task=
    #SBATCH --ntasks-per-node=
    #SBATCH --output=sparkjob-%j.out
    #SBATCH --mail-type=ALL
    #SBATCH --error=
    ## send mail to this address
    #SBATCH --mail-user=

    spark-submit --total-executor-cores xxx --driver-memory xxxx test.py
....

然后我用sbatch job.sh执行代码。这种方式称为集群方式吗?

2 个答案:

答案 0 :(得分:1)

客户端模式中,驱动程序(执行本地任务)设置在运行spark-submit的服务器上。 执行器由资源管理器(纱线或mesos)动态地分配到具有您请求的资源的任何节点上。

集群模式中,驱动程序也是由资源管理器动态分配的,因此可以位于群集的任何节点上。

您可以在https://stackoverflow.com/a/41142747/8467558上阅读更多内容。

用于部署模式的spark-submit内联命令为--deploy-mode

Usage: spark-submit [options] <app jar | python file | R file> [app arguments]
Usage: spark-submit --kill [submission ID] --master [spark://...]
Usage: spark-submit --status [submission ID] --master [spark://...]
Usage: spark-submit run-example [options] example-class [example args]

Options:
  --master MASTER_URL         spark://host:port, mesos://host:port, yarn,
                              k8s://https://host:port, or local (Default: local[*]).
  --deploy-mode DEPLOY_MODE   Whether to launch the driver program locally ("client") or
                              on one of the worker machines inside the cluster ("cluster")
                              (Default: client).

如果未设置,则默认为您的spark-defaults.conf配置值spark.submit.deployMode。如果没有默认配置,或者未设置此值,则为client

答案 1 :(得分:1)

有关何时使用一个或另一个选项的一些补充信息。

如前所述,当您在 client模式下运行spark-submit时,驱动程序将在执行spark-submit命令的计算机上运行。这也意味着您将能够通过命令行从同一台计算机上监控作业的执行。因此,如果终止命令行,则终止驱动程序并最终终止Spark作业。因此,您应该在生产中使用客户端模式。

集群模式的情况下,驱动程序将在群集上任意节点中的某个位置运行。这意味着您需要另一种方式来监视Spark作业,即Spark UI。

您可能已经猜到,当在生产和/或测试环境中使用集群模式时,客户端模式对于在本地计算机上测试作业很有用。

并回答您的问题:

1)默认模式是客户端模式,因此当您键入以下内容时:

spark-submit --total-executor-cores xxx --driver-memory xxxx test.py

这将在客户端模式下执行。

2)如果要以群集模式执行作业,则必须键入:

spark-submit --total-executor-cores xxx --driver-memory xxxx --deploy-mode cluster test.py