電商大數據項目-推薦系統實戰(一)

電商大數據項目-推薦系統實戰(一)環境搭建以及日誌,人口,商品分析
https://blog.51cto.com/6989066/2325073
電商大數據項目-推薦系統實戰之推薦算法
https://blog.51cto.com/6989066/2326209
電商大數據項目-推薦系統實戰之實時分析以及離線分析
https://blog.51cto.com/6989066/2326214php

開源項目,請勿用於任何商業用途。
源代碼地址:https://github.com/asdud/Bigdata_projecthtml

本項目是基於Spark MLLib的大數據電商推薦系統項目,使用了scala語言和java語言。基於python語言的推薦系統項目會另外寫一篇博客。在閱讀本博客之前,須要有如下基礎:
1.linux的基本命令
2.至少有高中及以上的數學基礎。
3.至少有java se基礎,會scala語言和Java EE更佳(Jave EE非必需,可是能夠幫助你更快理解項目的架構)。
4.有github帳戶,而且至少知道git clone,fork,branch的概念。
5.有網絡基礎,至少知道服務器端和客戶端的區別。
6.有大數據基礎,最好會Hadoop,HDFS,MapReduce,Sqoop,HBase,Hive,Spark,Storm。
7.有mysql數據庫基礎,至少會最基本的增刪改查。
你要是大神,估計看這篇博客也沒有任何用處,至少給點意見和建議唄!java

PC配置要求
1.CPU:主流CPU便可
2.內存RAM:至少8G,推薦16G及以上,32G不浪費。
3.硬盤:因爲VM對I/O流讀取速度要求高,推薦使用256G及以上固態硬盤(SATA3便可.NVME更好),系統盤須要60-100G,其他的專門劃一個盤用於安裝虛擬機。或者採用傲騰內存+機械硬盤的方案。
關於傲騰內存的介紹和裝機方法
https://product.pconline.com.cn/itbk/diy/memory/1806/11365945.html
4.GPU顯卡;無要求。可是若是你想學習深度學習框架的話,可考慮1060 6g甚至是2080TI。
5.網速:CentOS 8GB多,HDP接近7個G,CDH幾個包加起來2.5G。本身算算須要下載多長時間,或者考慮用U盤從別人那裏拷貝?python

你也能夠考慮用阿里雲,騰訊雲等雲主機。mysql

步驟一:
搭建CentOS+HDP的環境,或者CentOS+CDH的環境,這些都是開源的,不用擔憂版權問題,企業上通常也是用這兩種方案。linux

在這裏我採用的是CentOS+HDP的方案
大數據之搭建HDP環境,以三個節點爲例(上——部署主節點以及服務)
https://blog.51cto.com/6989066/2173573
大數據之搭建HDP環境,以三個節點爲例(下——擴展節點,刪除節點,以及部署其餘服務)
https://blog.51cto.com/6989066/2175476git

也能夠採用CentOS+CDH的方案
搭建CDH實驗環境,以三個節點爲例的安裝配置
https://blog.51cto.com/6989066/2296064程序員

開發工具:Eclipse oxygen版本或者IDEA
代碼實現部分
1.數據:用戶查詢日誌來源
搜狗實驗室
.https://www.sogou.com/labs/resource/q.php
我選的迷你版
介紹:
搜索引擎查詢日誌庫設計爲包括約1個月(2008年6月)Sogou搜索引擎部分網頁查詢需求及用戶點擊狀況的網頁查詢日誌數據集合。爲進行中文搜索引擎用戶行爲分析的研究者提供基準研究語料github

格式說明:
數據格式爲算法

訪問時間\t用戶ID\t[查詢詞]\t該URL在返回結果中的排名\t用戶點擊的順序號\t用戶點擊的URL

其中,用戶ID是根據用戶使用瀏覽器訪問搜索引擎時的Cookie信息自動賦值,即同一次使用瀏覽器輸入的不一樣查詢對應同一個用戶ID

2.首先新建一個Maven工程MyMapReduceProject,而後更新pom.xml文件
pom文件地址
https://github.com/asdud/Bigdata_project/blob/master/MyMapReduceProject/pom.xml
電商大數據項目-推薦系統實戰(一)
這個時候就會自動下載對應的依賴的jar包

(一)案例1:搜狗日誌查詢分析
查詢搜索結果排名第1點,擊次序排在第2的數據
使用MapReduce進行分析處理
https://github.com/asdud/Bigdata_project/blob/master/MyMapReduceProject/src/main/java/day0629/sogou/SogouLogMain.java
https://github.com/asdud/Bigdata_project/blob/master/MyMapReduceProject/src/main/java/day0629/sogou/SogouLogMapper.java

使用Spark進行分析和處理
首先使用Ambari,添加Spark2的服務;因爲依賴其餘的服務,好比Hive等等,須要在啓動Ambari Server的時候,指定MySQL的JDBC驅動。
登陸spark-shell,須要用下面的方式:
spark-shell --master yarn-client
電商大數據項目-推薦系統實戰(一)
ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar
jdbc-driver地址與你安裝mysql-connector-java.jar目錄對應。

(二)案例2:人口分析案例
本案例假設咱們須要對某個省的人口 (1 億) 性別還有身高進行統計,須要計算出男女人數,男性中的最高和最低身高,以及女性中的最高和最低身高。本案例中用到的源文件有如下格式, 三列分別是 ID,性別,身高 (cm)。
電商大數據項目-推薦系統實戰(一)

使用Scala程序生成測試數據(大概1.3G)
https://github.com/asdud/Bigdata_project/blob/master/MySparkProject/src/main/java/day0629/PeopleInfo/PeopleInfoFileGenerator.scala
注意:能夠將數據量減少一下,這樣處理的時候會短一些。示例中是1億條記錄,能夠改成1萬條記錄。
並將生成的數據放到HDFS上:
hdfs dfs -put sample_people_info.txt /myproject/data

案例分析(使用MapReduce)
https://github.com/asdud/Bigdata_project/tree/master/MyMapReduceProject/src/main/java/day0629/peopleinfo

(三)案例3:電商訂單銷售數據分析

(四)Spark的累加器和廣播變量
因爲spark是分佈式的計算,因此使得每一個task間不存在共享的變量,而爲了實現共享變量spark實現了兩種類型 - 累加器與廣播變量。

1.累加器(accumulator)是Spark中提供的一種分佈式的變量機制,其原理相似於mapreduce,即分佈式的改變,而後聚合這些改變。累加器的一個常見用途是在調試時對做業執行過程當中的事件進行計數。
示例:
val accum = sc.accumulator(10, "My Accumulator")
sc.parallelize(Array(1,2,3,4)).foreach(x => accum+=x)
println(accum.value)

最終結果:20

2.廣播變量容許程序員將一個只讀的變量緩存在每臺機器上,而不用在任務之間傳遞變量。廣播變量可被用於有效地給每一個節點一個大輸入數據集的副本。Spark還嘗試使用高效地廣播算法來分發變量,進而減小通訊的開銷。
示例:將用戶信息存入廣播變量。
case class UserInfo(userID:Int,userName:String,userAge:Int)
val broadcastVar = sc.broadcast(UserInfo(100,"Tom",23))
broadcastVar.value

4、各區域熱門商品
(一)模塊介紹
電商網站運營中,須要對每一個區域用戶關心的商品進行統計分析,支持用戶決策。
用途:
分析各區域對產品的不一樣需求,進行差別化研究,例如北京用戶喜歡手機,上海用戶喜歡汽車。
指導商品折扣,推廣策略
(二)需求分析
(1)如何定義用戶關心的商品?
經過用戶對商品的點擊量來衡量商品熱度

複雜模型:經過用戶點擊+購買以及蒐藏等綜合數據對商品進行評價
商品熱門程度得分模型 = 點擊次數2+購買次數5+蒐藏次數*3
其中2,5,3爲得分權重

(2)如何獲取區域
經過用戶點擊日誌,訂單能夠獲取地域
① 日誌數據,來源與日誌系統,flume ,t+1也能夠每30分鐘
② 訂單來源於數據庫,sqoop,t+1也能夠每30分鐘
數據庫必定是讀寫分離
sqoop從讀的數據庫導數據,因此會形成數據與真實業務庫有必定的延時
(3)深度思考:如何去除爬蟲水軍
(三)技術方案
數據採集邏輯(ETL)
電商日誌通常存儲在日誌服務器,須要經過Flume拉取到HDFS上
數據的清洗邏輯
使用MapReduce進行數據清洗
使用Spark進行清洗
各區域熱門商品的分析計算
使用Hive進行數據的分析和處理
使用Spark SQL進行數據的分析和處理
思考:可否採用MapReduce進行數據的分析和處理

(四)實驗數據及說明

表Product(產品信息表)
列名 描述 數據類型 空/非空 約束條件
product_id 商品號 varchar(18) Not null
product_name 商品名稱 varchar(20) Not null
marque 商品型號 varchar(10) Not null
barcode 倉庫條碼 varchar Not null
price 商品價格 double Not null
brand_id 商品品牌 varchar(8) Not null
market_price 市場價格 double Not null
stock 庫存 int Not null
status 狀態 int Not null
補充說明 Status:下架-1,上架0,預售(1)

表Area_info(地區信息表)
列名 描述 數據類型 空/非空 約束條件
area_id 地區編號 varchar(18) Not null
area_name 地區名稱 varchar(20) Not null
補充說明

表order_info(訂單信息表)
列名 描述 數據類型 空/非空 約束條件
order_id 訂單ID varchar(18) Not null
order_date 訂單日期 varchar(20) Not null
user_id 用戶ID varchar(20)
product_id 商品ID varchar(20)
補充說明

表user_click_log(用戶點擊信息表)
列名 描述 數據類型 空/非空 約束條件
user_id 用戶ID varchar(18) Not null
user_ip 用戶IP varchar(20) Not null
url 用戶點擊URL varchar(200)
click_time 用戶點擊時間 varchar(40)
action_type 動做名稱 varchar(40)
area_id 地區ID varchar(40)
補充說明 action_type:1收藏,2加入購物車,3點擊

表area_hot_product(區域熱門商品表):最終結果表
列名 描述 數據類型 空/非空 約束條件
area_id 地區ID varchar(18) Not null
area_name 地區名稱 varchar(20) Not null
product_id 商品ID varchar(200)
product_name 商品名稱 varchar(40)
pv 訪問量 BIGINT
補充說明
(五)技術實現
① 使用Flume採集用戶點擊日誌
一般使用shell腳本執行日誌採集
複雜狀況,使用可視化的ETL工具,來進行Flume Agent控制
下面是配置文件,注意HDFS的端口號。

② 數據的清洗
須要將用戶點擊日誌裏面對於商品的點擊識別出來
過濾不知足6個字段的數據
過濾URL爲空的數據,即:過濾出包含http開頭的日誌記錄

實現方式一:使用MapReduce程序進行數據的清洗

實現方式二:使用Spark程序進行數據的清洗

注意:若是不但願在Spark執行中,打印過多的日誌,可使用下面的語句:
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
③ 各區域熱門商品熱度統計:基於Hive和Spark SQL
方式一:使用Hive進行統計

方式二:使用Spark SQL進行統計

在Spark SQL中執行的SQL:select a.area_id,a.area_name,p.product_id,product_name,count(c.product_id) from area a,product p,clicklog c where a.area_id=c.area_id and p.product_id=c.product_id group by a.area_id,a.area_name,p.product_id,p.product_name;

相關文章
相關標籤/搜索