Spark Streaming源码解读之JobScheduler内幕实现和深度思考
接前文Spark Streaming JobSet的提交
JobGenerator.scala (253行)
jobScheduler.submitJobSet(JobSet(time, jobs, streamIdToInputInfos))
我们下面看一下JobScheduler中submitJobSet的实现 (JobScheduler.scala 139-148行)
def submitJobSet(jobSet: JobSet) { if (jobSet.jobs.isEmpty) { logInfo("No jobs added for time " + jobSet.time) } else { listenerBus.post(StreamingListenerBatchSubmitted(jobSet.toBatchInfo)) jobSets.put(jobSet.time, jobSet) jobSet.jobs.foreach(job => jobExecutor.execute(new JobHandler(job))) logInfo("Added jobs for time " + jobSet.time) } }
关键之处是job被封装成为JobHandler对象并交由jobExecutor进行执行。
jobExecutor是一个线程池,线程的个数由参数配置。如果需要多个job同时运行,比如在同一个batchInterval中有多个output,则需要配置该参数。
代码如下(JobScheduler.scala 50-52行):
private val numConcurrentJobs = ssc.conf.getInt("spark.streaming.concurrentJobs", 1) private val jobExecutor = ThreadUtils.newDaemonFixedThreadPool(numConcurrentJobs, "streaming-job-executor")
job.run()
最后附图 转自http://lqding.blog.51cto.com/9123978/1773391 感谢作者!