参考:imooc https://www.imooc.com/learn/890
接着我的笔记【Hadoop-基础篇】讲
第1章 概述
大数据应用
1 | 精准营销、个性化推荐 |
Hadoop基础
HDFS
Hadoop1x
Hadoop2x
移除了JobTracker和TaskTracker,改由Yarn平台ResourceManager负责集群中所有资源的统一管理和分配,NodeManager管理Hadoop集群中单个计算节点。
可以在YARN平台上运行Spark和Storm作业,充分利用资源。
第2章 深入探索Mapreduce过程
2-1 WordCount实例回顾
MapReduce概念
MapReduce作业时一种大规模数据的并行计算的便程模型。我们可以将HDFS中存储的海量数据,通过MapReduce作业进行计算,得到目标数据。
MapReduce四个阶段:
1、 Split

如下,三行文本分片产生三个分片,每个分片就是一行单词,分别作为Map阶段的输入

2、 Map(需要编码)
如下是第一个分片(第一行)的处理逻辑:

mapper类会对第二行、第三行..重复这个逻辑,直到结束。该阶段的输出回作为下阶段的输入。
3、Shuffle
可理解为从map输出到reduce输入的过程,且涉及到网络传输。将所有相同的单词归到一起,结果统计放在下个阶段做,该阶段的输出回作为下阶段的输入。

4、Reduce(需要编码)

WordCount总结:

2-2 从分片输入到Map
1、输入文件

分片输入:
如下,某420M的文件被分成4个分片,若还有某40M的文件,可存在block4剩余位置。此时分片数量为5,他们的地址映射被保存在NameNode中。

理想的输入文件:
由于NameNode内存有限,大量的小文件会给Hdfs带来性能上的问题;故Hdfs适合存放大文件,对于大量的小文件,可以采取 *压缩、合并小文件 *的优化策略。例如,设置文件输入类型为CombineFileInputFormat格式。
2、节点Map任务的个数
分片数个map任务个数有什么关系?
如下图,2个文件file1,file2经过计算,得到4个分片(file1是split1~split3, file2是split4),则这台节点会启动4个map任务,即同时有4个mapper线程在循环执行map任务。

在实际情况下,map任务的个数是受多个条件的制约,一般一个DataNode的map任务数量控制在10到100比较合适。
如何调节map任务个数?
一般操作如下:
- 增加map个数,可增大mapred.map.tasks;
- 减少map个数,可增大mapred.min.split.size;
- 如果要减少map个数,但有很多小文件,可将小文件合并成大文件,再使用准则2
2-3 Map-Shuffle-Reduce
1、本地优化-Combine
数据经过Map端输出后会进行网络混洗,经过Shuffle后进入Reduce,在大数据量的情况下可能会造成巨大的网络开销。故可以在本地先按照key先行一轮排序与合并,再进行网络混洗,这个过程就是Combine。
如下图,map输出后,按首字母排序,然后在本地进行一次合并,该合并逻辑与reduce一样。

为什么需要一次Combine操作?
在多数情况下,Combine的逻辑和reduce的逻辑是一致的,即都是按照key合并数据,故可以认为Combine是对本地数据的Reduce操作。这里复用Reducer的逻辑,也可以自己实现Combiner类。
1 | job.setCombinerClass(MyReduce.class); |
2、从Map到Reduce
如下图,超过缓冲区大小,map数据会溢写到磁盘上,三个颜色表示文件中只有三种不同的key值。然后将小文件经过Combine操作合并成大文件,进一步减少网络开销。然后开始进行网络传输,进入各自的Patition阶段。

Patition阶段,所有相同key值数据都会进入同一个Patition,然后合并(只是将key汇聚,没有累加合并),然后将合并后的文件作为reduce阶段的输入。
Reduce阶段,进行value的累加合并,然后输出,就获得输出文件。
从图看出,Patition数量,Reduce数量,输出文件数量,三者总是相等的。
在一个reducer中,所有数据都会被按照key值升序排序(解释了Sort代码的疑问),故如果 part输出文件中包含key值,则这个文件一定是有序的。
3、Reduce任务数量
在大数据量下,如果只设置一个reduce任务,那整个集群只有该节点在运行reduce,效率低。故建议将reduce任务数设置为较大数(最大值为72)
调节reduce任务数量:
- 参数调节:mapred.reduce.tasks
- 代码调节:job.setNumReduce Tasks(int n)方法
2-4 总结
略
第3章 Hadoop的分布式缓存
3-1 分布式缓存-DistributedCache
1、基本含义
背景:在执行mapreduce时,可能Mapper之间需要共享一些信息,如果信息量不大,可以将其从HDFS加载到内存中,这就是Hadoop分布式缓存机制。
例子:统计全量的单词文本中存在的单词,那么在Hadoop一开始就把全量的单词加载到内存中 ,然后对于输入的行单词,去在内存中查找,如果全局缓存中存在该单词,就输出;

2、如何使用DistributedCache?
第一步:设置路径和别名
在main方法中加载共享文件的HDFS路径,路径可以是目录也可以是文件。可以在路径末尾追加 “ #” +别名,在map阶段可以使用该别名;

第二步:
在Mapper类或Reducer的setup方法中,用输入流获取分布式缓存中的文件;
该方法在map方法循环之前,只执行一次。

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

矩阵在文件中的表示:

思路:
1、将右侧矩阵转置
矩阵是左矩阵行向量 点乘 右矩阵列向量,因为文本是按行读取的,右矩阵转置后,计算变成左矩阵行向量 点乘 右矩阵行向量
2、矩阵相乘
- 将右矩阵载入分布式缓存;
- 将左矩阵的行作为map输入;
- 在map执行之前:将缓存的右矩阵以行为单位放入list;
- 在map计算时:从list中取出所有行分别与输入行相乘。
代码:
1 | Mapper1 Reducer1 MR1 负责转置 |
第4章 推荐算法
4-1 相似度
余弦相似度
二维向量的余弦相似度

多维向量的余弦相似度

其他相似度

之后的推荐算法统一采用余弦相似度
4-2 基于物品的推荐算法(理论)
例:tb 猜你喜欢
基于物品的协同过滤推荐算法(ItemCF)
用户行为与权重

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


算法步骤:
1、根据用户行为列表,计算用户、物品的评分矩阵


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


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

推荐列表(代表用户对商品的感兴趣程度)

4、去掉推荐列表中已产生过行为的商品

在这里,一个用户只有2个推荐物品,在数据量大的情况下,一个用户会有上千个推荐物品,取top1作为推荐结果,作为用户最感兴趣的物品。
算法实现:

每一步都是一个mapreduce作业

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

代码:
step1~step5
略,见代码
4-6 基于用户的推荐算法(理论)
userCF
算法思想:给用户推荐和他兴趣相似的其他用户喜欢的物品
算法步骤:



4、给有过行为的商品置0

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

代码:
略,见我的代码
4-8 基于内容的推荐算法(理论)
算法思想:给用户推荐和他们喜欢的物品在内容上相似的物品
物品特征建模(item profile)

算法步骤:





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

第五章 总结 & 其他
安装hadoop3
https://blog.csdn.net/lucien7l/article/details/80781908






