DT大数据梦工厂Spark定制班笔记(007)

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")


JobHandler中最关键的一处代码就是(JobGenerator.scala 247行)

job.run()
 
  
最后附图 转自http://lqding.blog.51cto.com/9123978/1773391 感谢作者!
 
  
 
  DT大数据梦工厂Spark定制班笔记(007)_第1张图片 
  

你可能感兴趣的:(DT大数据梦工厂Spark定制班笔记(007))