大数据相关大数据程序员

Hadoop MapReduce优化和资源调度器

2018-01-14  本文已影响50人  溯水心生
Hadoop Shuffle过程

1.Hadoop MapReduce Shuffle过程

Hadoop Shuffle过程
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优化总结

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

在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>

配置说明

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参数说明

fair-scheduler.xml参数说明


title: Hadoop MapReduce优化和资源调度器

Hadoop Shuffle过程

1.Hadoop MapReduce Shuffle过程

Hadoop Shuffle过程
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优化总结

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

在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>

配置说明

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参数说明

fair-scheduler.xml参数说明

补充说明

如果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集群,问题得到解决
上一篇 下一篇

猜你喜欢

热点阅读