版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lv_yishi/article/details/83904927
通过一些简单的案例,可以知道一些大致的用法
1.对每一个批次的数据进行操作:
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
object sparkStreamingWC {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("sparkStreamingWC").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
//创建sparkstreaming入口的对象,也就是Streaming对象
//数据批处理,要设置时间间隔,每5秒产生一次批次数据,名叫batch
val ssc:StreamingContext=new StreamingContext(sc,Seconds(5))
// 首先,创建输入DStream,代表了一个从数据源(比如kafka、socket)来的持续不断的实时数据流
// socketTextStream()方法接收两个基本参数,第一个是监听哪个主机上的ip,第二个是监听哪个端口
//从NetCat服务里获取数据。ReceiverInputDStream接收,里面是String
val dstream: ReceiverInputDStream[String] =ssc.socketTextStream("192.168.88.130",8888)
//按行读取
//返回的是DStream[(String, Int)],对批次进行处理,产生的是每一个批次的结果
//调用DStream里的api进行计算
val res: DStream[(String, Int)] =dstream.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
//不添加参数默认打印RDD中前10个元素
res.print()
//提交任务到集群
ssc.start()
//线程等待下一批处理任务
ssc.awaitTermination()
}
}
2.updateStateByKey按批次累加
import org.apache.spark.streaming.{Milliseconds, StreamingContext}
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}
//实现批次数据的累加
object sparkStreamingWC2 {
/*
* 实现按批次累加功能,需要调用updateStateByKey
* 其中需要自定义一个函数,该函数是对历史结果数据和当前批次数据的操作过程
* 该函数中第一个参数代表每个单词
* 第二个参数代表当前批次单词出现的次数:Seq(1,1,1,1)
* 第三个参数代表之前批次累加的结果,可能有值,也可能没有值,所以在获取的时候要用getOrElse方法
*/
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("sparkStreamingWC2").setMaster("local[*]")
val ssc = new StreamingContext(sparkConf,Milliseconds(10000))
//设置检查点,存已经处理的历史数据,因为要累加,所以要存历史数据
ssc.checkpoint("D:\\数据\\spark")
//获取数据
val dstram=ssc.socketTextStream("192.168.88.130",8888)
//处理当前的数据得到一个集合
val tup=dstram.flatMap(_.split(" ")).map((_,1))
//将之前的数据累加过来 1.更新的函数2.分区器,将不同RDD的数据放到一个分区 3.是否记录当前的分区器
val res = tup.updateStateByKey(func,new HashPartitioner(ssc.sparkContext.defaultParallelism),true)
res.print()
ssc.start()
ssc.awaitTermination()
}
//迭代器里面是要处理的数据
//自定义一个函数,第一个是处理的K值,第二个是当前K对于的V的序列集合,历史记录当前单词出现的次数,第三个参数是之前累加的结果,也是当前对应的K
val func =(it:Iterator[(String, Seq[Int], Option[Int])]) =>{
it.map(x=>{
(x._1,x._2.sum+x._3.getOrElse(0))
})
}
}
这里是从NetCat服务器里面获取数据,如果没有可以使用下面的yum 的安装
yum -y install nc
打开端口
nc -lk 8888
l:代表 netcat 将以监听模式运行
k:代表示 nc 在接收完一个请求后不会立即退出,而是会继续监听其他请求
这时就可以请求该接口了, nc 会把请求报文输出到标准输出。