StreamingContext详解,输入DStream和Reveiver详解

一、StreamingContext详解

1.1两种创建StreamingContext的方式

val conf = new SparkConf.setAppName(appName).setMaster(master);
val scc = new StreamingContext(conf,Seconds(1));



StreamingContext,还可以使用已有的SparkContext来创建

val sc = new SparkContext(conf);
val ssc = new StreamingContext(sc,Seconds(1));

appName,是用来在Spark UI上显示的应用名称。

master,是一个Spark、Mesos或者Yarn集群的URL,或者是local[*]。

batch interval可以根据你的应用程序的延迟要求以及可用的集群资源情况来设置。

1.2SteamingContext定义之后,必须做的事情

  1. 通过创建输入DStream来创建输入数据源。
  2. 通过对DStream定义transformation和output算子操作,来定义实时计算逻辑。
  3. 调用StreamingContext的start()方法,来开始实时处理数据。
  4. 调用StreamingContext的awaitTermination()方法,来等待应用程序的终止。可以使用CTRL+C手动停止,或者就是让它持续不断的运行进行计算。
  5. 可以通过调用StreamingContext的Stop()方法,来停止应用程序。

1.3注意要点

  1. 只要一个StreamingContext启动之后,就不能再往其中添加任何计算逻辑了。比如执行start()方法之后,还给某个DStream执行一个算子。
  2. 一个StreamingContext停止之后,是肯定不能够重启的。调用stop()之后,不能再调用start()。
  3. 一个JYM同时只能有一个StreamingContext启动,在你的应用程序中,不能创建两个StreamingContext。
  4. 调用stop()方法时,会同时停止内部的SparkContext,如果不希望如此,还希望后面继续使用SparkContext创建其他类型的Context,比如SQLContext,那么就用stop(false)。
  5. 一个SparkContext可以创建多个StreamingContext,只要上一个先用stop(false)停止,在创建下一个接口。

二、DStream和Receiver详解

输入DStream代表了来自数据源的输入数据流。

除了文件数据流之外,所有的输入DStream都会绑定一个Receiver对象,该对象是一个关键的组件,用来数据源接收数据,并将其存储在Spark的内存中,以供后续处理。

2.1 Spark Streaming提供了两种内置的数据源支持

  1. 基础数据源:StreamingContext API中直接提供了对这些数据源的支持,比如文件、socket、Akka Actor等,
  2. 高级数据源:诸如Kafka、Flume、Kinesis、Twitter等数据源,通过第三方工具类提供支持。这些数据源的使用,需要引用其依赖。
  3. 自定义数据源:

如果想要在实时计算应用中并行接收多条数据流,可以创建多个输入DStream。这样就会创建多个Reveiver,从而并行地接收多个数据流。

但是,一个Spark Streaming Application的Executor,是一个长时间运行的任务,因此,它会独占分配给Spark Streaming Application的cpu core。从而只要Spark Streaming运行起来以后,这个节点上的cpu core,就没法给其他应用使用了。

使用本地模式,运行程序时,绝对不能使用local或者local[1],因为那样,只会给执行输入DStream的executor分配一个线程。而Spark Streaming底层的原理是,至少有两条线程,一条线程用来分配给Reveiver接收数据,一条线程用来处理接收到的数据。

因此,必须使用local[n],n>=2的模式。

如果不设置Master,也就是直接将Spark Streaming应用提交到集群上运行,那么首先,必须要求集群节点上,有>1个cpu core,其次,给Spark Streaming的每个executor分配的core,必须>1,这样,才能保证分配到executor上运行的输入DStream,两条线程并行,一条运行Receiver,接收数据,一条处理数据。否则,只会接收数据,不会处理数据。

StreamingContext详解,输入DStream和Reveiver详解

上一篇:Oracle 表操作(转)


下一篇:53、Spark Streaming:输入DStream之Kafka数据源实战