Hadoop進(jìn)階

Hadoop進(jìn)階

地址:Hadoop進(jìn)階
源碼地址:github

1 第一章 概述

hadoop的體系架構(gòu)

HDFS架構(gòu)

塊:

DataNode:

NameNode:

Secondary NameNode:

Hadoop1.X架構(gòu)圖

Hadoop1.X架構(gòu)圖

Hadoop 2.X

對(duì)比

hadoop2.0以后版本移除了jobtracker tasktracker,改由Yarn平臺(tái)的resourcemanager負(fù)責(zé)統(tǒng)一調(diào)配。

image.png

Yarn設(shè)計(jì)減少了jobtracker對(duì)系統(tǒng)資源的消耗,也減少了hadoop1.0單點(diǎn)故障問(wèn)題。

image.png

2 第二章 深入探索MapReduce過(guò)程

image.png

2.1 WordCount實(shí)例回顧

1Split 2 Map 3 Shuffle 4 Reduce

1 Split階段

分片
Split階段
分片

2 Map階段

輸入:key 行號(hào) value 一行值

輸出:key 單詞 value 1

Map階段

3 Shuffle階段

比較復(fù)雜,可以理解為map端的輸出作為reduce端的輸入過(guò)程,而且涉及到網(wǎng)絡(luò)傳輸;

Shuffle階段

4 Reduce階段

Reduce階段

總結(jié)

WordCount實(shí)例

2.2 從分片輸入到Map

輸入文件:

image.png

分片輸入:

分片輸入

分片輸入問(wèn)題:

分片輸入

理想的輸入文件:

由于NameNode內(nèi)存有限,大量的小文件會(huì)給Hdfs帶來(lái)性能上的問(wèn)題;故Hdfs適合存放大文件,對(duì)于大量的小文件,可以采取 **壓縮、合并小文件 **的優(yōu)化策略。例如,設(shè)置文件輸入類(lèi)型為CombineFileInputFormat格式。

如何調(diào)整節(jié)點(diǎn)Map的任務(wù)的個(gè)數(shù)?

四個(gè)分片對(duì)應(yīng)四個(gè)map任務(wù)

image.png

在實(shí)際情況下,map任務(wù)的個(gè)數(shù)是受多個(gè)條件的制約,一般一個(gè)DataNode的map任務(wù)數(shù)量控制在10到100比較合適。

一般操作如下:

  • 增加map個(gè)數(shù),可增大mapred.map.tasks;
  • 減少map個(gè)數(shù),可增大mapred.min.split.size;
  • 如果要減少map個(gè)數(shù),但有很多小文件,可將小文件合并成大文件,再使用準(zhǔn)則2

2.3 Map---Shuffle---Reduce

1 本地優(yōu)化-Combine

本地優(yōu)化-Combine
Combine
image.png
MR

2 M-S-R

一、Combine的邏輯和reduce邏輯一致。故可以認(rèn)為combine是對(duì)本地?cái)?shù)據(jù)的reduce操作。

二、一個(gè)mapreduce作業(yè)中,一下三者的數(shù)量是相等的。
1)partitioner的數(shù)量
2)reduce任務(wù)的數(shù)量
3)最終輸出文件的數(shù)量
三、一個(gè)reducer中,所有數(shù)據(jù)都會(huì)被按照key值升序排序,故如果part輸出文件包含key值,則這個(gè)文件一定是有序的;

四、reducer任務(wù)數(shù)量

reducer任務(wù)數(shù)量

調(diào)整方式有二:
1)mapred.reduce.tasks
2)Java代碼中job.setNumReduceTasks(int n)

2.4 總結(jié)

分片輸入---split

image.png

本地合并---Combiner

image.png

Map---Shuffle---Reduce

image.png

3 第三章 Hadoop的分布式緩存

3.1 分布式緩存---DistributedCache

在執(zhí)行MapReduce時(shí),可能Mapper之間需要共享一些信息,如果信息量不大,可以將其從HDFS加載到內(nèi)存中,這就是Hadoop分布式緩存機(jī)制。

例子:統(tǒng)計(jì)全量的單詞文本中存在的單詞,那么在Hadoop一開(kāi)始就把全量的單詞加載到內(nèi)存中 ,然后對(duì)于輸入的行單詞,去在內(nèi)存中查找,如果全局緩存中存在該單詞,就輸出;

統(tǒng)計(jì)全量的單詞文本中存在的單詞

如何使用DistributedCached呢?

第一步:設(shè)置路徑和別名

在main方法中加載共享文件的HDFS路徑,路徑可以是目錄也可以是文件??梢栽诼窂侥┪沧芳?“ #” +別名,在map階段可以使用該別名;

設(shè)置路徑和別名

第二步:

在Mapper類(lèi)或Reducer的setup方法中,用輸入流獲取分布式緩存中的文件;

image.png

加載到內(nèi)存發(fā)生在Job執(zhí)行之前,每個(gè)從節(jié)點(diǎn)各自都緩存一份相同的共享數(shù)據(jù)。如果共享數(shù)據(jù)太大,可以把共享數(shù)據(jù)分批緩存,重復(fù)執(zhí)行作業(yè)。

3.2 MapReduce實(shí)現(xiàn)矩陣相乘

1 矩陣相乘例子

image.png

2 矩陣相乘編碼

矩陣在文件中的表示

矩陣在文件中的表示

思路:

1: 將右側(cè)矩陣轉(zhuǎn)置,即行轉(zhuǎn)換成列,列轉(zhuǎn)化為行
右側(cè)矩陣轉(zhuǎn)置

2:矩陣相乘
1、將右矩陣載入分布式緩存;
2、將左矩陣的行作為map輸入;
3、在map執(zhí)行之前:將緩存的右矩陣以行為單位放入list;
4、在map計(jì)算時(shí):從list中取出所有行分別與輸入行相乘。

4 推薦算法

4.1 相似度

余玄相似度

二維向量的余玄相似度

image.png

多維向量的余玄相似度

多維向量的余玄相似度

其他相似度

其他相似度

4.2 基于物品的推薦算法(理論)

基于物品的協(xié)同過(guò)濾推薦算法(ItemCF)

用戶行為和權(quán)重:點(diǎn)擊(1.0分) 搜索(3.0分) 收藏(5.0分) 付款(10.0分)

算法思想:給用戶推薦那些和他們之前喜歡的物品相似的物品

實(shí)例:

image.png

image.png

算法步驟:

3個(gè)用戶、6種商品

1、根據(jù)用戶行為列表計(jì)算用戶、物品的評(píng)分矩陣

image.png

[圖片上傳失敗...(image-db3bef-1526978905470)]

2、根據(jù)用戶、物品的評(píng)分矩陣計(jì)算物品與物品的相似度矩陣

取第一行和第二行的行向量,計(jì)算余旋相似度,比如:1號(hào)和2號(hào)物品的相似度為0.36

image.png

評(píng)分矩陣兩兩相乘、然后構(gòu)建對(duì)稱矩陣

[圖片上傳失敗...(image-6ceb08-1526978905471)]

3、相似度矩陣*評(píng)分矩陣 = 推薦列表

[圖片上傳失敗...(image-3ceb2-1526978905471)]

[圖片上傳失敗...(image-8686f4-1526978905471)]

將推薦矩陣和評(píng)分矩陣做一個(gè)比較,發(fā)現(xiàn)在評(píng)分矩陣中,用戶已經(jīng)對(duì)一些商品產(chǎn)生過(guò)行為,對(duì)這些已經(jīng)產(chǎn)生多的行為, 所以沒(méi)有必要在為這些用戶推薦這些商品,那么我們就可以將之前推薦過(guò)的商品置零。

[圖片上傳失敗...(image-455ebe-1526978905471)]

最終的推薦結(jié)果,一個(gè)用戶可能有很多的推薦物品,我們這里去Top1作為最終的推薦結(jié)果,取出用戶最感興趣的物品,

[圖片上傳失敗...(image-df6cd3-1526978905471)]

具體實(shí)現(xiàn)步驟:

[圖片上傳失敗...(image-94fe70-1526978905471)]

4-3 基于物品的推薦算法(代碼)

代碼實(shí)現(xiàn)的步驟[圖片上傳失敗...(image-bb7222-1526978905471)]

Step1:

計(jì)算評(píng)分矩陣

輸入:用戶ID,物品ID,分支

輸出:物品ID(行) --- 用戶ID(列) --- 分值

Step2:

計(jì)算余弦相似度矩陣

輸入:步驟1的輸出

緩存:步驟1的輸出

輸出:用戶ID(行) --- 物品ID(列) --- 相似度

[圖片上傳失敗...(image-2cf23-1526978905471)]

step3:

將評(píng)分矩陣轉(zhuǎn)置

輸入:步驟1的輸出

輸出:用戶ID(行) --- 物品ID(列) ---分值

step4:

相似度矩陣*評(píng)分矩陣

輸入:步驟2的輸出

緩存:步驟3的輸出

輸出:物品ID(行) --- 用戶ID(列) --- 分值

step5:

根據(jù)評(píng)分矩陣,將步驟4的輸出中,用戶已經(jīng)有用過(guò)行為的商品評(píng)分置0

輸入:步驟4的輸出

緩存:步驟1的輸出

輸出:用戶ID(行) --- 物品ID(列) --- 分值 (最終的推薦列表)

4-4 基于物品的推薦算法(代碼)

4-5 基于物品的推薦算法(代碼)

4-6 基于用戶的推薦算法(理論)

基于用戶的協(xié)同過(guò)濾推薦算法(UserCF)

算法思想:給用戶推薦和他興趣相似的其他用戶喜歡的物品

現(xiàn)有如下用戶、商品、行為、權(quán)重:

用戶:A、B、C、D、E、F

商品:1、2、3、4、5、6

行為:點(diǎn)擊 1.0分、搜索 3.0分、收藏 5.0分、付款 10.0分


用戶行為列表

算法步驟:

  1. 根據(jù)用戶行為為列表計(jì)算物品、用戶的評(píng)分矩陣

行號(hào)是用戶ID、列號(hào)是物品ID

評(píng)分矩陣

  1. 根據(jù)評(píng)分矩陣計(jì)算用戶與用戶的相似度矩陣

    將所有的用戶兩兩計(jì)算相似度之后,得到相似度矩陣


    兩兩計(jì)算相似度

    用戶與用戶的相似度矩陣
  1. 相似度矩陣 * 評(píng)分矩陣 = 推薦列表


    相似度矩陣 * 評(píng)分矩陣

得到推薦列表,在對(duì)照評(píng)分矩陣,將相應(yīng)位置的元素置零


元素置零

4-7 基于用戶的推薦算法(代碼)

基于用戶的推薦算法MR的步驟:UserCF

基于用戶的推薦算法

與給予物品的推薦算法類(lèi)似

4-8 基于內(nèi)容的推薦算法(理論)

基于內(nèi)容的推薦算法

算法思想:給用戶推薦和他們之前喜歡的物品在內(nèi)容上相似的其他物品

物品特征建模

物品特征建模

算法步驟:

1 構(gòu)建Item Profile矩陣

0 1矩陣, 行號(hào)是物品ID,列號(hào)是標(biāo)簽


構(gòu)建Item Profile矩陣

2 構(gòu)建Item User評(píng)分矩陣

行號(hào)是用戶ID,列號(hào)是物品ID


評(píng)分矩陣

3 Item User * Item Profile = User Profile


Item User * Item Profile

User Profile:用戶對(duì)所有標(biāo)簽感興趣的程度


User Profile

4 對(duì)Item Profile 和 User Profile求余弦相似度

余弦相似度

4-9 基于內(nèi)容的推薦算法(代碼)

MR步驟:UserCF

MR步驟

5 第五章 課程總結(jié)

課程總結(jié)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容