国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析

這篇具有很好參考價值的文章主要介紹了【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

?目錄

一. 訓(xùn)練要點(diǎn)

二.需求說明

三.關(guān)鍵實(shí)現(xiàn)思路及步驟

?四、LogCount.scala文件完整代碼實(shí)現(xiàn):

五、運(yùn)行過程與結(jié)果截圖:

??六、具體實(shí)現(xiàn)步驟

?七、相關(guān)知識點(diǎn)?

?1、過濾出訪問次數(shù)在 50 次以上的用戶記錄

?2、統(tǒng)計訪問 50 次以上的用戶主要訪問的前 5 類網(wǎng)頁

?3. 合并部分網(wǎng)頁

?4.根據(jù)訪問時間加入對應(yīng)時段:


實(shí)訓(xùn)題目:競賽網(wǎng)站訪問日志分析

一. 訓(xùn)練要點(diǎn)

(1)搭建Spurk工程環(huán)境。

(2) Spark編程。

(3)通過spark-submit提交應(yīng)用。

二.需求說明

? ? ?某競賽網(wǎng)站每年都會開展數(shù)據(jù)挖據(jù)的競賽,在競賽期間網(wǎng)站會有大量人群訪問,生成了大量的用戶訪向記錄?,F(xiàn)在提供2016年10月到2017年6月的部分脫敏訪問日志數(shù)據(jù)。日志數(shù)據(jù)的基本內(nèi)容如圖所示,僅提供以下6個字段。

屬性名稱

屬性解析

Id

序號

Content_id

網(wǎng)頁ID

Page_path

網(wǎng)址

Userid

用戶ID

Sessionid

緩存生成ID

Date_time

訪問時間

? ? ?要求根據(jù)提供的用戶訪問日志數(shù)據(jù),利用Spark技術(shù)統(tǒng)計訪向的用戶數(shù)、被訪問的不同網(wǎng)頁個數(shù)以及每月的訪問量,并將結(jié)果保存到HDFS上。

文章所用文檔以及目錄等等說明:

(點(diǎn)擊可免費(fèi)下載)訪問日志數(shù)據(jù):? ??jc_content_viewlog.txt

IDEA內(nèi)實(shí)現(xiàn)代碼存儲路徑與名字:LogCount.scala

【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析

? jc_content_viewlog.txt? ?內(nèi)部分?jǐn)?shù)據(jù)如下圖:

【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析

三.關(guān)鍵實(shí)現(xiàn)思路及步驟

(1)配置好Spark的IntelliJ IDEA開發(fā)環(huán)境。

(2)啟動IntelliJ IDEA,并進(jìn)行Spark編程。

(3)對訪向記錄中的網(wǎng)頁去重,統(tǒng)計本周期內(nèi)被訪問網(wǎng)頁的個數(shù)。

val logs_all: RDD[Array[String]]  = sc.textFile(args(0)).map{_.split(",")}
val wy_log: RDD[String] = logs_all.map(x=>(x(1).toString)).distinct()
val wy_count:RDD[(String, Int)]= wy_log.map(("wy_zs",_)).groupByKey().map(x => (x._1,x._2.size))

?(4) userid為用戶注冊登錄的標(biāo)識,對userid去重,統(tǒng)計登錄用戶的數(shù)量。

val user_log: RDD[String] = logs_all.map(x=>(x(3).toString)).distinct()
val user_count:RDD[(String, Int)]= user_log.map(("user_zs",_)).groupByKey().map(x => (x._1,x._2.size))

?(5)按月統(tǒng)計訪問記錄數(shù)。

val logs_all_new = logs_all.map{x=>(x(0),x(1),x(2),x(3),x(4),x(5),date_time(x(5)))}
val ny_count: RDD[(String, Int)] = logs_all_new.map(x=>(x._7,1)).reduceByKey((a, b)=>a+b)

?(6)將結(jié)果保存到不同文件中。

wy_count.repartition(1).saveAsTextFile(args(1))
user_count.repartition(1).saveAsTextFile(args(2))
ny_count.repartition(1).saveAsTextFile(args(3))

?(7)打包Spark工程,在集群提交應(yīng)用程序。

[root@node1 ~]# /myserver/spark301/bin/spark-submit --master yarn --deploy-mode client   --class   net.LogCount /root/jc.jar hdfs://node1:8020/user/root/jc_content_viewlog.txt hdfs://node1:8020/user/root/jc1 hdfs://node1:8020/user/root/jc2 hdfs://node1:8020/user/root/jc3

[root@node1 ~]# /myserver/spark301/bin/spark-submit --master yarn --deploy-mode client?? --class?? net.LogCount /root/jc.jar hdfs://node1:8020/user/root/jc_content_viewlog.txt hdfs://node1:8020/user/root/jc1 hdfs://node1:8020/user/root/jc2 hdfs://node1:8020/user/root/jc3

注:jc.jar是上面文件生成的jar包改名并上傳而來;

hdfs://node1:8020/user/root/jc_content_viewlog.txt? 是hdfs里面jc_content_viewlog.txt存儲路徑,也需要自己上傳,目錄自己決定;

hdfs://node1:8020/user/root/jc1 hdfs://node1:8020/user/root/jc2 hdfs://node1:8020/user/root/jc3? 是設(shè)置它的輸出存儲路徑,因?yàn)闀敵鋈齻€不同數(shù)據(jù),需要三個目錄,不然會報錯。

?四、LogCount.scala文件完整代碼實(shí)現(xiàn):

package net

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object LogCount {
  def main(args: Array[String]): Unit = {

    if(args.length < 2){
      println("請指定input和output")
      System.exit(1)//非0表示非正常退出程序
    }

    //TODO 1.env/準(zhǔn)備sc/SparkContext/Spark上下文執(zhí)行環(huán)境
    val conf: SparkConf = new SparkConf().setAppName("wc")
    val sc: SparkContext = new SparkContext(conf)
    sc.setLogLevel("WARN")

    //TODO 2.source/讀取數(shù)據(jù)
    //RDD:A Resilient Distributed Dataset (RDD):彈性分布式數(shù)據(jù)集,簡單理解為分布式集合!使用起來和普通集合一樣簡單!
    //RDD[就是一行行的數(shù)據(jù)]
       val logs_all: RDD[Array[String]]  = sc.textFile(args(0)).map{_.split(",")}
    //TODO 3.transformation/數(shù)據(jù)操作/轉(zhuǎn)換
    //對訪問記錄中的網(wǎng)頁去重,統(tǒng)計本周期內(nèi)被訪問網(wǎng)頁的個數(shù)
    val wy_log: RDD[String] = logs_all.map(x=>(x(1).toString)).distinct()
    val wy_count:RDD[(String, Int)]= wy_log.map(("wy_zs",_)).groupByKey().map(x => (x._1,x._2.size))
    //userid為用戶注冊登錄的標(biāo)識,對userid去重,統(tǒng)計登錄用戶的數(shù)量
    val user_log: RDD[String] = logs_all.map(x=>(x(3).toString)).distinct()
    val user_count:RDD[(String, Int)]= user_log.map(("user_zs",_)).groupByKey().map(x => (x._1,x._2.size))
    //按月統(tǒng)計訪問記錄數(shù)
    val logs_all_new = logs_all.map{x=>(x(0),x(1),x(2),x(3),x(4),x(5),date_time(x(5)))}
    val ny_count: RDD[(String, Int)] = logs_all_new.map(x=>(x._7,1)).reduceByKey((a, b)=>a+b)

    //TODO 4.sink/輸出
    //輸出到指定path(可以是文件/夾)
    wy_count.repartition(1).saveAsTextFile(args(1))
    user_count.repartition(1).saveAsTextFile(args(2))
    ny_count.repartition(1).saveAsTextFile(args(3))
    //為了便于查看Web-UI可以讓程序睡一會
    Thread.sleep(1000 * 60)

    //TODO 5.關(guān)閉資源
    sc.stop()
  }
  //獲取年月,時間段作為輸入?yún)?shù)
  def date_time(date:String):String={
    val nianye =date.trim.substring(0,7)
    nianye
  }

}

五、運(yùn)行過程與結(jié)果截圖:

?


?六、具體實(shí)現(xiàn)步驟

1、修改打包好的jar名字,并把jar上傳到node1結(jié)點(diǎn)

【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析

2、開啟一系列集群:

start-dfs.sh? ?//一鍵開啟
start-yarn.sh? //開啟
cd /myserver/
?mr-jobhistory-daemon.sh start historyserver
?/myserver/spark301/sbin/start-history-server.sh
?jps? //查看

這里不再具體說明如何開啟。

3、上傳jc_content_viewlog.txt到node1節(jié)點(diǎn),并上傳到hdfs

?
[root@node1 ~]# hdfs dfs -put jc_content_viewlog.txt? /user/root/

【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析

【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析

?4、在集群提交應(yīng)用程序

[root@node1 ~]# /myserver/spark301/bin/spark-submit --master yarn --deploy-mode client?? --class?? net.LogCount /root/jc.jar hdfs://node1:8020/user/root/jc_content_viewlog.txt hdfs://node1:8020/user/root/jc1 hdfs://node1:8020/user/root/jc2 hdfs://node1:8020/user/root/jc3

【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析

?七、相關(guān)知識點(diǎn)?

進(jìn)入spark-shell

[root@node1 bin]# /myserver/spark301/bin/spark-shell

【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析

?1、過濾出訪問次數(shù)在 50 次以上的用戶記錄

(1)統(tǒng)計用戶訪問次數(shù)并篩選出訪問次數(shù)在50次以上的用戶ID

scala> val data = sc.textFile("hdfs://node1:8020/user/root/jc_content_viewlog.txt").map{x=> x.split(",")}

data: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[2] at map at <console>:24

scala> val userid=data.map(line=>(line(3),1)).reduceByKey((a,b)=>a+b).filter(x=>x._2>50).keys .collect

?(2)根據(jù)過濾后的用戶ID,在原數(shù)據(jù)中篩選出這一部分用戶的訪問記錄

scala> val valib_data=data.filter(x=>userid.contains(x(3)))

valib_data: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[7] at filter at <console>:27

scala> valib_data.take(2)? ?//查看

res1: Array[Array[String]] = Array(Array(480343, 611, /jingsa/611.jhtml, 1, 69463B3F2728DBEB045A5C31CA9C2E3A, 2017-03-01 09:56:49), Array(480358, 611, /jingsa/611.jhtml, 1, 69463B3F2728DBEB045A5C31CA9C2E3A, 2017-03-01 09:58:50))

?2、統(tǒng)計訪問 50 次以上的用戶主要訪問的前 5 類網(wǎng)頁

?scala> val web = valib_data.map(x=>(x(2),1)).reduceByKey((a,b)=>a+b).sortBy(x=>x._2,false)

web: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[12] at sortBy at <console>:25

scala> web.take(5)

res2: Array[(String, Int)] = Array((/jingsa/1030.jhtml,67899), (/view/contentViewLog.jspx,5008), (/jingsa/712.jhtml,2551), (/youxiuzuopin/823.jhtml,1212), (/jingsa/613.jhtml,968))

?3. 合并部分網(wǎng)頁

(URL 后面帶有_1、_2 字樣的翻頁網(wǎng)址,統(tǒng)一為一個網(wǎng)址)通過字符串截取的方法,對網(wǎng)頁網(wǎng)址字符串進(jìn)行截取,只截取“_”前面的字符串

【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析

?scala> val data2=data.filter(_.length>=6).map{

? ? x=>

????? var page="";

????? if(x(2).contains("_"))

??????? { page=x(2).substring(0,x(2).lastIndexOf("_")) }

????? else

????? ??{ page=x(2) };

????? (x(0),x(1),page,x(3),x(4),x(5))

????? }

data2: org.apache.spark.rdd.RDD[(String, String, String, String, String, String)] = MapPartitionsRDD[14] at map at <console>:25

?4.根據(jù)訪問時間加入對應(yīng)時段:

6:30~11:30 為上午,11:30~14:00 為中午,14:00~17:30為下午,17:30~19:00 為傍晚,19:00~23:00 為晚上,23:00~6:30 為深夜,統(tǒng)計所有用戶各時段訪問情況

(1)首先定義一個函數(shù),用于匹配時間段并返回相應(yīng)的字段值

scala> def date_time(date:String):String={
           val hour=date.substring(date.indexOf(" ")+1,date.indexOf(":")).toInt
           val min=date.substring(date.indexOf(":")+1,date.lastIndexOf(":")).toInt
           if(hour<6 && hour>=23) "深夜"
           else if(hour==6 && min<=30) "深夜"
           else if(hour<11 && hour>=6) "上午"
           else if(hour==11 && min<=30) "上午"
           else if(hour<14 && hour>=11) "中午"
           else if(hour>=14 && hour<17) "下午"
           else if(hour==17 && hour<=30) "下午"
           else if(hour>=17 && hour<19) "傍晚"
           else if(hour==19 && min<=30) "傍晚"
           else "晚上"
          }
date_time: (date: String)String

(2)通過map方法對每一條記錄的時間進(jìn)行匹配,增加一個時間段的值到記錄中

?scala> val data_new = data2.map{x=>(x._1,x._2,x._3,x._4,x._5,x._6,date_time(x._6))}

data_new: org.apache.spark.rdd.RDD[(String, String, String, String, String, String, String)] = MapPartitionsRDD[17] at map at <console>:27

(3)將時段值作為鍵,值為1,利用reduceByKey的方法統(tǒng)計各時段訪問情況?

scala> val date_count = data_new.map(x=>(x._7,1)).reduceByKey((a,b)=>a+b)

date_count: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[19] at reduceByKey at <console>:25

scala> date_count.take(10)

res3: Array[(String, Int)] = Array((上午,31675), (傍晚,14511), (中午,18799), (下午,39720), (深夜,81), (晚上,67073))文章來源地址http://www.zghlxwxcb.cn/news/detail-430718.html

到了這里,關(guān)于【Spark實(shí)訓(xùn)】--競賽網(wǎng)站訪問日志分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于Spark的大規(guī)模日志分析

    摘要: 本篇文章將從一個實(shí)際項(xiàng)目出發(fā),分享如何使用 Spark 進(jìn)行大規(guī)模日志分析,并通過代碼演示加深讀者的理解。 本文分享自華為云社區(qū)《【實(shí)戰(zhàn)經(jīng)驗(yàn)分享】基于Spark的大規(guī)模日志分析【上進(jìn)小菜豬大數(shù)據(jù)系列】》,作者:上進(jìn)小菜豬。 隨著互聯(lián)網(wǎng)的普及和應(yīng)用范圍的擴(kuò)

    2024年02月09日
    瀏覽(22)
  • Spark安全日志分析與事件調(diào)查:實(shí)戰(zhàn)指南

    摘要: 在當(dāng)今數(shù)字化時代,安全日志分析和事件調(diào)查變得至關(guān)重要。本博客將介紹如何使用Spark進(jìn)行安全日志分析和事件調(diào)查,展示了項(xiàng)目經(jīng)驗(yàn)、詳細(xì)的技術(shù)細(xì)節(jié)和提供了代碼示例。通過深入理解和準(zhǔn)備,您將能夠展示您在Spark上的專業(yè)知識,為安全團(tuán)隊(duì)提供強(qiáng)大的分析和調(diào)

    2024年04月13日
    瀏覽(25)
  • Hadoop—20.網(wǎng)站日志分析項(xiàng)目案例(詳解)

    Hadoop—20.網(wǎng)站日志分析項(xiàng)目案例(詳解)

    目錄 一、導(dǎo)入數(shù)據(jù) 1、啟動hadoop 2、在hdfs下創(chuàng)建文件夾hadoop_class 3、查詢文件夾是否創(chuàng)建成功 ?4、在hadoop_class下創(chuàng)建一個文件夾存放總數(shù)據(jù) ?5、檢查是否創(chuàng)建成功 ?6、在web_log中創(chuàng)建兩個文件分別存放已處理的數(shù)據(jù)和未處理的數(shù)據(jù) 7、查看是否創(chuàng)建成功 8、因?yàn)槿罩緮?shù)據(jù)共有兩

    2024年02月05日
    瀏覽(35)
  • nginx上web服務(wù)的基本安全優(yōu)化、服務(wù)性能優(yōu)化、訪問日志優(yōu)化、目錄資源優(yōu)化和防盜鏈配置簡介

    nginx上web服務(wù)的基本安全優(yōu)化、服務(wù)性能優(yōu)化、訪問日志優(yōu)化、目錄資源優(yōu)化和防盜鏈配置簡介

    目錄 一.基本安全優(yōu)化 1.隱藏nginx軟件版本信息 2.更改源碼來隱藏軟件名和版本 (1)修改第一個文件(核心頭文件),在nginx安裝目錄下找到這個文件并修改 (2)第二個文件 (3)第三個文件,內(nèi)置響應(yīng)信息頁面 (4)第四個文件 (5)重新編譯安裝并重啟 3.更改nginx服務(wù)的默

    2024年02月13日
    瀏覽(18)
  • nginx訪問日志分析

    1、根據(jù)訪問IP統(tǒng)計UV awk \\\'{print $1}\\\' paycenteraccess.log | sort -n | uniq | wc -l 2、查詢訪問最頻繁的IP(前10) awk \\\'{print $1}\\\' /www/server/nginx/logs/access.txt | sort -n |uniq -c | sort -rn | head -n 10 3、查看某一時間段的IP訪問量(1-8點(diǎn)) awk \\\'$2 =\\\"[2023-01-29T11:00:00+08:00]\\\" $2 =\\\"[2023-01-29T11:30:00+08:00]\\\"\\\' /www/server/nginx

    2024年02月10日
    瀏覽(35)
  • 基于Flume+spark+Flask的分布式實(shí)時日志分析與入侵檢測系統(tǒng)

    完整項(xiàng)目地址:https://download.csdn.net/download/lijunhcn/88463174 簡介 LogVision是一個整合了web日志聚合、分發(fā)、實(shí)時分析、入侵檢測、數(shù)據(jù)存儲與可視化的日志分析解決方案。聚合采用Apache Flume,分發(fā)采用Apache Kafka,實(shí)時處理采用Spark Streaming,入侵檢測采用Spark MLlib,數(shù)據(jù)存儲使用H

    2024年01月16日
    瀏覽(28)
  • shell腳本-Nginx訪問日志分析

    shell腳本-Nginx訪問日志分析

    可以通過/usr/local/nginx/logs/access.log 文件-查看nginx的日志 /usr/local/nginx/conf/nginx.conf 文件-定義了日志輸出的格式 可以通過awk命令來取出所需要的數(shù)據(jù) Nginx訪問日志分析腳本

    2024年02月16日
    瀏覽(36)
  • 使用寶塔面板如何查看網(wǎng)站日志分析搜索引擎蜘蛛數(shù)據(jù)

    使用寶塔面板如何查看網(wǎng)站日志分析搜索引擎蜘蛛數(shù)據(jù)

    網(wǎng)站日志(確切的講應(yīng)該是服務(wù)器日志)是記錄WEB服務(wù)器接收處理請求以及運(yùn)行錯誤等各種原始信息的文件。通過查看網(wǎng)站日志分析數(shù)據(jù)我們可以獲得很有有用的數(shù)據(jù),例如蜘蛛訪問、是否被惡意訪問、網(wǎng)站訪客來源等等網(wǎng)站訪客在尋找什么?哪個頁面最受歡迎?網(wǎng)站訪客從

    2024年02月09日
    瀏覽(29)
  • 面試題分析:統(tǒng)計網(wǎng)站訪問次數(shù)

    面試題分析:統(tǒng)計網(wǎng)站訪問次數(shù)

    難度:較低 平臺的訪問量非常高,需要實(shí)時統(tǒng)計網(wǎng)站的訪問次數(shù),請?jiān)O(shè)計一個計數(shù)器解決: 初級工程師,可能回答使用synchronized鎖或重入鎖,進(jìn)一步探討,synchronized鎖太重,有沒其他方式,可能回答atomic類,進(jìn)一步問,atomic類原理,什么場景下適合用,什么場景下不適合用

    2024年02月12日
    瀏覽(25)
  • 大數(shù)據(jù)技術(shù)之Hadoop(十一)——網(wǎng)站流量日志數(shù)據(jù)分析系統(tǒng)

    大數(shù)據(jù)技術(shù)之Hadoop(十一)——網(wǎng)站流量日志數(shù)據(jù)分析系統(tǒng)

    目錄 素材: 一、模塊開發(fā)——數(shù)據(jù)預(yù)處理 1、分析預(yù)處理的數(shù)據(jù) 2、實(shí)現(xiàn)數(shù)據(jù)的預(yù)處理 (1)創(chuàng)建Maven項(xiàng)目,添加相關(guān)依賴 (2)創(chuàng)建JavaBean對象,封裝日志記錄 (3)創(chuàng)建MapReduce程序,執(zhí)行數(shù)據(jù)預(yù)處理 ?二、模塊開發(fā)——數(shù)據(jù)倉庫開發(fā) 1、上傳文件 2、實(shí)現(xiàn)數(shù)據(jù)倉庫 三、模塊開

    2023年04月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包