2017-02-13 67 views
0

我想我不明白如何发布工作。如何启动并行火花作业?

我有一项工作需要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 \ 

如果我增加分区的数量从代码和执行者,应用程序将更快地完成,它是确定的数量。但是,如果我只增加executor-cores,结束时间是一样的,我不明白为什么。我预计时间会低于初始时间。

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

我在AWS EMR上运行此代码,在2个实例上(每个4 cpu,每个cpu有2个线程)。从我在默认EMR配置中看到的,使用CapacityScheduler将纱线设置为FIFO(默认)模式。

您对这个问题有什么看法?

回答

1

Spark根据数据源中的逻辑创建分区。在你的情况下,它可能会创建一个小于执行程序执行程序内核数量的分区,所以只是增加内核不会使它运行得更快,因为这些分区会空闲。当你也增加分区数时,它可以更快地工作。

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

顺便说一句,在集群模式下,司机也拿起一个执行器...