Spark Streaming编程初级实践

一、实验目的

(1)通过实验学习使用Scala编程实现文件和数据的生成。

(2)掌握使用文件作为Spark Streaming数据源的编程方法。

二、实验内容和要求

1.以随机时间间隔在一个目录下生成大量文件,文件名随机命名,文件中包含随机生成的一些英文语句,每个英语语句内部的单词之间用空格隔开。

假设当前使用用户名hadoop登录了Linux系统,执行如下命令新建一个data目录,用于存放生成的数据文件:

$ cd /home/hadoop

$ mkdir data

执行如下命令新建一个代码目录:

$ cd /home/hadoop

$ mkdir sparkapp

$ mkdir -p src/main/scala

然后,在sparkapp目录下新建一个simple.sbt文件,在该文件中写入如下内容(参考PPT):

name := "Simple Project"

version := "1.0"

scalaVersion := "2.12.15"

libraryDependencies += "org.apache.spark" %% "spark-core" % "3.1.2"

libraryDependencies += "org.apache.spark" %% "spark-streaming" % "3.1.2"

然后,在src/main/scala目录下,新建一个GenFile.scala文件,用于生成数据文件,该代码文件的内容如下:

//GenFile.scala

import java.io.{File, PrintWriter}



object GenFile{

  def main(args: Array[String]) {

    val strList = List(

        "There are three famous bigdata softwares",

        "and they are widely used in real applications",

        "For in that sleep of death what dreams may come",

        "The slings and arrows of outrageous fortune",

        "When we have shuffled off this mortal coil",

        "For who would bear the whips and scorns of time",

        "That patient merit of the unworthy takes",

        "When he himself might his quietus make",

        "To grunt and sweat under a weary life",

        "But that the dread of something after death",

        "And makes us rather bear those ills we have",

        "Than fly to others that we know not of",

        "Thus conscience does make cowards of us all",

        "And thus the native hue of resolution",

        "And enterprises of great pith and moment",

        "And lose the name of action"

    )

    var i = 0

    while (i < 100000){

        Thread.sleep(scala.util.Random.nextInt(5000))

        var str = scala.util.Random.nextInt(1000).toString  

        val filePath = "/home/hadoop/data/out"+str+".txt"

        val out = new PrintWriter(new File(filePath))

        for (m <- 0 to 3) out.println(strList(scala.util.Random.nextInt(14)))

        out.close

        i = i + 1

    }

  }

}

然后,执行如下命令对程序进行编译打包:

$ cd ~/sparkapp

$ ~/software/sbt package

打包成功以后,执行如下命令生成数据文件:

$ spark-submit --class "GenFile" ./target/scala-2.12/simple-project_2.12-1.0.jar

程序执行结束以后,执行如下命令查看文件:

$ cd /home/hadoop/data

$ ls

这时,可以看到该目录下生成了很多文件,效果如下:

可以使用如下命令查看其中一个文件的内容:

$ cat out101.txt

可以看到该文件中包含了一些英文语句,效果如下:

2.实时统计每10秒新出现的单词数量。

    在src/main/scala目录下,新建一个WordCountStreaming1.scala文件,该代码文件的内容如下:

//WordCountStreaming1.scala

import org.apache.spark._

import org.apache.spark.streaming._

import org.apache.spark.SparkContext._

object WordCountStreaming1 {

  def main(args: Array[String]) {

    val sparkConf = new SparkConf().setAppName("WordCountStreaming1").setMaster("local[2]")

    //设置为本地运行模式,两个线程,一个监听,另一个处理数据

    val sc = new SparkContext(sparkConf)

    sc.setLogLevel("ERROR")

    val ssc = new StreamingContext(sc, Seconds(10))   // 时间间隔为10秒

    val lines = ssc.textFileStream("file:///home/hadoop/data")         

    //这里采用本地文件,当然也可以采用HDFS文件

    val words = lines.flatMap(_.split(" "))

    val wordCounts = words.count()

    wordCounts.print()

    ssc.start()

    ssc.awaitTermination()

  }

}

然后,执行如下命令对程序进行编译打包:

$ cd ~/sparkapp

$ ~/software/sbt package

然后,新建一个终端窗口,执行如下命令生成数据文件:

$ spark-submit --class "GenFile" ./target/scala-2.12/simple-project_2.12-1.0.jar

    然后,马上新建另外一个终端窗口,执行如下命令进行词频统计:

$ spark-submit --class "WordCountStreaming1" ./target/scala-2.12/simple-project_2.12-1.0.jar

在词频统计窗口内,可以看到类似如下的词频统计结果:

-------------------------------------------

Time: 1643507050000 ms

-------------------------------------------

93

-------------------------------------------

Time: 1643507060000 ms

-------------------------------------------

127

-------------------------------------------

Time: 1643507070000 ms

-------------------------------------------

99

-------------------------------------------

Time: 1643507080000 ms

-------------------------------------------

98

3.实时统计最近1分钟内每个单词的出现次数(每10秒统计1次)。

【参考答案】

在src/main/scala目录下,新建一个WordCountStreaming2.scala文件,该代码文件的内容如下:

//WordCountStreaming2.scala

import org.apache.spark._

import org.apache.spark.streaming._

import org.apache.spark.SparkContext._

object WordCountStreaming2 {

  def main(args: Array[String]) {

    val sparkConf = new SparkConf().setAppName("WordCountStreaming2").setMaster("local[2]")

    //设置为本地运行模式,两个线程,一个监听,另一个处理数据

    val sc = new SparkContext(sparkConf)

    sc.setLogLevel("ERROR")

    val ssc = new StreamingContext(sc, Seconds(10))   // 时间间隔为10秒

    //设置检查点,一定要写,不然会报错

    ssc.checkpoint("file:///home/hadoop/checkpoint")

    val lines = ssc.textFileStream("file:///home/hadoop/data")

    //这里采用本地文件,当然也可以采用HDFS文件

    val words = lines.flatMap(_.split(" "))

    //将数据转换成元组,方便统计

    val pair = words.map(x=>(x,1))

    //设定滑动窗口长度为1分钟,统计间隔为10秒,对新进入滑动窗口的数据设定为相加函数,对离开滑动窗口的数据进行相减操作

    val wordCounts = pair.reduceByKeyAndWindow(_+_,_-_,Seconds(60),Seconds(10))

    wordCounts.print()

    ssc.start()

    ssc.awaitTermination()

  }

}

然后,执行如下命令对程序进行编译打包:

$ cd ~/sparkapp

$ ~/software/sbt package

然后,新建一个终端窗口,执行如下命令生成数据文件:

$ spark-submit --class "GenFile" ./target/scala-2.12/simple-project_2.12-1.0.jar

    然后,马上新建另外一个终端窗口,执行如下命令进行词频统计:

$ spark-submit --class "WordCountStreaming2" ./target/scala-2.12/simple-project_2.12-1.0.jar

在词频统计窗口内,可以看到类似如下的词频统计结果:

  1. 实时统计每个单词累计出现次数,并将结果保存到本地文件(每10秒统计1次)。

在src/main/scala目录下,新建一个WordCountStreaming3.scala文件,该代码文件的内容如下:

//WordCountStreaming3.scala

import org.apache.spark._

import org.apache.spark.streaming._

import org.apache.spark.SparkContext._

object WordCountStreaming3 {

  def main(args: Array[String]) {

    val sparkConf = new SparkConf().setAppName("WordCountStreaming3").setMaster("local[2]")

    //设置为本地运行模式,两个线程,一个监听,另一个处理数据

    val sc = new SparkContext(sparkConf)

    sc.setLogLevel("ERROR")

    val ssc = new StreamingContext(sc, Seconds(10))   // 时间间隔为10秒

    //设置检查点,一定要写,不然会报错

    ssc.checkpoint("file:///home/hadoop/checkpoint")

    val lines = ssc.textFileStream("file:///home/hadoop/data")

    //这里采用本地文件,当然也可以采用HDFS文件

    val words = lines.flatMap(_.split(" "))

    //将数据转换成元组,方便统计

    val pair = words.map(x=>(x,1))

    //设定状态更新函数

    val updateFunc = (values:Seq[Int],state:Option[Int])=>{

        val currentCount = values.foldLeft(0)(_+_)

        val previousCount = state.getOrElse(0)

        Some(currentCount + previousCount)

    }

    //由于是跨批次之间维护状态,所以需要调用updateStateByKey函数

    val stateDstream = pair.updateStateByKey[Int](updateFunc)

    stateDstream.print()

    //将结果存储到本地文件中

    stateDstream.saveAsTextFiles("file:///home/hadoop/result/output.txt")

    ssc.start()

    ssc.awaitTermination()

  }

}

然后,执行如下命令对程序进行编译打包:

$ cd ~/sparkapp

$ ~/software/sbt package

然后,新建一个终端窗口,执行如下命令生成数据文件:

$ spark-submit --class "GenFile" ./target/scala-2.12/simple-project_2.12-1.0.jar

    然后,马上新建另外一个终端窗口,执行如下命令进行词频统计:

$ spark-submit --class "WordCountStreaming3" ./target/scala-2.12/simple-project_2.12-1.0.jar

在词频统计窗口内,可以看到类似如下的词频统计结果:

然后,可以执行如下命令查看生成的result目录:

$ cd /home/hadoop/result

可以看到,该目录下包含一些目录,效果如下:

    执行如下命令查看其中一个目录:

$ cd output.txt-1643507820000

可以看到里面包含一些文件,效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值