Spark Streaming并发提交job

Spark job

我们都知道,spark的执行是lazy的,也就是spark的函数分为两类: Transform和action. 只有在使用action函数时,才会触发一个spark job.

串行的Spark job

在一个Spark Streaming的程序中,一个比较常见的case是,外部有一个n次循环,循环的内容里有个action函数,这样相当于说一共会有n个Spark job。基于Spark的调度策略,只有当上一个job执行完成后,下一个job才会执行,这样相当于n个作业顺序执行。scala代码如下:

// events是一个长度为n的数组,对每个元素进行了buildEvent操作,其中buildEvent函数中有个action操作。
events.map(event => event.buildEvent())

如果这n个job之间没有依赖关系的话,串行的执行会使资源利用率较低。因此,很自然就会想到能否并发的提交执行各个job。

并行提交Spark job

并行提交的思路很简单,使用threadpool, 将循环内的每个action放到不同的线程中,这样由各线程处理action逻辑。上述串行的代码逻辑就相应的改为如下:

val threadPool: ExecutorService = Executors.newCachedThreadPool
val eventService = new ExecutorCompletionService[String](threadPool)
events.map(event => eventService.submit(new buildEvent()))
//等待每个作业返回结果
for (index <- 0 until events.size) {
      val result = eventService.take.get()
     }
    原文作者:biggeng
    原文地址: https://www.jianshu.com/p/8371499296ce
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞