通过SparkStreaming的window操作实战模拟新浪微博、百度、京东等热点搜索词案例实战
1、在线热点搜索词实现解析
2、SparkStreaming实现在线热点搜索词实战
package com.tom.spark.sparkstreaming
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Durations, Seconds, StreamingContext}
/**
* 使用Scala开发集群运行的Spark来实现在线热搜词
*
* 背景描述:在社交网络(例如微博)、电子商务(例如京东)、搜索引擎(例如百度)等人们核心关注的内容之一
* 就是我所关注的内容中大家正在最关注什么,或者说当前的热点是什么,这在实际企业级应用中是非常有价值的,
* 例如我们关心过去30分钟大家正在热搜什么,并且每5分钟更新一次,这就使得热点内容是动态更新的,当然也是
* 更有价值的。
* 实现技术:Spark Streaming提供了滑动窗口的技术来支撑实现上述业务背景,我们可以使用reduceByKeyAndWindow
* 操作来做具体实现
*/
object OnlineHottestItems {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("OnlineBlackListFilter").setMaster("local[2]")
//此处设置Batch Interval是在Spark Streaming中生成基本Job的时间单位,窗口和滑动时间间隔
// 一定是该Batch Interval的整数倍
val ssc = new StreamingContext(conf, Durations.seconds(5))
val hottestStream = ssc.socketTextStream("Master", 9999)
//用户搜索的格式简化为name item,在这里我们由于要计算出热点内容,所以只需要提取出item即可,
//提取出的item然后通过map转换为(item, 1)格式
val searchPair = hottestStream.map(_.split(" ")(1)).map(item => (item, 1))
val hottestDStream = searchPair.reduceByKeyAndWindow((v1:Int, v2:Int) => v1 + v2, Seconds(60), Seconds(20))
// val hottestDstream2 = searchPair.reduceByKeyAndWindow((v1:Int, v2:Int) => v1 + v2, (v1:Int, v2:Int) => v1 - v2, Seconds(60), Seconds(20))
hottestDStream.transform(hottestItemRDD => {
val top3 = hottestItemRDD.map(pair => (pair._2,pair._1)).sortByKey(false).map(pair => (pair._2,pair._1)).take(5)
top3.foreach(println)
hottestItemRDD
}).print()
//计算后的有效数据一般都会写入Kafka中,下游的计费系统会从Kafka中Pull到有效数据进行计费
ssc.start()
ssc.awaitTermination()
}
}