Spark Streaming(文件流、套接字流、RDD队列流)
今天复习spark Streaming的文件流和套接字流以及RDD队列流。
1.文件流
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
object SparkStreamingTest1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("SparkStreamingTest1").setMaster("local[2]")
//创建StreamingContext对象,设置批次间隔时间20s
val ssc = new StreamingContext(conf,Seconds(20))
//指定监控目录
val ds= ssc.textFileStream("file:///root/data")
val wordCount= ds.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
wordCount.print()
//启动Streaming
ssc.start()
//等待结束运行
ssc.awaitTermination()
}
}
提示:需等待程序启动完毕后,再将测试文件放置在监控目录下。
运行结果如下:
2.套接字流
代码:
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
object SparkStreamingTest2 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("SparkStreamingTest2").setMaster("local[2]")
val ssc = new StreamingContext(conf,Seconds(20))
//通过socket获取数据,提供socket的主机名和端口号
val ds= ssc.socketTextStream("IDE",9999)
val wordCount= ds.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
wordCount.print()
ssc.start()
ssc.awaitTermination()
}
}
在idea启动程序完毕后,需要使用CRT连接新的终端窗口,并启动NetCat,设置端口号为9999
nc -lk 9999
然后输入数据:
查看结果显示:
3.RDD队列流
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.{Seconds, StreamingContext}
import scala.collection.mutable
object QueueStream {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("updateState").setMaster("local[2]")
val ssc=new StreamingContext(conf,Seconds(10))
//生成RDD队列,每个元素都是Int类型数据的RDD
val rddQueue=new mutable.SynchronizedQueue[RDD[Int]]()
//创建输入流(队列流)
val queueStream=ssc.queueStream(rddQueue)
//数据转换,如果是12,经过转换后是(2,1)
val mappedStream=queueStream.map(r=>(r%10,1))
//词频统计
val reducedStream =mappedStream.reduceByKey(_+_)
打印效果
reducedStream.print()
//启动流计算
ssc.start()
//通过for循环,向队列添加数据
for(i<- 1 to 10){
// 创建一个RDD,里面有100个元素,有2个分区
rddQueue+=ssc.sparkContext.makeRDD(1 to 100,2)
Thread.sleep(1000)
}
ssc.stop()
}
}
运行结果如下: