
1.Hadoop MapReduce Shuffle过程


2.Shuffle过程要点记录
- 每个Map Task把输出结果写到内存中的环形缓冲区。
- 当内存环形缓冲区写入的数据量达到一定阈值时,后台线程会把 数据溢写到磁盘。
- 根据Partitioner,把数据写入到不同的partition
- 对于每个partition的数据进行排序
- 随着Map Task的不断运行,磁盘上的溢出文件越来越多
- 将这些溢出文件合并
- 对于一个partition下的不同分片,使用归并排序,同一分区内数据有序
- 将这些溢出文件合并
- Reduce Task通过网络远程拷贝MapTask的结果文件中的属于它的分区数据
- Combiner调用的地方
- MapTask的环形缓冲区向磁盘溢写文件之前调用Combiner
- Map阶段在合并本地多个文件写入一个大文件之前调用Combiner
- 使用Combiner的好处
- 减少Map Task输出数据量,由于临时结果写入到本地磁盘,所以能 够减少磁盘IO
- 减少Reduce-Map网络传输数据量,由于reduce需要远程通过网络从 Map拷贝数据,提高拷贝速度
- 应用场景
- 针对结果可以叠加的场景
- SUM(YES) Average(NO)
- 设置方法(local reducer)
每个队列可以实现单独的调度策略
优点
- 按照不同的资源使用情况将资源划分到不同队列
- 能够让更多的应用程序获得资源
- 使用灵活,资源利用率高
调度器
CapacityScheduler调度器
- FairScheduler调度器
CapacityScheduler
- 由Yahoo开源,共享集群调度器
- 以队列方式组织作业
- 每个队列内部采用FIFO调度策略
- 每个队列分配一定比例资源
- 可限制每个用户使用资源量CapacityScheduler.png
在yarn-site.xml 设置使用CapacityScheduler调度器
1 | <property> |
在Hadoop配置文件目录下/usr/local/hadoop/etc/hadoop创建capacity-scheduler.xml,添加信息如下:
1 | <configuration> |
配置说明
- capacity-scheduler.xml参数说明
- capacity:队列占用的集群资源容量百分比,所有队列的容量 之和应小于100
- maximum-capacity:由于存在资源共享,因此一个队列使用 的资源量可能超过其容量,而最多使用资源量可通过该参数 限制
- 配置完成无需重启YARN,使用管理命令刷新调度配置 bin/yarn rmadmin -refreshQueues
FairScheduler
公平调度器的目的:
- 允许多用户共享集群资源。
- 允许短时的临时作业与长时作业共享集群资源
- 根据比例来管理集群资源,确保集群资源的有效利用’
FairScheduler配置方法
在Hadoop配置目录下/usr/local/hadoop/etc/hadoop yarn-site.xml 增加如下信息:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
<name>yarn.scheduler.fair.user-as-default-queue</name>
<value>true</value>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/usr/local/hadoop/etc/hadoop/fair-scheduler.xml</value>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>true</value>
</property>
新建一个公平调度配置文件fair-scheduler.xml ,信息如下:
1 | <allocations> |
上述配置以 data_bi 用户名作为公平调度的队列名称。
yarn-site.xml参数说明
- yarn.resourcemanager.scheduler.class配置yarn使用的调度器类型
- yarn.scheduler.fair.allocation.file配置公平调度器自定义配置文件路径,该文件每隔10秒就会被加载一次,这样就可以在集群运行过程中改变队列的配置
- yarn.scheduler.fair.user-as-default-queue当应用程序未指定队列名时,是否指定用户名作为应用程序所在的队列名。如果设置为false或者未设置,所有 未知队列的应用程序将被提交到default队列中,默认值为true
- yarn.scheduler.fair.preemption如果一个队列占用的资源量少于最小资源量限制,是否启用资源抢占,默认false。抢占机制可以使其他队列的作业容器终止,从而使占用的资源让出,将资源分配给占用资源量少于最小资源量限制的队列
fair-scheduler.xml参数说明
- queue name:配置队列名
- minResources :分配给该队列的最小资源量,设置格式为“X mb, Y vcores”,当调度策略属性schedulingPolicy的属性值是fair时,其cores值会被忽略,仅按照申请的内存大小来调度。
- maxResources:分配给该队列的最大资源量。设置格式为“X mb, Y vcores”,当调度策略属性schedulingPolicy的属性值是fair时,其cores值会被忽略,仅按照申请的内存大小来调度。
- maxRunningApps:最多同时运行的应用程序数目。通过限制该数目,可防止超量MapTask同时运行时产生的中间输出结果撑爆磁盘。
- weight:标记了资源池的权重,当资源池中有任务等待,并且集群中有空闲资源时候,每个资源池可以根据权重获得不同比例的集群空闲资源,默认值是1