我不确定要了解什么是客户端模式和群集模式。让我们举个例子:
我有以下内容的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
执行代码。这种方式称为集群方式吗?
答案 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