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)
运行测试:
查看控制台: