2021-05-26

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()
  }
}

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值