MapReduce是一种分布式的离线计算框架,是一种编程模型,用于大规模数据集(大于1TB)的并行运算。将自己的程序运行在分布式系统上。概念是:"Map(射)“和"Reduce(归约)”。设计理念“分与合”,移动计算不是移动数据。
自己理解:各自服务器上取片将数据来映射成map,shuffle是从不同服务器拉去数据将每个服务器上的MAP建值进行归类,reduce将归类好的再次统计,最后返回最终的结果
设计理念
- 分布式计算
- 移动计算而不是移动数据
计算框架
Split 大小规则
- max.split(100M)最大切片可以很大
- min.split(10M)最小切片大小为1b
- block(64M)
max(min.split,min(max.split,block))
默认情况下,split实际=block大小
map个数
Map个数=数据总数/切片大小(默认情况下就是block数)
reduce个数
- Reducer的数目由mapred-site.xml配置文件里的项目mapred.reduce.tasks决定。缺省值为1,用户可以覆盖之。
- Reduce的数目建议是(实际工作中就是1,2,3…也就是map的键mod1,2,3…)
0.95/1.75乘(<no. of nodes> mapred.tasktracker.reduce.tasks.maximum)。
用0.95,所有reduce可以在maps一完成时就立刻启动,开始传输map的输出结果。
用1.75,速度快的节点可以在完成第一轮reduce任务后,可以开始第二轮,这样可以得到比较好的负载均衡的效果。
增加reduce的数目会增加整个框架的开销,但可以改善负载均衡,降低由于执行失败带来的负面影响。
shuffle
- 在mapper和reducer中间的一个步骤
可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的reducer那里去处理。 - 可以简化reducer过程
Partitoner分区 : hash(key) mod R 决定之后的,也就是说传到下个阶段是传了3个参数:key,vale,p(分区号),这样shuffle就知道这个数据要放到哪个分区
(在这个阶段会有多次排序多次溢写到磁盘中)
- map阶段,同一个map中可能有相同的键,这个时候,我们可以在map阶段把相同键聚合统计,减少map到reduce之间shuffle的拉去数据量这个操作叫做combiner(慎用,一般用于累加)
MR架构
主多从架构:
- 主 JobTracker:(RM)
负责调度分配每一个子任务task运行于TaskTracker上,如果发现有失败的task就重新分配其任务到其他节点。每一个hadoop集群中只一个 JobTracker, 一般它运行在NN节点上。 - 从TaskTracker:(NM)
TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个MapTask/ReduceTask 任务,为了减少网络带宽TaskTracker最好运行在HDFS的DataNode上。
MapReduce 安装
修改配置文件:
mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
ResourceManager 和NodeManager主从结构
RS存在单点故障问题 所以要对他做HA 通过zk
修改yarn-site.xml配置文件,完整的内容如下:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>mr_shsxt</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node04</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>