1.Hadoop MapReduce Shuffle过程
2.Shuffle过程要点记录
- 每个Map Task把输出结果写到内存中的环形缓冲区。
- 当内存环形缓冲区写入的数据量达到一定阈值时,后台线程会把 数据溢写到磁盘。
- 根据Partitioner,把数据写入到不同的partition
- 对于每个partition的数据进行排序
- 随着Map Task的不断运行,磁盘上的溢出文件越来越多
- 将这些溢出文件合并
- 对于一个partition下的不同分片,使用归并排序,同一分区内数据有序
- Reduce Task通过网络远程拷贝MapTask的结果文件中的属于它的分区数据
- 合并所有已拷贝过来的数据文件
- 采用归并排序算法,对文件数据内容整理排序,将相同key的数据分 为一组,不同key之间有序
- 最终生成一个key对应一组值的数据集,一个key对应的一组数据会调用一次reduce方法
3. Combinery优化总结
- Combiner调用的地方
- MapTask的环形缓冲区向磁盘溢写文件之前调用Combiner
- Map阶段在合并本地多个文件写入一个大文件之前调用Combiner
- 使用Combiner的好处
- 减少Map Task输出数据量,由于临时结果写入到本地磁盘,所以能 够减少磁盘IO
- 减少Reduce-Map网络传输数据量,由于reduce需要远程通过网络从 Map拷贝数据,提高拷贝速度
- 应用场景
- 针对结果可以叠加的场景
- SUM(YES) Average(NO)
- 设置方法(local reducer)
- job.setCombinerClass(WordCountReducer.class)
4.YARN 资源调度器
1. YARN-FIFO Scheduler
将所有应用程序放入到一个队列中
- 先进入队里排在前面的程序先获得资源
局限性
- 资源利用率低,无法交叉运行作业
- 不够灵活,比如紧急的作业无法插队,耗时长作业拖慢耗时短作业
2. YARN-多队列分开调度器
所有资源按照比例划分到不同的队列
每个队列可以实现单独的调度策略
优点
- 按照不同的资源使用情况将资源划分到不同队列
- 能够让更多的应用程序获得资源
- 使用灵活,资源利用率高
调度器
- CapacityScheduler调度器
- FairScheduler调度器
CapacityScheduler
- 由Yahoo开源,共享集群调度器
- 以队列方式组织作业
- 每个队列内部采用FIFO调度策略
- 每个队列分配一定比例资源
- 可限制每个用户使用资源量
CapacityScheduler 配置方法
在yarn-site.xml 设置使用CapacityScheduler调度器
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
在Hadoop配置文件目录下/usr/local/hadoop/etc/hadoop创建capacity-scheduler.xml,添加信息如下:
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,data-bi</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.bi.capacity</name>
<value>40</vaule>
</property>
</configuration>
配置说明
- capacity-scheduler.xml参数说明
- capacity:队列占用的集群资源容量百分比,所有队列的容量 之和应小于100
- maximum-capacity:由于存在资源共享,因此一个队列使用 的资源量可能超过其容量,而最多使用资源量可通过该参数 限制
- 配置完成无需重启YARN,使用管理命令刷新调度配置 bin/yarn rmadmin -refreshQueues
FairScheduler
公平调度器的目的:
- 允许多用户共享集群资源。
- 允许短时的临时作业与长时作业共享集群资源
- 根据比例来管理集群资源,确保集群资源的有效利用'
FairScheduler配置方法
在Hadoop配置目录下/usr/local/hadoop/etc/hadoop yarn-site.xml 增加如下信息:
<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 ,信息如下:
<allocations>
<queue name="data_bi">
<minResources>8000 mb,4 vcores</minResources>
<maxResources>10000 mb, 6 vcores</maxResources>
<maxRunningApps>2</maxRunningApps>
<weight>1.0</weight>
</queue>
</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
title: Hadoop MapReduce优化和资源调度器
1.Hadoop MapReduce Shuffle过程
2.Shuffle过程要点记录
- 每个Map Task把输出结果写到内存中的环形缓冲区。
- 当内存环形缓冲区写入的数据量达到一定阈值时,后台线程会把 数据溢写到磁盘。
- 根据Partitioner,把数据写入到不同的partition
- 对于每个partition的数据进行排序
- 随着Map Task的不断运行,磁盘上的溢出文件越来越多
- 将这些溢出文件合并
- 对于一个partition下的不同分片,使用归并排序,同一分区内数据有序
- Reduce Task通过网络远程拷贝MapTask的结果文件中的属于它的分区数据
- 合并所有已拷贝过来的数据文件
- 采用归并排序算法,对文件数据内容整理排序,将相同key的数据分 为一组,不同key之间有序
- 最终生成一个key对应一组值的数据集,一个key对应的一组数据会调用一次reduce方法
3. Combinery优化总结
- Combiner调用的地方
- MapTask的环形缓冲区向磁盘溢写文件之前调用Combiner
- Map阶段在合并本地多个文件写入一个大文件之前调用Combiner
- 使用Combiner的好处
- 减少Map Task输出数据量,由于临时结果写入到本地磁盘,所以能 够减少磁盘IO
- 减少Reduce-Map网络传输数据量,由于reduce需要远程通过网络从 Map拷贝数据,提高拷贝速度
- 应用场景
- 针对结果可以叠加的场景
- SUM(YES) Average(NO)
- 设置方法(local reducer)
- job.setCombinerClass(WordCountReducer.class)
4.YARN 资源调度器
1. YARN-FIFO Scheduler
将所有应用程序放入到一个队列中
- 先进入队里排在前面的程序先获得资源
局限性 - 资源利用率低,无法交叉运行作业
- 不够灵活,比如紧急的作业无法插队,耗时长作业拖慢耗时短作业
2. YARN-多队列分开调度器
所有资源按照比例划分到不同的队列
每个队列可以实现单独的调度策略
优点
- 按照不同的资源使用情况将资源划分到不同队列
- 能够让更多的应用程序获得资源
- 使用灵活,资源利用率高
调度器
- CapacityScheduler调度器
- FairScheduler调度器
CapacityScheduler
- 由Yahoo开源,共享集群调度器
- 以队列方式组织作业
- 每个队列内部采用FIFO调度策略
- 每个队列分配一定比例资源
- 可限制每个用户使用资源量
CapacityScheduler 配置方法
在yarn-site.xml 设置使用CapacityScheduler调度器
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
在Hadoop配置文件目录下/usr/local/hadoop/etc/hadoop创建capacity-scheduler.xml,添加信息如下:
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,data-bi</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.bi.capacity</name>
<value>40</vaule>
</property>
</configuration>
配置说明
- capacity-scheduler.xml参数说明
- capacity:队列占用的集群资源容量百分比,所有队列的容量 之和应小于100
- maximum-capacity:由于存在资源共享,因此一个队列使用 的资源量可能超过其容量,而最多使用资源量可通过该参数 限制
- 配置完成无需重启YARN,使用管理命令刷新调度配置 bin/yarn rmadmin -refreshQueues
FairScheduler
公平调度器的目的:
- 允许多用户共享集群资源。
- 允许短时的临时作业与长时作业共享集群资源
- 根据比例来管理集群资源,确保集群资源的有效利用'
FairScheduler配置方法
在Hadoop配置目录下/usr/local/hadoop/etc/hadoop yarn-site.xml 增加如下信息:
<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 ,信息如下:
<allocations>
<queue name="data_bi">
<minResources>8000 mb,4 vcores</minResources>
<maxResources>10000 mb, 6 vcores</maxResources>
<maxRunningApps>2</maxRunningApps>
<weight>1.0</weight>
</queue>
</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
补充说明
如果Hadoop启动时,2个名称节点均无法启动,且namenode日志出现如下错误:
2018-02-04 22:12:40,665 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
java.io.FileNotFoundException: /usr/local/hadoop/hdpdata/dfs/name/in_use.lock (权限不够)
是由于使用了root曾启动过hadoop HDFS,因此hadoop用户没有权限访问此文件,因此可以采用以下操作进行恢复。
1.关闭Hadoop服务。
2.定位到 hadoop dfs/name文件夹下 删除文件in_use.lock。
3.重新启动hadoop集群,问题得到解决