MapReduce运行到YARN的过程详解
1 client向YARN主节点ResourceManager提交运行
2 RM在某个NN节点上启动一个Container运行appMaster(运行应用的管理者)
3 appMaster向RM请求资源,为了运行MapReduce中所有的任务;
RM将分配NM上的资源,并告知appMaster。
4 appMaster联系NM,启动对应Container中的相关task
5 运行的task会实时的向appMaster进行汇报,用于监听整个应用。
6 当所有task(reduceTask)运行完成,appMaster告知RM,销毁appMaster
设计MapReduce程序
map:分片处理,将一个大的任务进行拆分
1 数据过滤
2 数据补全(比如用身份证得到地区以及出生年月)
3 字段格式化
reduce:合并处理
Secondary NameNode
NameNode
处理客户端发过来的请求,管理子节点,管理元数据
问题1:元数据在哪??
为了加快访问,元数据放在NameNode那台主机的内存里面内存
读写速度很快,可以加快请求
问题2:主机关机了怎么办?
元数据存储在内存中,也存储在磁盘中,也就是一个文件。
这个文件名名称fsimage
/opt/modules/hadoop-2.7.3/data/tmpData/dfs/name/current
namenode启动过程
首先加载fsimage文件内容到内存中
功能:
1 辅助NameNode同步本地元数据。
2 启动的时候加载fsimage文件内容,但是启动之后,CURD操作,导致元数据变更,Secondary NameNode将元数据变更的内容写到磁盘中。
fsimage(new) = fsimage(old) + edits
edits:
1 edits文件很重要,它记录了HDFS CRUD操作,不能丢失
2 edits文件存储到一个独立的服务器中,hdfs HA,2个namenode
3 edits文件日志信息文件,可以通过解析它得到元数据
合并过程:
先合并到fs.temp,合并完成之后将名字改成fsimage,删除temp文件
shuffle过程
实现的功能:
分区:
决定当前key交给那个reduce进行处理。
相同的key必须在一个reduce task 中。
默认:安装Key hashCode值对reduce的个数进行取余
HashPartitioner
如果自定义分区的话,默认是key,我们也可以根据value进行分区
分组:
将相同的key的value进行合并
key相同的话,将会分到一个组里面
在MapReduce阶段,一行调用一次map方法,一种key调用一次reduce方法
排序:
按照key对keyvalue进行排序,字典排序
过程:
map端的shuffle:
spill:溢写
1 每一个map处理处理好的结果会进入环形缓冲区(内存,100M)
2 分区:确定每一条keyvalue交给那个reduce处理(打标签)
3 排序:将相同分区的数据进行分区内的排序
4 当整个缓冲区达到阈值80%,开始溢写,将当前分区排序后数据写入到磁盘中,变成了文件file1,最终生产多个小文件
merge:合并,将生产的小文件进行合并
排序:将相同分区的数据进行分区排序
map task结束,通知app master,app master通过reduce拉取数据
reduce端的shuffle:
1
reduce启动多线程通过http到每台机器上去拉取属于自己分区的数据
2 merge:合并,将每个map task的结果中属于自己分区的数据进行合并
3 排序:对整个属于我的分区数据进行排序
4 分组:将相同key的value进行合并
shuffle优化
combiner:在map阶段提前进行了一个合并,一般情况,等同于 提前了reduce操作,可以减轻reduce压力,并不是所有的程序都是适合combiner。
compress:压缩,大大减少磁盘IO以及网络IO,MapReduce阶段很多地方都可以压缩。
压缩一般用在以下三个方面:
输入一个压缩文件(一般不配置)
map shuffle阶段会合并成一个大文件,可以对该文件进行压缩,reduce过来取的数据,就是压缩的文件
reduce的输出
Hadoop支持的压缩方式:snappy,lzo,lz4
检查是否支持哪些压缩:bin/hadoop checknative
Hadoop中设置压缩:
mapreduce.map.output.compress = true
mapreduce.map.output.compress.codec=""