SparkStreaming實現廣告計費系統中在線黑名單過濾實戰
1、在線廣告黑名單過濾實現解析
2、SparkStreaming實現在線黑名單過濾實戰
package com.tom.spark.sparkstreaming
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Durations, StreamingContext}
/**
* 使用Scala開發集羣運行的Spark在線黑名單過濾程序
*
* 背景描述:在廣告點擊計費系統中我們在線過濾掉黑名單的點擊,進而保護廣告商的利益,只進行
* 有效的廣告點擊計費,或者在防刷評分(或者流量)系統,過濾掉無效的投票或者評分或者流量;
* 實現技術:使用Transform API直接基於RDD編程,進行join操作
*/
object OnlineBlackListFilter {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("OnlineBlackListFilter").setMaster("local[2]")
val ssc = new StreamingContext(conf, Durations.seconds(30))
//黑名單數據準備,實際上黑名單一般都是動態的,例如在Redis或者數據庫中,黑名單的生成
//往往有複雜的業務邏輯,具體情況算法不同,但是在Spark Streaming進行處理的時候每次都
//能夠訪問完整的信息
val blackList = Array(("hadoop", true),("mahout", true))
val blackListRDD = ssc.sparkContext.parallelize(blackList, 3)
val addClickStream = ssc.socketTextStream("Master", 9999)
//此處模擬的廣告點擊的每條數據的格式爲time, name
//此處map操作的結果是name,(time,name)的格式
val adsClickStreamFormatted = addClickStream.map(ads => {
(ads.split(" ")(1), ads)
})
adsClickStreamFormatted.transform(userClickRDD => {
// 通過leftOuterJoin操作既保留了左側用戶廣告點擊內容的RDD的所有內容,又獲得了響應點擊的內容是否在黑名單中
val joinedBlackListRDD = userClickRDD.leftOuterJoin(blackListRDD)
// 通過filter過濾的時候,其輸入元素是一個Tuple,(name,((time,name), boolean))
// 其中第一個元素是黑名單的名稱,第二個元素的第二個元素是進行leftOuterJoin的時候
// 是否存在值,如果存在的話,表明當前元素廣告點擊是黑名單,需要過濾掉,否則的話
// 則是有效點擊內容
val validClicked = joinedBlackListRDD.filter(joinedItem => {
!joinedItem._2._2.getOrElse(false)
})
validClicked.map(_._2._1)
}).print
//計算後的有效數據一般都會寫入Kafka中,下游的計費系統會從Kafka中Pull到有效數據進行計費
ssc.start()
ssc.awaitTermination()
}
}