大数据干货系列(一)--MapReduce总结

MapReduce总结

 

本质

MapReduce是一个基于分治思想用于处理海量数据的分布式计算框架

 

、mapreduce解决了什么问题

1.数据分布式存储-HDFS

2.作业调度

3.容错

4.机器间通信等复杂问题

 

分布式计算vs单机计算

 

、MapReduce执行流程


1.四个阶段

1) Inputmap:

①file:HDFS每个文件切分成多个一定大小默认64M)Block

②inputformat:经过数据分割(Data Splits)成记录

③split:多条记录的集合构成split,每个split包含后一个Block中开头部分解决记录跨block的问题

④Record Reader:每读取一条记录调用一次map函数直到split的尾部

         2) map:

        每条记录调用执行一次map()函数就会在内存中增加数据

         3) mapreduce (shuffle):

                ①Partitioner:决定数据由哪个Reducer处理从而分区

            如:{key, value}经过hash得到{partition, key, value}

       ②MemoryBuffer:每个map的结果和partition处理的结果都保存在缓存中

        缓冲区大小默认100M,溢写阈值:100M * 0.8 = 80M

       ③Spill:内存缓冲区达到阈值时溢写spill线程锁住这80M的缓冲区开始将

        数据写出到本地磁盘中然后释放内存

       ④Sort:缓冲区数据按照key进行排序

       ⑤Combiner:预聚合相同的key的数据,value值合并减少输出传输量

4) reduce:

    多个reduce任务输出的数据都属于不同的partition,因此结果数据的key不会重合并reduce的输出文件即可得到最终的结果


2.mapreduce的设置

        1) map

– map任务总数不超过平台可用的任务槽位

– map个数为split的份数,split几乎对应一个block,dfs.block.size决定block大小

2) reduce

– mapred.reduce.task,默认为1

• reduce个数太少

单次执行慢出错再试成本高

• reduce个数太多

shuffle开销大输出大量小文件

3) 集群控制

• 对单个MapReduce

Map个数最好为集群slot的倍数

Reduce个数最好为集群slot的个数倍数

• 多个MapReduce

节奏控制

 

、Hadoop Streaming

1.Strieaming的优点

1) 开发效率高

– 只需按照一定的格式从标准输入读取数据向标准输出写数据就可以

– 容易单机调试:cat input | mapper | sort | reducer > output

2) 程序运行效率高

– 对于CPU密集的计算有些语言如C/C++编写的程序可能比用Java效率更高一些

3) 便于平台进行资源控制

– Streaming框架中通过limit等方式可以灵活地限制应用程序使用的内存等资源

2.Streaming的局限

         1) Streaming默认只能处理文本数据

         2) 两次数据拷贝和解析分割),带来一定的开销

3.Streaming的开发要点

1) input:

指定输入文件的HDFS路径支持使用*通配符和指定多个文件或目录可多次使用

2) output:

指定输出文件的HDFS路径路径必须不存在且具备创建该目录的权限只能使用一次

3) mapper:

用户自己写的mapper程序

4) reduer:

用户自己写的reduce程序

5) file:

打包文件到提交的作业中

(1)mapreduce的执行文件run.sh

(2)mapreduce要用输入的文件如配置文件

另外还有-cacheFile, -cacheArchive分别用于向计算节点分发HDFS文件和HDFS压缩文件

6) jobconf:

提交作业的一些配置属性常见配置

(1)mapred.map.tasks:map task数目

(2)mapred.reduce.tasks:reduce task数目

(3)stream.num.map.output.key.fields:指定map task输出记录中key所占的域数目

(4)num.key.fields.for.partition:指定对key分出来的前几部分做partition,而非整个key

(5)mapred.compress.map.output:map的输出是否压缩

(6)mapred.map.output.compression.codec:map的输出压缩方式

(7)mapred.output.compress:reduce的输出是否压缩

(8)mapred.output.compression.codec:reduce的输出压缩方式



以上.


如果觉得本文对你有帮助,可以帮忙点个赞表示支持吗,谢谢!

如果有任何意见和建议,也欢迎再下方留言~





 

关注这个公众号,每天22:00会有三道大数据面试题准时推送给你哦~



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值