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调度器
  • FairScheduler调度器

CapacityScheduler

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

CapacityScheduler

  • 由Yahoo开源,共享集群调度器
  • 以队列方式组织作业
  • 每个队列内部采用FIFO调度策略
  • 每个队列分配一定比例资源
  • 可限制每个用户使用资源量
    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集群,问题得到解决
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343