一、Hadoop
Hadoop是一套大数据计数组件,三大核心组件:
① HDFS:Hadoop分布式文件系统。解决分布式系统的文件存储问题,本质是提供一套跨机器的文件管理服务。
② MapReduce:Hadoop的分布式运算程序编程框架
③ Yarn:Hadoop的分布式运算资源调度系统。解决分布式运算程序的启动、资源调度和资源回收。
Hadoop外围组件:
① Hive:基于HDFS和MapReduce的sql工具
② HBase:基于HDFS实现的分布式Nosql数据库
③ Flume:分布式日志采集系统
④ Sqoop:数据迁移工具(关系型数据库 <——>Hadoop存储系统)
1.1 MapReduce
① 核心思想:分而治之。通过一定划分方法将数据分成多个较小的(互不依赖的)具有同样计算过程的数据块,并非给不同节点去处理
② 特点:易于编程;具有良好拓展性;高容错性;适合海量数据离线处理
(缺点:实时计算性能差,不能进行流式计算)
③ MapReduce处理过程:
Map阶段:
a. 设置InputFormat类,将读取的数据切分成键值对(k1-v1:k1每行数据相对于文件开头的偏移量;v1是每行数据)
b. 自定义map逻辑,将k1-v1转换为k2-v2,输出结果。(继承Mapper类,重写Map方法)
(Shuffle阶段)
c. 分区:将数据标记好分区,发送到环形缓冲区(默认大小100Mb,达到80%阈值溢写)。对key取hash,对reduceTask个数取余,余几就放到哪个分区中
d. 排序:对分区内的key按字典序排序(快排)
(溢写:溢写文件默认每十个合成一个,用的归并排序merge)
e. 局部聚合 Combiner:要求不能对最终数据结果有影响,可以sum,不可以avg
(在map阶段读取数据产生k2,v2之后,我们可以通过使用combiner规约来将map阶段的k2进行合并,v2生成集合,也就是从而减少生成文件的大小,减少reduce读取map阶段文件的网络传输。也就是本该在reduce阶段进行相同key合并,value形成新的集合的这个过程在map阶段通过使用规约提前完成了)
(map数量由块的数量决定,读几个block就有几个mapTask)
Reduce阶段:
(Shuffle阶段)
a. 拉取数据:所有maptask执行完毕后,会启动一定数量的reduceTask主动拉取map端的数据
b. 合并:复制的数据先存放环形缓冲区,缓冲区溢出则写入磁盘文件。拉去完所有的数据之后采用归并排序将内存和磁盘中的数据都进行一次排序。
c. 分组:分组操作,将数据以组为单位发送到reduce方法里
(Shuffle阶段结束)
c. 编写Reduce函数实现k2-v2转换到k3-v3并输出
d. 设置OutputFormat处理并爆出输出的key-value(k3-v3)数据
④ 优化:数据倾斜
数据倾斜:处理数据时,大量数据呗分配到一个分区中,导致单个节点忙碌、其他节点空闲的问题。这背离了MapReduce并行计算的初中,降低了处理数据的效率。
解决方法:
a. 重新设计key:在Mapper中给key加上一个随机数,附带随机数的key不会呗大量分配到同一个节点,传到Reducer后去掉随机数即可。
b. 使用Combiner(局部聚合):选择性地把大量key相同的数据先合并,再传递给Reduce阶段处理,降低Map阶段向Reduce发送地数据量。
c. 增加Reduce任务数:增加处理数据的节点
d. 增加虚拟机内存:提高运行效率
e. 自定义分区:随机
⑤ Shuffle缺点:频繁设计数据再内存、磁盘间的多次往复
⑥ 实现两个表的join
a. map join(适用于有一份数据较小