Mapreduce分布式编程

MapReduce是一个处理海量数据的分布式计算框架,它解决了数据分布式存储、作业调度、容错等问题。Map阶段包括输入、数据分割、Record Reader,Reduce阶段涉及 Shuffle、Sort 和 Combiner。Hadoop Streaming 提供了使用其他语言(如C/C++)进行MapReduce开发的便利,但也有其局限性。设置合理的map和reduce任务数量对于优化性能至关重要。
摘要由CSDN通过智能技术生成

一、本质

MapReduce是一个基于分治思想,用于处理海量数据的分布式计算框架。
 Mapreduce框架的主要程序分为三种即Master,Map和Reduce

二、mapreduce解决了什么问题

1.数据分布式存储-HDFS

2.作业调度

3.容错

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

三、分布式计算vs单机计算

在这里插入图片描述
四、MapReduce执行流程

在这里插入图片描述
1.四个阶段

Input到map:
①file:HDFS中,每个文件切分成多个一定大小(默认64M)的Block

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

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

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

 2) map:

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

 3) map到reduce (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值合并,减少输出传输量
reduce:

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

2.map和reduce的设置

1) map

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

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

reduce
– mapred.reduce.task,默认为1

• reduce个数太少

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

• reduce个数太多

shuffle开销大,输出大量小文件

集群控制
• 对单个MapReduce

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

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

• 多个MapReduce

节奏控制

五、Hadoop Streaming

在这里插入图片描述
1.Strieaming的优点:

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

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

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

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

2.Streaming的局限:

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

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

3.Streaming的开发要点:

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

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

mapper:
用户自己写的mapper程序

reduer:
用户自己写的reduce程序

file:
打包文件到提交的作业中,

(1)map和reduce的执行文件,如run.sh

(2)map和reduce要用输入的文件,如配置文件

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

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的输出是否压缩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值