Apache spark Spark执行器内存与作业时间

Apache spark Spark执行器内存与作业时间,apache-spark,pyspark,Apache Spark,Pyspark,我是pyspark的初学者,很难理解对执行器内存的更改是如何影响作业运行时间的。 我使用不同的配置运行代码(下面共享),并在减少执行器内存时意识到——我的工作占用的时间更少。谁能告诉我背后的原因吗。 我在pyspark代码下面运行: spark = SparkSession.builder.enableHiveSupport().getOrCreate() hiveCtx = HiveContext(spark) base_df = hiveCtx.sql("select * from base

我是pyspark的初学者,很难理解对执行器内存的更改是如何影响作业运行时间的。 我使用不同的配置运行代码(下面共享),并在减少执行器内存时意识到——我的工作占用的时间更少。谁能告诉我背后的原因吗。 我在pyspark代码下面运行:

spark = SparkSession.builder.enableHiveSupport().getOrCreate()
hiveCtx = HiveContext(spark)
base_df = hiveCtx.sql("select * from base_table")
base_df.count()
基本表数据:
7.4 GB

Configurations :
CASE 1
--driver-memory 4g --executor-memory 10g --executor-cores 10 --num-executors 2 \   - JOB TIME : 36 secs
CASE 2
--driver-memory 4g --executor-memory 6g --executor-cores 10 --num-executors 2 \   - JOB TIME : 19 secs
CASE 3
--driver-memory 4g --executor-memory 2g --executor-cores 10 --num-executors 2 \   - JOB TIME : 12 secs


还有一个问题:在案例3中,我有'executor memory'2GB和'num executors'2,这意味着总共有4GB,我的数据是7.4 GB(这远远超过我分配的资源,即仅4GB)。那为什么我的性能越来越好呢。

首先是内存分配和内存分配

内存的分配和取消分配需要时间。。。取决于你的资源经理。所以20克在第二秒15秒的差异是有意义的

您的群集上是否运行其他concurent任务

对于案例3,配置单元表具有分区,spark逐分区运行进程,因此内存中没有完整的数据集。您将同时在内存中有~2*10个分区

如果你不想了解更多关于你的任务的概要信息,请转到Spark History Ui,你将获得每个任务的任务时间量和Spark作业的时间图。查看Spark历史记录文档。
我要检查的第一件事是运行这三种配置的执行计划是否完全相同。当资源分配不同时,执行计划可能不同。要查看三种配置中每种配置的物理计划,请在“sql”操作符之后插入“explain”操作符,如下所示:
hiveCtx.sql(“从基本表中选择*).explain()
。实际计划将打印在驾驶员日志中

计划的格式如下所示:

== Physical Plan ==
    *(1) FileScan parquet default.src[key#10,value#11] Batched: true, Format: Parquet, Location: InMemoryFileIndex[file:/home/spark-work/spark-warehouse/src], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<key:int,value:string>
==物理计划==
*(1) FileScan parquet default.src[key#10,value#11]批处理:true,格式:parquet,位置:InMemoryFileIndex[file:/home/spark work/spark warehouse/src],PartitionFilters:[],PushedFilters:[],ReadSchema:struct

我的群集中没有运行其他spark作业,只有少数几个给出查询。另外,你的意思是这额外的时间仅仅是因为资源分配?检查Spark History Ui以确认它,但我感觉到了。