1.初始化StreamingContext
//SparkStreaming程序入口
val conf: SparkConf = new SparkConf().setAppName("wordcount").setMaster("local[*]")//如果需要打包运行在服务器上,不需要指定master
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
val ssc: StreamingContext = new StreamingContext(sc, Seconds(5))
初始化完Context之后:
1.定义消息输入源来创建DStreams;
2.定义DStreams的转化操作和输出操作;
3.通过streamingContext.start()来启动消息采集和处理;
4.等待程序终止,可以通过streamingContext.awaitTermination()来设置;
5.通过streamingContext.stop()来手动终止处理程序。
示例代码:
package chapter5
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array[String]): Unit = {
//SparkStreaming程序入口
val conf: SparkConf = new SparkConf().setAppName("wordcount").setMaster("local[*]")//因为要打包运行在服务器上,所以不需要指定master
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
val ssc: StreamingContext = new StreamingContext(sc, Seconds(5))
//接收数据,socketTextStream第一个参数是数据源,第二个参数是自定义端口号,和数据源中的对应上即可
val data: ReceiverInputDStream[String] = ssc.socketTextStream("hadoop101", 9999)
//按照分隔符进行切分
val spliFile: DStream[String] = data.flatMap(_.split(" "))
//将每个单词记为1
val wordAndOne: DStream[(String, Int)] = spliFile.map((_, 1))
//聚合单词
val wordAndCount: DStream[(String, Int)] = wordAndOne.reduceByKey(_ + _)
//打印输出
wordAndCount.print()
//开启SparkStreaming
ssc.start()
//让程序一直处于接收状态,等待关闭
ssc.awaitTermination()
}
}
StreamingContext和SparkContext什么关系?
StreamingContext一旦启动,对DStreaming的操作无法修改。在同一时间一个JVM中只有一个StreamingContext可以启动。stop()方法将同时停止StopContext,可以传入参数stopSparkContext用于只停止StreamingContext。在Spark1.4版本后,通过设置sparkConf.set("spark.streaming.stopGracefullyOnShutdown","true")即可停止SparkStreaming并不会丢失数据。在StreamingContext的start方法中已经注册了Hook方法。
2.什么是DStreams
Discretized Stream是SparkStreaming的基础抽象,代表持续性的数据流和经过各种Spark源语操作后的结果数据流。在内部实现上,DStream是一系列连续的RDD来表示。每个RDD含有一段时间间隔内的数据,SparkStreaming把一系列连续的批次称为DStream。
DStream的特点:
将流式计算分解成为一系列确定并且较小的批处理作业;可以将失败或执行较慢的任务在其他节点上执行;有较强的容错能力,基于lineage;DStream内含high-level operations进行处理;DStream内部实现为一个RDD序列。
对数据的操作也是按照RDD为单位来进行的。
计算过程由Sparkengine来完成。
3.DStreams输入
SparkStreaming原生支持一些不同的数据源。一些“核心”数据源已经被打包到Spark Streaming的Maven工件中,而其他的一些则可以通过spark-streaming-kafka等附加工件获取。
Streaming的数据源和接收器:
数据源:
基本数据源:socket、file,akka actor。Steaming中自带了该数据源的读取API;
高级数据源:kafka,flume,kinesis,Twitter等其他的数据。必须单独导入集成的JAR包。
接收器:
Socket数据源,有一个接收器,用户接受socket的数据。每个接收器必须占用一个cores(线程)来接收数据。如果资源不足,那么任务会处于等待状态。
每个接收器都以spark执行器程序中一个长期运行的任务的形式运行,因此会占据分配给应用的CPU核心。此外,我们还需要有可用的CPU核心来处理数据。这意味着如果要运行多个接收器,就必须至少有和接收器数目相同的核心数,还要加上用来完成计算所需要的核心数。例如,如果我们想要在流计算应用中运行10个接收器,那么至少需要为应用分配11个CPU核心。所以如果在本地模式运行,不要使用local或者local[1],
除核心数据源外,还可以用附加数据源接收器来从一些知名数据获取系统中接收的数据,这些接收器都作为SparkStreaming的组件进行独立打包了。它们仍然是spark的一部分,不过需要在构建文件中添加额外的包才能使用他们,现有的接收器包括Twitter、Apache Kafka、Amazon Kinesis、Apache Flume,以及ZeroMQ。可以通过添加与Spark版本匹配 的 Maven 工件 spark-streaming-[projectname]_2.10 来引入这些附加接收器。
(1)Spark对Kafka两种连接方式的对比
Kafka项目在版本0.8和0.10之间引入了一个新的消费者api,因此有两个独立的相应Spark Streaming包可用。请选择正确的包装; 请注意,0.8集成与后来的0.9和0.10代理兼容,但0.10集成与早期的代理不兼容。
Broker Version |
0.8.2.1或更高 |
0.10.0或更高 |
Api Stability |
不赞成 |
稳定的 |
Language Support |
Scala,Java,Python |
Scala,Java |
Receiver DStream |
是 |
没有 |
Direct DStream |
是 |
是 |
SSL / TLS Support |
没有 |
是 |
Offset Commit Api |
没有 |
是 |