avatar

目录
Hadoop-进阶

参考:imooc https://www.imooc.com/learn/890

接着我的笔记【Hadoop-基础篇】讲

第1章 概述

大数据应用

Code
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

![屏幕快照 2019-08-16 下午2.27.05](20190814182031052/屏幕快照 2019-08-16 下午2.27.05.png)

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

![屏幕快照 2019-08-16 下午2.32.01](20190814182031052/屏幕快照 2019-08-16 下午2.32.01.png)

2、 Map(需要编码)

如下是第一个分片(第一行)的处理逻辑:

![屏幕快照 2019-08-16 下午2.35.50](20190814182031052/屏幕快照 2019-08-16 下午2.35.50.png)

mapper类会对第二行、第三行..重复这个逻辑,直到结束。该阶段的输出回作为下阶段的输入。

3、Shuffle

可理解为从map输出到reduce输入的过程,且涉及到网络传输。将所有相同的单词归到一起,结果统计放在下个阶段做,该阶段的输出回作为下阶段的输入。

![屏幕快照 2019-08-16 下午2.38.55](20190814182031052/屏幕快照 2019-08-16 下午2.38.55.png)

4、Reduce(需要编码)

![屏幕快照 2019-08-16 下午2.40.03](20190814182031052/屏幕快照 2019-08-16 下午2.40.03.png)

WordCount总结:

![屏幕快照 2019-08-16 下午2.41.49](20190814182031052/屏幕快照 2019-08-16 下午2.41.49.png)

2-2 从分片输入到Map

1、输入文件

![屏幕快照 2019-08-16 下午2.45.50](20190814182031052/屏幕快照 2019-08-16 下午2.45.50.png)

分片输入:

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

![屏幕快照 2019-08-16 下午2.51.53](20190814182031052/屏幕快照 2019-08-16 下午2.51.53.png)

理想的输入文件:

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

2、节点Map任务的个数

分片数个map任务个数有什么关系?

如下图,2个文件file1,file2经过计算,得到4个分片(file1是split1~split3, file2是split4),则这台节点会启动4个map任务,即同时有4个mapper线程在循环执行map任务。

![屏幕快照 2019-08-16 下午2.57.31](20190814182031052/屏幕快照 2019-08-16 下午2.57.31.png)

在实际情况下,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一样。

![屏幕快照 2019-08-16 下午3.08.58](20190814182031052/屏幕快照 2019-08-16 下午3.08.58.png)

为什么需要一次Combine操作?

在多数情况下,Combine的逻辑和reduce的逻辑是一致的,即都是按照key合并数据,故可以认为Combine是对本地数据的Reduce操作。这里复用Reducer的逻辑,也可以自己实现Combiner类。

java
1
2
job.setCombinerClass(MyReduce.class);
job.setReducerClass(MyReduce.class);

2、从Map到Reduce

如下图,超过缓冲区大小,map数据会溢写到磁盘上,三个颜色表示文件中只有三种不同的key值。然后将小文件经过Combine操作合并成大文件,进一步减少网络开销。然后开始进行网络传输,进入各自的Patition阶段。

![屏幕快照 2019-08-16 下午3.26.34](20190814182031052/屏幕快照 2019-08-16 下午3.26.34.png)

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一开始就把全量的单词加载到内存中 ,然后对于输入的行单词,去在内存中查找,如果全局缓存中存在该单词,就输出;

![屏幕快照 2019-08-16 下午4.04.39](20190814182031052/屏幕快照 2019-08-16 下午4.04.39.png)

2、如何使用DistributedCache?

第一步:设置路径和别名

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

![屏幕快照 2019-08-16 下午4.07.55](20190814182031052/屏幕快照 2019-08-16 下午4.07.55.png)

第二步:

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

该方法在map方法循环之前,只执行一次。

![屏幕快照 2019-08-16 下午4.10.33](20190814182031052/屏幕快照 2019-08-16 下午4.10.33.png)

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

3-2~3-4 MapReduce实现矩阵相乘

![屏幕快照 2019-08-16 下午4.14.56](20190814182031052/屏幕快照 2019-08-16 下午4.14.56.png)

矩阵在文件中的表示:

![屏幕快照 2019-08-16 下午4.16.35](20190814182031052/屏幕快照 2019-08-16 下午4.16.35.png)

思路:

1、将右侧矩阵转置

矩阵是左矩阵行向量 点乘 右矩阵列向量,因为文本是按行读取的,右矩阵转置后,计算变成左矩阵行向量 点乘 右矩阵行向量

2、矩阵相乘

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

代码:

Code
1
2
3
Mapper1 Reducer1 MR1 负责转置 
Mapper2 Reducer2 MR2 负责相乘
略...

第4章 推荐算法

4-1 相似度

余弦相似度

二维向量的余弦相似度

![屏幕快照 2019-08-26 下午3.14.48](20190814182031052/屏幕快照 2019-08-26 下午3.14.48.png)

多维向量的余弦相似度

![屏幕快照 2019-08-26 下午3.16.09](20190814182031052/屏幕快照 2019-08-26 下午3.16.09.png)

其他相似度

![屏幕快照 2019-08-26 下午3.16.38](20190814182031052/屏幕快照 2019-08-26 下午3.16.38.png)

之后的推荐算法统一采用余弦相似度

4-2 基于物品的推荐算法(理论)

例:tb 猜你喜欢

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

用户行为与权重

![屏幕快照 2019-08-26 下午3.21.47](20190814182031052/屏幕快照 2019-08-26 下午3.21.47.png)

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

实例:

![屏幕快照 2019-08-26 下午3.24.11](20190814182031052/屏幕快照 2019-08-26 下午3.24.11.png)

![屏幕快照 2019-08-26 下午3.24.22](20190814182031052/屏幕快照 2019-08-26 下午3.24.22.png)

算法步骤:

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

![屏幕快照 2019-08-26 下午3.27.24](20190814182031052/屏幕快照 2019-08-26 下午3.27.24.png)

![屏幕快照 2019-08-26 下午3.27.36](20190814182031052/屏幕快照 2019-08-26 下午3.27.36.png)

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

![屏幕快照 2019-08-26 下午3.32.00](20190814182031052/屏幕快照 2019-08-26 下午3.32.00.png)

![屏幕快照 2019-08-26 下午3.32.12](20190814182031052/屏幕快照 2019-08-26 下午3.32.12.png)

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

![屏幕快照 2019-08-26 下午3.35.09](20190814182031052/屏幕快照 2019-08-26 下午3.35.09.png)

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

![屏幕快照 2019-08-26 下午3.36.22](20190814182031052/屏幕快照 2019-08-26 下午3.36.22.png)

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

![屏幕快照 2019-08-26 下午3.39.41](20190814182031052/屏幕快照 2019-08-26 下午3.39.41-6805206.png)

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

算法实现:

![屏幕快照 2019-08-26 下午3.42.48](20190814182031052/屏幕快照 2019-08-26 下午3.42.48.png)

每一步都是一个mapreduce作业

![屏幕快照 2019-08-26 下午3.43.53](20190814182031052/屏幕快照 2019-08-26 下午3.43.53.png)

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

![屏幕快照 2019-08-26 下午4.02.20](20190814182031052/屏幕快照 2019-08-26 下午4.02.20.png)

代码:

step1~step5

略,见代码

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

userCF

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

算法步骤:

![屏幕快照 2019-08-27 下午4.33.33](20190814182031052/屏幕快照 2019-08-27 下午4.33.33.png)

![屏幕快照 2019-08-27 下午4.36.55](20190814182031052/屏幕快照 2019-08-27 下午4.36.55.png)

![屏幕快照 2019-08-27 下午4.37.36](20190814182031052/屏幕快照 2019-08-27 下午4.37.36.png)

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

![屏幕快照 2019-08-27 下午4.38.31](20190814182031052/屏幕快照 2019-08-27 下午4.38.31.png)

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

![屏幕快照 2019-08-27 下午4.41.05](20190814182031052/屏幕快照 2019-08-27 下午4.41.05.png)

代码:

略,见我的代码

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

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

物品特征建模(item profile)

![屏幕快照 2019-08-27 下午4.57.59](20190814182031052/屏幕快照 2019-08-27 下午4.57.59.png)

算法步骤:

![屏幕快照 2019-08-27 下午4.59.01](20190814182031052/屏幕快照 2019-08-27 下午4.59.01.png)

![屏幕快照 2019-08-27 下午4.59.46](20190814182031052/屏幕快照 2019-08-27 下午4.59.46.png)

![屏幕快照 2019-08-27 下午5.00.19](20190814182031052/屏幕快照 2019-08-27 下午5.00.19.png)

![屏幕快照 2019-08-27 下午5.01.16](20190814182031052/屏幕快照 2019-08-27 下午5.01.16.png)

![屏幕快照 2019-08-27 下午5.02.08](20190814182031052/屏幕快照 2019-08-27 下午5.02.08.png)

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

![屏幕快照 2019-08-27 下午5.05.18](20190814182031052/屏幕快照 2019-08-27 下午5.05.18.png)

第五章 总结 & 其他

安装hadoop3

https://blog.csdn.net/lucien7l/article/details/80781908

关于 HDFS 数据块占用实际磁盘空间问题

https://blog.csdn.net/qq_32445015/article/details/86677107

文章作者: Machine
文章链接: https://machine4869.gitee.io/2019/08/14/20190814182031052/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哑舍
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论