大數據IMF傳奇行動絕密課程第94課:SparkStreaming實現廣告計費系統中在線黑名單過濾實戰

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()
  }
}
發佈了125 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章