Apache spark 如何启动并行spark作业?

Apache spark 如何启动并行spark作业?,apache-spark,pyspark,Apache Spark,Pyspark,我想我对如何开展工作了解不够 我有一项工作需要60秒才能完成。我使用以下命令运行它: spark-submit --executor-cores 1 \ --executor-memory 1g \ --driver-memory 1g \ --master yarn \ --deploy-mode cluster \ --conf spark.dynamicAllo

我想我对如何开展工作了解不够

我有一项工作需要60秒才能完成。我使用以下命令运行它:

spark-submit --executor-cores 1 \
             --executor-memory 1g \
             --driver-memory 1g \
             --master yarn \
             --deploy-mode cluster \
             --conf spark.dynamicAllocation.enabled=true \
             --conf spark.shuffle.service.enabled=true \
             --conf spark.dynamicAllocation.minExecutors=1 \
             --conf spark.dynamicAllocation.maxExecutors=4 \
             --conf spark.dynamicAllocation.initialExecutors=4 \
             --conf spark.executor.instances=4 \
如果我增加代码中的分区数和执行器数,应用程序将更快完成,这没关系。但是如果我只增加执行器内核,那么完成时间是相同的,我不明白为什么。我预计时间将低于初始时间

我的第二个问题是,如果我启动两次以上的代码,我希望这两项工作都能在60秒内完成,但这不会发生。这两项工作都在120秒后完成,我不明白为什么

我在AWS EMR上运行此代码,每个实例4个cpu,每个cpu有2个线程。从我在默认EMR配置中看到的情况来看,纱线使用CapacityScheduler设置为五阶故障模式


您如何看待这个问题?

Spark根据数据源内部的逻辑创建分区。在您的情况下,它可能创建的分区数量小于executors*executor core的数量,因此仅仅增加core不会使它运行得更快,因为这些分区是空闲的。当您同时增加分区数时,它可以更快地工作

当您运行spark submit两次时,动态分配很有可能在第二次开始之前达到执行器的最大分配。在您的情况下,默认情况下需要约4秒。根据纱线的定义方式,这可能会填满所有可用的执行器,这可能是因为定义的线程数太少,也可能是因为内存已满。在任何情况下,如果确实发生这种情况,则第二次spark submit将不会开始处理,直到某个执行者被释放,这意味着它需要时间的总和

顺便说一句,请记住,在集群模式下,驱动程序也会占用一个执行器