Hadoop MapReduce优化和资源调度器

《Hadoop MapReduce优化和资源调度器》 Hadoop Shuffle过程

1.Hadoop MapReduce Shuffle过程

《Hadoop MapReduce优化和资源调度器》 Hadoop Shuffle过程

《Hadoop MapReduce优化和资源调度器》 Map Shuffle过程图2

2.Shuffle过程要点记录

  1. 每个Map Task把输出结果写到内存中的环形缓冲区。
  2. 当内存环形缓冲区写入的数据量达到一定阈值时,后台线程会把 数据溢写到磁盘。
    • 根据Partitioner,把数据写入到不同的partition
    • 对于每个partition的数据进行排序
  3. 随着Map Task的不断运行,磁盘上的溢出文件越来越多
    • 将这些溢出文件合并
    • 对于一个partition下的不同分片,使用归并排序,同一分区内数据有序
  4. Reduce Task通过网络远程拷贝MapTask的结果文件中的属于它的分区数据
    • 合并所有已拷贝过来的数据文件
    • 采用归并排序算法,对文件数据内容整理排序,将相同key的数据分 为一组,不同key之间有序
    • 最终生成一个key对应一组值的数据集,一个key对应的一组数据会调用一次reduce方法

3. Combinery优化总结

《Hadoop MapReduce优化和资源调度器》 Combiner优化

  1. Combiner调用的地方
    • MapTask的环形缓冲区向磁盘溢写文件之前调用Combiner
    • Map阶段在合并本地多个文件写入一个大文件之前调用Combiner
  2. 使用Combiner的好处
    • 减少Map Task输出数据量,由于临时结果写入到本地磁盘,所以能 够减少磁盘IO
    • 减少Reduce-Map网络传输数据量,由于reduce需要远程通过网络从 Map拷贝数据,提高拷贝速度
  3. 应用场景
    • 针对结果可以叠加的场景
    • SUM(YES) Average(NO)
  4. 设置方法(local reducer)
    • job.setCombinerClass(WordCountReducer.class)

4.YARN 资源调度器

1. YARN-FIFO Scheduler

将所有应用程序放入到一个队列中

  • 先进入队里排在前面的程序先获得资源

局限性

  • 资源利用率低,无法交叉运行作业
  • 不够灵活,比如紧急的作业无法插队,耗时长作业拖慢耗时短作业

2. YARN-多队列分开调度器

所有资源按照比例划分到不同的队列

每个队列可以实现单独的调度策略

优点

  • 按照不同的资源使用情况将资源划分到不同队列
  • 能够让更多的应用程序获得资源
  • 使用灵活,资源利用率高

调度器

  • CapacityScheduler调度器
  • FairScheduler调度器

CapacityScheduler

  • 由Yahoo开源,共享集群调度器
  • 以队列方式组织作业
  • 每个队列内部采用FIFO调度策略
  • 每个队列分配一定比例资源
  • 可限制每个用户使用资源量
    《Hadoop MapReduce优化和资源调度器》 CapacityScheduler.png
    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优化和资源调度器

《Hadoop MapReduce优化和资源调度器》 Hadoop Shuffle过程

1.Hadoop MapReduce Shuffle过程

《Hadoop MapReduce优化和资源调度器》 Hadoop Shuffle过程

《Hadoop MapReduce优化和资源调度器》 Map Shuffle过程图2

2.Shuffle过程要点记录

  1. 每个Map Task把输出结果写到内存中的环形缓冲区。
  2. 当内存环形缓冲区写入的数据量达到一定阈值时,后台线程会把 数据溢写到磁盘。
    • 根据Partitioner,把数据写入到不同的partition
    • 对于每个partition的数据进行排序
  3. 随着Map Task的不断运行,磁盘上的溢出文件越来越多
    • 将这些溢出文件合并
    • 对于一个partition下的不同分片,使用归并排序,同一分区内数据有序
  4. Reduce Task通过网络远程拷贝MapTask的结果文件中的属于它的分区数据
    • 合并所有已拷贝过来的数据文件
    • 采用归并排序算法,对文件数据内容整理排序,将相同key的数据分 为一组,不同key之间有序
    • 最终生成一个key对应一组值的数据集,一个key对应的一组数据会调用一次reduce方法

3. Combinery优化总结

《Hadoop MapReduce优化和资源调度器》 Combiner优化

  1. Combiner调用的地方
    • MapTask的环形缓冲区向磁盘溢写文件之前调用Combiner
    • Map阶段在合并本地多个文件写入一个大文件之前调用Combiner
  2. 使用Combiner的好处
    • 减少Map Task输出数据量,由于临时结果写入到本地磁盘,所以能 够减少磁盘IO
    • 减少Reduce-Map网络传输数据量,由于reduce需要远程通过网络从 Map拷贝数据,提高拷贝速度
  3. 应用场景
    • 针对结果可以叠加的场景
    • SUM(YES) Average(NO)
  4. 设置方法(local reducer)
    • job.setCombinerClass(WordCountReducer.class)

4.YARN 资源调度器

1. YARN-FIFO Scheduler

将所有应用程序放入到一个队列中

  • 先进入队里排在前面的程序先获得资源
    局限性
  • 资源利用率低,无法交叉运行作业
  • 不够灵活,比如紧急的作业无法插队,耗时长作业拖慢耗时短作业

2. YARN-多队列分开调度器

所有资源按照比例划分到不同的队列

每个队列可以实现单独的调度策略

优点

  • 按照不同的资源使用情况将资源划分到不同队列
  • 能够让更多的应用程序获得资源
  • 使用灵活,资源利用率高

调度器

  • CapacityScheduler调度器
  • FairScheduler调度器

CapacityScheduler

  • 由Yahoo开源,共享集群调度器
  • 以队列方式组织作业
  • 每个队列内部采用FIFO调度策略
  • 每个队列分配一定比例资源
  • 可限制每个用户使用资源量
    《Hadoop MapReduce优化和资源调度器》 CapacityScheduler.png
    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集群,问题得到解决
    原文作者:溯水心生
    原文地址: https://www.jianshu.com/p/e2d3b4da860a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞