Spark Streaming 基本API案例

本文介绍了Spark Streaming的基本API应用,包括从Socket接收数据,处理本地文件系统数据,实现黑名单过滤功能,并展示了如何整合Spark SQL进行数据统计。通过实例运行和控制台输出展示了每个步骤的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Spark Streaming处理Socket数据

这边我们使用scala进行编程

def main(args: Array[String]): Unit = {
	//新建一个SparkConf 将Master和AppName设置进去
    val sparkConf: SparkConf = new SparkConf()
	    .setAppName("NetworkWordCount")
    	.setMaster("local[2]")

	//新建一个StreamingContext,第一个参数是上面定义的SparkConf 
	//第二个参数是个Seconds类型,表示多久进行一次批处理
    val ssc: StreamingContext = new StreamingContext(sparkConf, Seconds(5))
    //通过ssc.socketTextStream创建一个输入流,参数分别是主机地址和端口号
    val lines: ReceiverInputDStream[String] = ssc.socketTextStream("localhost", 6789);
    //处理接收过来的数据
    val ds: DStream[(String, Int)] = lines.flatMap(_.split(" ")).map(x => ((x, 1))).reduceByKey((x,y)=>x+y)
    //打印控制台
    ds.print()
    //启动spark streaming
    ssc.start()
    //等待子线程结束再执行下列代码
    ssc.awaitTermination()
  }

这边我们需要开启6789端口并发送数据
在这里插入图片描述
查看控制台:
在这里插入图片描述

2.Spark Streaming处理文件系统数据

文件系统我们选择本地文件系统

def main(args: Array[String]): Unit = {
	//新建一个SparkConf 将Master和AppName设置进去
    val sparkConf: SparkConf = new SparkConf()
	    .setAppName("FileWordCount")
    	.setMaster("local[2]")

	//新建一个StreamingContext,第一个参数是上面定义的SparkConf 
	//第二个参数是个Seconds类型,表示多久进行一次批处理
    val ssc: StreamingContext = new StreamingContext(sparkConf, Seconds(5))
	//通过ssc.textFileStream获得DStream流,参数是一个文件夹位置
	val value: DStream[String] = ssc.textFileStream("file:///home/hadoop/data//TESTDIR")
	//处理数据
    val ds: DStream[(String, Int)] = value.flatMap(_.split(" ")).map(x => ((x, 1))).reduceByKey((x, y) => x + y)
	
    //打印控制台
    ds.print()
    //启动spark streaming
    ssc.start()
    //等待子线程结束再执行下列代码
    ssc.awaitTermination()
  }

运行测试:我们要整体移一个含有数据的文件进去
在这里插入图片描述
查看控制台:
在这里插入图片描述

3.黑名单过滤

def main(args: Array[String]): Unit = {
    //新建一个SparkConf 将Master和AppName设置进去
    val sparkConf: SparkConf = new SparkConf()
	    .setAppName("FileWordCount")
    	.setMaster("local[2]")

	//新建一个StreamingContext,第一个参数是上面定义的SparkConf 
	//第二个参数是个Seconds类型,表示多久进行一次批处理
    val ssc: StreamingContext = new StreamingContext(sparkConf, Seconds(5))

	//这边新建一个list类型的黑名单
    val blacks = List("zs","ls")
    //将list转成rdd并附上一个true
    val blacksRdd= ssc.sparkContext.parallelize(blacks).map(x=>(x,true))
	
	//通过ssc.socketTextStream创建一个输入流,参数分别是主机地址和端口号
    val lines: ReceiverInputDStream[String] = ssc.socketTextStream("192.168.0.133", 6789)
    //先将数据进行一次map,将其转化成元组类型key,value,k是姓名,v是信息
    val value: DStream[String] = lines.map(x => (x.split(",")(1), x))
    	//使用transform算子将rdd 和DStream进行关联
    	.transform(rdd => {
     		 rdd.leftOuterJoin(blacksRdd)
     		 	//过滤掉黑名单的用户
       			 .filter(x => x._2._2.getOrElse("false") != true)
       			 //返回信息
       			 .map(x => x._2._1)

    })
    //打印结果
    value.print()

    ssc.start()
    ssc.awaitTermination()
  }

运行测试:
在这里插入图片描述
控制台只打印了一份数据,过滤完成
在这里插入图片描述

4.Spark Streaming整合Spark Sql

我们进行一次wc统计,将利用Spark Sql将Spark Streaming接受过来的数据转化成df

def main(args: Array[String]): Unit = {
	//定义sparkConf 
    val sparkConf = new SparkConf().setAppName("SqlNetWorkWCApp").setMaster("local[2]")
    //获得StreamingContext
    val ssc = new StreamingContext(sparkConf, Seconds(4))
    //获得SparkSession
    val spark = SparkSession
      .builder
      .config(sparkConf)
      .getOrCreate()
    //隐式转换
    import spark.implicits._

	//通过ssc.socketTextStream获得数据流
    val lines = ssc.socketTextStream("localhost", 6789)
    //通过空格进行一次分割操作
    val words: DStream[String] = lines.flatMap(_.split(" "))
    
    words.foreachRDD { (rdd: RDD[String]) =>
    	//使用caseclass将rdd转化成df
       val wordsDataFrame: DataFrame = rdd.map(w => a(w)).toDF()
		//将df创建成视图
       wordsDataFrame.createOrReplaceTempView("words")
		//通过spark sql获得wc的df并打印在控制台
       val wordCountsDataFrame =
         spark.sql("select word, count(*) as total from words group by word")
       wordCountsDataFrame.show()
    }


    ssc.start()
    ssc.awaitTermination()
  }

	//用于转化的caseclass
  case class a(word: String)

运行测试:
在这里插入图片描述
查看控制台:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值