sparkStreaming 是一种流处理框架,支持多种数据源和多种输出,是一中微批处理,
主要的数据结构是:DStream 离散数据流,由多个RDD组成,每一个微批都是一个RDD。
Spark Streaming 的入口需要单独创立,因为sparkSession中灭有整合:
创建如下:
val conf=new SparkConf().setMaster(“local[*]”).setAppName(“kgc streaming demo”)
val ssc=new StreamingContext(conf,Seconds(5))
注意:一个jvm中只有一个StreamingContext启动
StreamingContext停止后,不能在启动
使用scala 编写sparkStreaming程序:
Scoket数据源:
//local[n] 其中n要大于接受器的个数
val sparkConf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
val ssc = new StreamingContext(sparkConf, Seconds(1))
//创建一个接收器
val lines = ssc.socketTextStream("localhost", 9999)//指定数据源
val words = lines.flatMap(_.split(" "))
val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
wordCounts.print()
//开始
ssc.start()
//等待终止信号
ssc.awaitTermination()
sparkStreaming内建的流式数据:文件系统(不与接收器相关联)、Scoket、kafka、Flume等
文件系统数据源:
val sparkConf = new SparkConf().setAppName("HdfsWordCount").setMaster("local[2]")
val ssc = new StreamingContext(sparkConf, Seconds(2))
// 创建FileInputDStream去读取文件系统上的数据
val lines = ssc.textFileStream("hdfs://hadoop131:9000/data")
//使用空格进行分割每行记录的字符串
val words = lines.flatMap(_.split(" "))
//类似于RDD的编程,将每个单词赋值为1,并进行合并计算
val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
wordCounts.print()
ssc.start()
ssc.awaitTermination()
flume数据源
1、push的方式读取数据
val conf: SparkConf = new SparkConf().setAppName("flumedemo").setMaster("local[3]")
val ssc = new StreamingContext(conf,Seconds(5))
//push 方式 由主机推送数据给sparkStreaming 需要先启动sparkStreaming
val flumeStream: ReceiverInputDStream[SparkFlumeEvent] = FlumeUtils.createStream(ssc,"hadoop131",5678)
//flume 作为sparking streaming 的实时数据流 每一条数据是一个event 故此时形成的dStream中的数据是一个一个的event
//event 有body 和header
flumeStream.map(x=>new String(x.event.getBody
.array()).trim)
.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).print()
ssc.start()
ssc.awaitTermination()
2、poll的方式获取数据
val conf: SparkConf = new SparkConf().setAppName("flumedemo").setMaster("local[3]")
val ssc = new StreamingContext(conf,Seconds(5))
//poll方式 主动拉取数据,需要先启动flume
val flumeStream=FlumeUtils.createPollingStream(ssc,"hadoop131",5678)
flumeStream.map(x=>new String(x.event.getBody.array()).trim)
.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).print()
ssc.start()
ssc.awaitTermination()
kafka数据源
//设置主函数的参数 第一个是brokers 第二个是topics 可以使用逗号隔开 传入多个topics
//sparkStreaming 可以一次性读取 kafka中的多个topic中的数据
val Array(brokers, topics) = args
val sparkConf = new SparkConf()
.setAppName("DirectKafkaWordCount").setMaster("local[1]")
val ssc = new StreamingContext(sparkConf, Seconds(2))
val topicsSet = topics.split(",").toSet
val kafkaParams = Map[String, String]("bootstrap.servers" -> brokers)
val messages = KafkaUtils.createDirectStream[String, String](ssc,
LocationStrategies.PreferConsistent,
ConsumerStrategies.Subscribe[String,
String](topicsSet,kafkaParams))
messages.map(_.value()) // 取出 value
.flatMap(_.split(" ")) // 将字符串使用空格分隔
.map(word => (word, 1)) // 每个单词映射成一个 pair
.reduceByKey(_+_) // 根据每个 key 进行累加
.print() // 打印前 10 个数据
ssc.start()
ssc.awaitTermination()