Hadoop进阶

Hadoop进阶

地址:Hadoop进阶
源码地址:github

1 第一章 概述

hadoop的体系架构

Hadoop进阶_第1张图片
HDFS架构

块:

DataNode:

NameNode:

Secondary NameNode:

Hadoop1.X架构图

Hadoop进阶_第2张图片
Hadoop1.X架构图

Hadoop 2.X

Hadoop进阶_第3张图片
对比

hadoop2.0以后版本移除了jobtracker tasktracker,改由Yarn平台的resourcemanager负责统一调配。

Hadoop进阶_第4张图片
image.png

Yarn设计减少了jobtracker对系统资源的消耗,也减少了hadoop1.0单点故障问题。

Hadoop进阶_第5张图片
image.png

2 第二章 深入探索MapReduce过程

Hadoop进阶_第6张图片
image.png

2.1 WordCount实例回顾

1Split 2 Map 3 Shuffle 4 Reduce

1 Split阶段

Hadoop进阶_第7张图片
分片
Hadoop进阶_第8张图片
Split阶段
Hadoop进阶_第9张图片
分片

2 Map阶段

输入:key 行号 value 一行值

输出:key 单词 value 1

Hadoop进阶_第10张图片
Map阶段

3 Shuffle阶段

比较复杂,可以理解为map端的输出作为reduce端的输入过程,而且涉及到网络传输;

Hadoop进阶_第11张图片
Shuffle阶段

4 Reduce阶段

Hadoop进阶_第12张图片
Reduce阶段

总结

Hadoop进阶_第13张图片
WordCount实例

2.2 从分片输入到Map

输入文件:

Hadoop进阶_第14张图片
image.png

分片输入:

Hadoop进阶_第15张图片
分片输入

分片输入问题:

Hadoop进阶_第16张图片
分片输入

理想的输入文件:

由于NameNode内存有限,大量的小文件会给Hdfs带来性能上的问题;故Hdfs适合存放大文件,对于大量的小文件,可以采取 **压缩、合并小文件 **的优化策略。例如,设置文件输入类型为CombineFileInputFormat格式。

如何调整节点Map的任务的个数?

四个分片对应四个map任务

Hadoop进阶_第17张图片
image.png

在实际情况下,map任务的个数是受多个条件的制约,一般一个DataNode的map任务数量控制在10到100比较合适。

一般操作如下:

  • 增加map个数,可增大mapred.map.tasks;
  • 减少map个数,可增大mapred.min.split.size;
  • 如果要减少map个数,但有很多小文件,可将小文件合并成大文件,再使用准则2

2.3 Map---Shuffle---Reduce

1 本地优化-Combine

Hadoop进阶_第18张图片
本地优化-Combine
Hadoop进阶_第19张图片
Combine
Hadoop进阶_第20张图片
image.png
Hadoop进阶_第21张图片
MR

2 M-S-R

一、Combine的逻辑和reduce逻辑一致。故可以认为combine是对本地数据的reduce操作。

二、一个mapreduce作业中,一下三者的数量是相等的。
1)partitioner的数量
2)reduce任务的数量
3)最终输出文件的数量
三、一个reducer中,所有数据都会被按照key值升序排序,故如果part输出文件包含key值,则这个文件一定是有序的;

四、reducer任务数量

Hadoop进阶_第22张图片
reducer任务数量

调整方式有二:
1)mapred.reduce.tasks
2)Java代码中job.setNumReduceTasks(int n)

2.4 总结

分片输入---split

Hadoop进阶_第23张图片
image.png

本地合并---Combiner

Hadoop进阶_第24张图片
image.png

Map---Shuffle---Reduce

Hadoop进阶_第25张图片
image.png

3 第三章 Hadoop的分布式缓存

3.1 分布式缓存---DistributedCache

在执行MapReduce时,可能Mapper之间需要共享一些信息,如果信息量不大,可以将其从HDFS加载到内存中,这就是Hadoop分布式缓存机制。

例子:统计全量的单词文本中存在的单词,那么在Hadoop一开始就把全量的单词加载到内存中 ,然后对于输入的行单词,去在内存中查找,如果全局缓存中存在该单词,就输出;

Hadoop进阶_第26张图片
统计全量的单词文本中存在的单词

如何使用DistributedCached呢?

第一步:设置路径和别名

在main方法中加载共享文件的HDFS路径,路径可以是目录也可以是文件。可以在路径末尾追加 “ #” +别名,在map阶段可以使用该别名;

Hadoop进阶_第27张图片
设置路径和别名

第二步:

在Mapper类或Reducer的setup方法中,用输入流获取分布式缓存中的文件;

Hadoop进阶_第28张图片
image.png

加载到内存发生在Job执行之前,每个从节点各自都缓存一份相同的共享数据。如果共享数据太大,可以把共享数据分批缓存,重复执行作业。

3.2 MapReduce实现矩阵相乘

1 矩阵相乘例子

Hadoop进阶_第29张图片
image.png

2 矩阵相乘编码

矩阵在文件中的表示

Hadoop进阶_第30张图片
矩阵在文件中的表示

思路:

1: 将右侧矩阵转置,即行转换成列,列转化为行
Hadoop进阶_第31张图片
右侧矩阵转置

2:矩阵相乘
1、将右矩阵载入分布式缓存;
2、将左矩阵的行作为map输入;
3、在map执行之前:将缓存的右矩阵以行为单位放入list;
4、在map计算时:从list中取出所有行分别与输入行相乘。

4 推荐算法

4.1 相似度

余玄相似度

二维向量的余玄相似度

Hadoop进阶_第32张图片
image.png

多维向量的余玄相似度

Hadoop进阶_第33张图片
多维向量的余玄相似度

其他相似度

Hadoop进阶_第34张图片
其他相似度

4.2 基于物品的推荐算法(理论)

基于物品的协同过滤推荐算法(ItemCF)

用户行为和权重:点击(1.0分) 搜索(3.0分) 收藏(5.0分) 付款(10.0分)

算法思想:给用户推荐那些和他们之前喜欢的物品相似的物品

实例:

Hadoop进阶_第35张图片
image.png

Hadoop进阶_第36张图片
image.png

算法步骤:

3个用户、6种商品

1、根据用户行为列表计算用户、物品的评分矩阵

Hadoop进阶_第37张图片
image.png

[图片上传失败...(image-db3bef-1526978905470)]

2、根据用户、物品的评分矩阵计算物品与物品的相似度矩阵

取第一行和第二行的行向量,计算余旋相似度,比如:1号和2号物品的相似度为0.36

Hadoop进阶_第38张图片
image.png

评分矩阵两两相乘、然后构建对称矩阵

[图片上传失败...(image-6ceb08-1526978905471)]

3、相似度矩阵*评分矩阵 = 推荐列表

[图片上传失败...(image-3ceb2-1526978905471)]

[图片上传失败...(image-8686f4-1526978905471)]

将推荐矩阵和评分矩阵做一个比较,发现在评分矩阵中,用户已经对一些商品产生过行为,对这些已经产生多的行为, 所以没有必要在为这些用户推荐这些商品,那么我们就可以将之前推荐过的商品置零。

[图片上传失败...(image-455ebe-1526978905471)]

最终的推荐结果,一个用户可能有很多的推荐物品,我们这里去Top1作为最终的推荐结果,取出用户最感兴趣的物品,

[图片上传失败...(image-df6cd3-1526978905471)]

具体实现步骤:

[图片上传失败...(image-94fe70-1526978905471)]

4-3 基于物品的推荐算法(代码)

代码实现的步骤[图片上传失败...(image-bb7222-1526978905471)]

Step1:

计算评分矩阵

输入:用户ID,物品ID,分支

输出:物品ID(行) --- 用户ID(列) --- 分值

Step2:

计算余弦相似度矩阵

输入:步骤1的输出

缓存:步骤1的输出

输出:用户ID(行) --- 物品ID(列) --- 相似度

[图片上传失败...(image-2cf23-1526978905471)]

step3:

将评分矩阵转置

输入:步骤1的输出

输出:用户ID(行) --- 物品ID(列) ---分值

step4:

相似度矩阵*评分矩阵

输入:步骤2的输出

缓存:步骤3的输出

输出:物品ID(行) --- 用户ID(列) --- 分值

step5:

根据评分矩阵,将步骤4的输出中,用户已经有用过行为的商品评分置0

输入:步骤4的输出

缓存:步骤1的输出

输出:用户ID(行) --- 物品ID(列) --- 分值 (最终的推荐列表)

4-4 基于物品的推荐算法(代码)

4-5 基于物品的推荐算法(代码)

4-6 基于用户的推荐算法(理论)

基于用户的协同过滤推荐算法(UserCF)

算法思想:给用户推荐和他兴趣相似的其他用户喜欢的物品

现有如下用户、商品、行为、权重:

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

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

行为:点击 1.0分、搜索 3.0分、收藏 5.0分、付款 10.0分


Hadoop进阶_第39张图片
用户行为列表

算法步骤:

  1. 根据用户行为为列表计算物品、用户的评分矩阵

行号是用户ID、列号是物品ID

Hadoop进阶_第40张图片
评分矩阵

  1. 根据评分矩阵计算用户与用户的相似度矩阵

    将所有的用户两两计算相似度之后,得到相似度矩阵


    Hadoop进阶_第41张图片
    两两计算相似度

    Hadoop进阶_第42张图片
    用户与用户的相似度矩阵
  1. 相似度矩阵 * 评分矩阵 = 推荐列表


    Hadoop进阶_第43张图片
    相似度矩阵 * 评分矩阵

得到推荐列表,在对照评分矩阵,将相应位置的元素置零


Hadoop进阶_第44张图片
元素置零

4-7 基于用户的推荐算法(代码)

基于用户的推荐算法MR的步骤:UserCF

Hadoop进阶_第45张图片
基于用户的推荐算法

与给予物品的推荐算法类似

4-8 基于内容的推荐算法(理论)

基于内容的推荐算法

算法思想:给用户推荐和他们之前喜欢的物品在内容上相似的其他物品

物品特征建模

Hadoop进阶_第46张图片
物品特征建模

算法步骤:

1 构建Item Profile矩阵

0 1矩阵, 行号是物品ID,列号是标签


Hadoop进阶_第47张图片
构建Item Profile矩阵

2 构建Item User评分矩阵

行号是用户ID,列号是物品ID


Hadoop进阶_第48张图片
评分矩阵

3 Item User * Item Profile = User Profile


Hadoop进阶_第49张图片
Item User * Item Profile

User Profile:用户对所有标签感兴趣的程度


Hadoop进阶_第50张图片
User Profile

4 对Item Profile 和 User Profile求余弦相似度

Hadoop进阶_第51张图片
余弦相似度

4-9 基于内容的推荐算法(代码)

MR步骤:UserCF

Hadoop进阶_第52张图片
MR步骤

5 第五章 课程总结

Hadoop进阶_第53张图片
课程总结

你可能感兴趣的:(Hadoop进阶)