如何启动并行火花作业?

时间:2017-02-13 16:30:34

标签: apache-spark pyspark

我认为我不太了解如何开展工作。

我有一份工作需要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上运行此代码,在2个实例上(每个4个cpu,每个cpu有2个线程)。根据我在默认EMR配置中看到的情况,使用CapacityScheduler将纱线设置为FIFO(默认)模式。

您如何看待这些问题?

1 个答案:

答案 0 :(得分:1)

Spark基于数据源内的逻辑创建分区。在您的情况下,它可能会创建一些小于执行程序*执行程序核心数的分区,因此只是增加核心不会使它运行得更快,因为它们将是空闲的。当您还增加分区数量时,它可以更快地工作。

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

BTW记得在集群模式下,驱动程序也会占用执行程序......