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()
}
网友评论