Spark Streaming源码阅读(1)SparkSession和SparkContext

(一)SparkSession:

SparkSession是Spark程序以及用来创建DataSet和DataFrame 的入口类, SparkSession实质上是用来合并这一系列的Context(未来可能还会加上StreamingContext),所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。

通用的getOrCreate()接口通过建造者模式(builder)进行对SparkSession的创建,首先会进行判断是否含有线程私有的SparkSession,没有的话再去寻找全局的SparkSession,若再没有就会手动创建并把他作为全局默认的SparkSession. 并在之后对用户的程序进行判断,是否定义了extension等配置.

(二)SparkContext

另外一种意义上的Spark入口类,SparkContext相当于连接Spark集群的纽带,并用来在集群中创建RDD、accumulators、broadCast变量.一个JVM只允许有一个SparkContext.所以在创建新的SparkContext之前必须调用stop()来停掉当前活跃的SparkContext(源码注释中标注:该限制将逐渐被移除[Spark-2243], 但是根据言论:动态分配并不能增大Executors的heap memory size, 并且一个JVM中如果跑了多种不同的task,一个Executor也不能同时适应io敏感型、内存敏感型、CPU敏感型的task,遂issue.close())

SparkContext会创建2个重要的对象分别为DAGScheduler和TaskScheduler 以及Spark的执行环境、SparkUI、以及注册 HeartbeatReceiver 心跳接收器以便Driver进程 完成对Executor的管理.

在SparkContext中主要有个runJob方法通过dagScheduler.runJob => submitJob , 在submitJob方法中将会新生成一个JobWaiter

通过一个jobPromise变量来反映任务的完成状态,DAGScheduler会调用eventProcessLoop.post(实质就是把task提交到EventLoop的阻塞队列当中),eventloop通过new一个守护进程不停的轮询队列,并take获取已提交到队列中的事件进行处理(未完待续).

猜你喜欢

转载自blog.csdn.net/qq_38835878/article/details/84322708
今日推荐