ItermCF的MR並行實現

2022-05-06 05:30:08 字數 2979 閱讀 5690

@(hadoop)

1.計算物與物之前的相似度

2.根據使用者的行為歷史,給出和歷史列表中的物品相似度最高的推薦

通俗的來講就是:

對於以下的資料集:

userid

itermid

preference

110151

1023

1103

2.52

1012

2102

2.52

1035

210423

1012

310443

1054.5

310754

1015

410334

1044.5

410645

1014

510235

1032

510445

1053.5

510646

1024

610326

1053.5

6107

4首先可以建立使用者對物品的評分矩陣,大概長這個樣子:

101102

103104

105106

107153

2.5000

0222.552

0003

2004

4.5054

5034.504

4543

2434

0列為userid,行為itermid,矩陣中的值代表該使用者對該物品的評分。

從列的方向看,該矩陣的每乙個列在mr程式中可以用一行簡單的字串來表示:

1

101:5,102:3,103:2.5

...

這樣一來,上面的矩陣5個列就可以由5行類似的字串來構成。

那麼第乙個mr任務的功能就是乙個簡單的資料轉換過程:

1.輸入的key為行偏移量,value為每行內容,形如:1,101,5.0

2.在map階段,分割每行內容,輸出的key為1,value為101:5.0

3.在reduce階段,將userid相同的所有評分記錄進行彙總拼接,輸出的key仍然為1,value形如:101:5,102:3,103:2.5 …

如此一來通過第乙個mr任務得到了使用者的評分矩陣。

該矩陣大概長這個樣子:

矩陣的值表示,兩個物品同時被使用者喜歡(評過分)的次數,例如:101和102這個組合被1,2,5三個使用者喜歡過,那麼在矩陣中101和102對應的值就是3。

從列的方向上看,這個同現矩陣的每一列在mr程式中可以通過下面簡單的字串來表示:

101:101

5101:102

3101:103

4...

m*n的同現矩陣就由m個以上的字串(n行)組成。

那麼第二個mr任務的功能就是在第乙個mr任務的輸出結果上得到物品同現矩陣:

1.輸入的key為偏移量,輸入的value為userid+製表符+itermid1:perference1,itermid2:perference2…

2.輸入的value中,userid和perference是不需要關心的,觀察物品的同現矩陣,map階段的工作就是將每行包含的itermid都解析出來,全排列組合作為key輸出,每個key的value記為1。

3.在reduce階段所做的就是根據key對value進行累加輸出。

如此一來便能夠得到物品的同現矩陣。

為什麼兩個矩陣相乘可以得到推薦結果?

物品1和各個物品的同現度*使用者對各個物品的喜好度,反應出使用者對物品1的喜好度。

例如,要**使用者3對103物品的喜好度,我們需要找到和103相似的物品,比如101物品,和103的同現度為4,是很類似的物品,使用者3對101的評分為2,那麼一定程度上可以反映出使用者對103的喜好度,101和103的相似度(即同現度)*使用者3對101的評分可以得到使用者3對103的喜好度權重,將使用者3對各個物品的權重相加,可以反映出使用者3對103的喜好度

了解矩陣相乘的意義之後,第三個mr任務的功能就是實現兩個矩陣的相乘,並將結果輸出。

在這個mr任務中,這兩個矩陣的相乘可以這樣來計算:

將同現矩陣存入乙個map中,形如:

map

> colitermoccurrencemap = new hashmap>();

同現矩陣中的每一行就是大map中的一條記錄,每行對應的每列都在該記錄的小map中。

在map階段的開始的時候初始化這個map,輸入的value形如101:101 5,101:102 3,將101作為大map的key,value為小map,小map的key為101/102,value為5/3。

由於map函式讀取檔案是併發讀取的,不能保證兩個輸入檔案的讀取順序(在同乙個檔案中也不能保證),所以這裡使用hadoop提供的分布式快取機制來對同現矩陣進行共享。

關於hadoop的分布式快取機制請看:

hadoop的distributedcache機制

初始化同現矩陣之後,讀取評分矩陣的每一行,輸入的value為1 101:5,102:3,103:2.5 …

將每行的itermids和對應的評分數提取出來,遍歷itermid,根據itermid到itermoccurrencemap中找到對應的list集合,找到每個itermid在該集合中對應的itermid2記錄,將評分數*同現度,之後進行累加,以userid:itermid作為key,累加值作為value輸出。

reduce的工作就很簡單了,根據key對value進行累加輸出即可。

原始碼github位址

MapReduce多重MR如何實現

判斷output資料夾是否存在,如果存在則刪除 path path new path otherargs 1 取第1個表示輸出目錄引數 第0個引數是輸入目錄 filesystem filesystem path.getfilesystem conf 根據path找到這個檔案 if filesyste...

SpringTask 並行任務的實現

引入 一般在專案中會有多個定時任務去排程,這時候如果使用序列的定時任務會造成結果不準確,具體解決方案如下 在config資料夾中引入如下配置類,不需要在springboot啟動類新增 enablescheduling這個註解 author lz description springtask 並行任務...

MR1和MR2的工作原理

1 客戶端向jobtracker請求乙個新的作業id 通過jobtracker的getnewjobid 方法獲取,見第2步 2 計算作業的輸入分片,將執行作業所需要的資源 包括jar檔案 配置檔案和計算得到的輸入分片 複製到乙個以id命名的jobtracker的檔案系統中 hdfs 見第3步 3 告...