spark streaming中WordCount

版权声明:本文为博主原创文章,未经博主允许不得转载。 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 会把请求报文输出到标准输出。

猜你喜欢

转载自blog.csdn.net/lv_yishi/article/details/83904927