hadoop——HDFS:分布式文件存储系统
namenode:主节点
主要功能:
1:管理子节点
2:处理客户端发送的请求
3:处理元数据
元数据存放位置:
1:存放于内存中,读写速度快,加快客户端请求
2:存放于磁盘中,防止内存中的数据丢失
3:存放位置:hadoop目录下的data/tmpData/dfs/name/current中
namenode启动过程:
将元数据信息从磁盘中读取到内存中,启动
SecondaryNameNode:辅助主节点进行元数据同步
fsimage:保存了最新的元数据检查点
editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录
fsimge(old) + edits = fsimage(new)
edits:该文件很重要,记录了HDFS的修改操作,不能丢失
可以通过edits日志文件信息,可以解析得到元数据
在合并的过程中,先合并到fs.temp文件,合并完成之后,修改名字为fsimage,删除fs.temp
shuffle运行过程分析
shuffle功能:
分区:决定从map过来的key交由哪一个reduce处理
默认:按照key的has值,对reduce的个数进行取余
取余决定交由哪一个reduce处理
分组:将相同的key进行合并
排序:按照key对每一组key的value进行排序,字典排序排序方式可以修改
执行过程分为两端,map端与reduce端
map端shuffle
reduce端shuffle
shuffle过程的优化
注意:MapReduce的优化,有时候就是优化shuffle
combiner合并优化
在map阶段提前进行了一次合并,一般来讲等同于提前执行了reduce操作。
好处:可以降低reduce的压力
为什么说在map阶段提前运行reduce方法可以降低reduce的压力?
在map阶段的进行合并是 并行的(分布式的)。
combiner合并可以解决数据倾斜问题:
什么是数据倾斜:简单来将,就是数据分配不均匀
换个通俗易懂的解释,就是一帮人干活,累的累死,闲的闲死
可以选择性的把大量的相同key数据先进行一个合并
然后再交给reduce来处理,这样做的好处很多
即减轻了map端向reduce端发送的数据量(减轻了网络带宽)
也减轻了map端和reduce端中间的shuffle阶段的数据拉取数量(本地化磁盘IO速率)
注意:不是所有处理数据时都可以使用合并,只有当处理的数据的value相同时,才可以使用combiner合并进行优化
compress压缩优化:大大减少磁盘IO以及网络IO
MapReduce有很多地方都可以压缩
输入的就是一个压缩文件
map shuffle中合并成一个大文件,对该文件进行压缩,reduce过来取数据就是压缩之后的数据
Hadoop常见的压缩格式
检查本地库支持哪些压缩:
bin/hadoop checknative
修改压缩库,只需要替换native包即可
常用用的压缩格式:snappy;lzo;lz4
hadoop中设置压缩
输入:一般不配置
map的中间结果:
mapreduce.map.output.compress = true;
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.Lz4Codec
压缩方式的寻找:DefaultCodec -》找打该类的目录-》其他压缩类和他在同一个目录下
reduce输出
mapreduce.output.fileoutputformat.compress = true;
mapreduce.output.fileoutputformat.compress.codec= org.apache.hadoop.io.compress.Lz4Codec
配置方式:
方式一:main方法中Configuration
方式二:在配置文件中
全局修改,所有MapReduce都生效
方式三:运行的时候通过自定义配置
bin/yarn jar 运行jar包.jar -D压缩属性=yy -D压缩属性=bb 运行主类 input_path(输入目录) output_Path(输出目录)
检查是否配置成功
方式一:
web中8088端口 -》history -》Configuration-》查看对应配置参数
方式二:查看计数器,Linux中的结果输出信息
Map output materialized bytes
计数器
在map或者reduce中使用计数器
context.getCounter(Temperature.TOTAL).increment(1);