MapReduce
2026-01-29 13:58:38 1 举报
AI智能生成
MapReduce知识框架
作者其他创作
大纲/内容
MR的工作机制<br>
图解<br>
Map<br>
MapTask阶段<br> 1)InputForamt输入阶段<br> 本身是一个接口,我们常用是TextInputFormat 如果特殊情况可以自定义<br> 获取切片getsplits<br> LineRecordReader<br> 2)MapTask阶段<br> 自定义Mapper 实现Map<br>
Reduce<br>
Redce Task 阶段<br> 1)ReduceTask 阶段 将K2 ,V2 转为K3,V3<br> 2)OutPutFormat 常用的还是TextOutputFormat<br>
shuffle<br>
概念<br>
一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称为shuffle<br>
Map的shuffle: <br>1、分区, 如果想获得到多个结果的时候,就要用到分区,物以类聚<br>2、排序, 局部的排序<br>3、规约,默认是不使用,不能影响最终的效果<br>reduce的shuffle<br>分组:按照那个字段进行group by 这个字段就是k2<br>
shuffle的压缩机制<br>
压缩比<br>
压缩时间<br>
资源消耗<br>
设置<br>
在代码中进行压缩<br>
在全局配置压缩<br>
所有节点都要修改 mapred-site.xml, 修改完成之后记得重启集群<br>
并行度机制<br>
MapTask并行度机制<br>
概念<br>
Maptask的并行度指的是Map阶段有多少个task共同处理任务;<br>为了调整大小,可以采用把block的大小调整一下,这样split的size就变了<br>
决定<br>
由客户端在提交job时决定 :客户端在提交job之前会把数据进行逻辑切片,每个对应的启动一个task;<br>逻辑切片机制由 FileInputFormat 实现类的 getSplits()方法完成。<br>
切片机制<br>
文件大小/block块大小>1.1<br>
Reducetask 并行度机制<br>
决定<br>
Reducetask 数量的决定是可以直接手动设置:job.setNumReduceTasks(4);<br>
问题<br>
如果数据分布不均匀 就会产生数据倾斜<br>
注意的问题<br>
1、如何处理小文件<br>
比如有三个小文件 每个文件的大小都是几k 那么一般来说就要运行三个maptask 很浪费 那么如何处理呢???<br>
通常有三种方式<br>
1、存储到HDFS前<br>
java IO流合并小文件<br>
2、存储到HDFS时<br>
appendToFile 追加 上传的时候可以合并<br>
3、存储到HDFS后<br>
存储后 可以将文件合并成一个文档<br>
Hadoop里面内置的一个<b><font color="#c41230">CombineTextinputformat</font></b>类来处理小文件:格局一定的规则,将HDFS上多个小文件合并到一个InputSplit中,然后启用一个maptask来处理<br>切片机制过程:两部 1、虚拟存储过程 2、切片过程<br>切片机制:如果一个文件大于设置最大值的两倍 则平均切两份 ,如果小于最大值则分一块<br>切片过程:如果文件大小大于setMaxIputSplitSize 值 则单独形成一个切片,如果小于则和下个文件合并形成一个切片<br>
产生的小文件造成的影响<br>
消耗NameNode大量的内存:因为很多的小文件,所以元数据信息就会很多<br>
延长MapReduce作业的总运行时间<br>
MapRudece默认的TextInputFormat切片机制是对任务按文件规划切片,如果有大量的小文件,就会创建大量的maptask<br>
2、处理大文件<br>
block会很会 会导致maptask就会很多<br>所以让blocksize设置大一点就好了<br>
3、split的大小和block的大小是一致的 如果是不超过blocksize的1.1倍 切割的时候就只有一个split<br>
1<br>
案例<br>
获取案件名称
getPath().getName()<br>
自由主题
0 条评论
下一页