Hadoop MapReduce優(yōu)化和資源調(diào)度器

Hadoop Shuffle過程

1.Hadoop MapReduce Shuffle過程

Hadoop Shuffle過程

Map Shuffle過程圖2

2.Shuffle過程要點記錄

  1. 每個Map Task把輸出結(jié)果寫到內(nèi)存中的環(huán)形緩沖區(qū)。
  2. 當(dāng)內(nèi)存環(huán)形緩沖區(qū)寫入的數(shù)據(jù)量達到一定閾值時,后臺線程會把 數(shù)據(jù)溢寫到磁盤。
    • 根據(jù)Partitioner,把數(shù)據(jù)寫入到不同的partition
    • 對于每個partition的數(shù)據(jù)進行排序
  3. 隨著Map Task的不斷運行,磁盤上的溢出文件越來越多
    • 將這些溢出文件合并
    • 對于一個partition下的不同分片,使用歸并排序,同一分區(qū)內(nèi)數(shù)據(jù)有序
  4. Reduce Task通過網(wǎng)絡(luò)遠程拷貝MapTask的結(jié)果文件中的屬于它的分區(qū)數(shù)據(jù)
    • 合并所有已拷貝過來的數(shù)據(jù)文件
    • 采用歸并排序算法,對文件數(shù)據(jù)內(nèi)容整理排序,將相同key的數(shù)據(jù)分 為一組,不同key之間有序
    • 最終生成一個key對應(yīng)一組值的數(shù)據(jù)集,一個key對應(yīng)的一組數(shù)據(jù)會調(diào)用一次reduce方法

3. Combinery優(yōu)化總結(jié)

Combiner優(yōu)化
  1. Combiner調(diào)用的地方
    • MapTask的環(huán)形緩沖區(qū)向磁盤溢寫文件之前調(diào)用Combiner
    • Map階段在合并本地多個文件寫入一個大文件之前調(diào)用Combiner
  2. 使用Combiner的好處
    • 減少Map Task輸出數(shù)據(jù)量,由于臨時結(jié)果寫入到本地磁盤,所以能 夠減少磁盤IO
    • 減少Reduce-Map網(wǎng)絡(luò)傳輸數(shù)據(jù)量,由于reduce需要遠程通過網(wǎng)絡(luò)從 Map拷貝數(shù)據(jù),提高拷貝速度
  3. 應(yīng)用場景
    • 針對結(jié)果可以疊加的場景
    • SUM(YES) Average(NO)
  4. 設(shè)置方法(local reducer)
    • job.setCombinerClass(WordCountReducer.class)

4.YARN 資源調(diào)度器

1. YARN-FIFO Scheduler

將所有應(yīng)用程序放入到一個隊列中

  • 先進入隊里排在前面的程序先獲得資源

局限性

  • 資源利用率低,無法交叉運行作業(yè)
  • 不夠靈活,比如緊急的作業(yè)無法插隊,耗時長作業(yè)拖慢耗時短作業(yè)

2. YARN-多隊列分開調(diào)度器

所有資源按照比例劃分到不同的隊列

每個隊列可以實現(xiàn)單獨的調(diào)度策略

優(yōu)點

  • 按照不同的資源使用情況將資源劃分到不同隊列
  • 能夠讓更多的應(yīng)用程序獲得資源
  • 使用靈活,資源利用率高

調(diào)度器

  • CapacityScheduler調(diào)度器
  • FairScheduler調(diào)度器

CapacityScheduler

  • 由Yahoo開源,共享集群調(diào)度器
  • 以隊列方式組織作業(yè)
  • 每個隊列內(nèi)部采用FIFO調(diào)度策略
  • 每個隊列分配一定比例資源
  • 可限制每個用戶使用資源量
    CapacityScheduler.png

    CapacityScheduler 配置方法

在yarn-site.xml 設(shè)置使用CapacityScheduler調(diào)度器

<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創(chuàng)建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參數(shù)說明
  • capacity:隊列占用的集群資源容量百分比,所有隊列的容量 之和應(yīng)小于100
  • maximum-capacity:由于存在資源共享,因此一個隊列使用 的資源量可能超過其容量,而最多使用資源量可通過該參數(shù) 限制
  • 配置完成無需重啟YARN,使用管理命令刷新調(diào)度配置 bin/yarn rmadmin -refreshQueues

FairScheduler

公平調(diào)度器的目的:

  • 允許多用戶共享集群資源。
  • 允許短時的臨時作業(yè)與長時作業(yè)共享集群資源
  • 根據(jù)比例來管理集群資源,確保集群資源的有效利用'

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>

新建一個公平調(diào)度配置文件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 用戶名作為公平調(diào)度的隊列名稱。

yarn-site.xml參數(shù)說明

  • yarn.resourcemanager.scheduler.class配置yarn使用的調(diào)度器類型
  • yarn.scheduler.fair.allocation.file配置公平調(diào)度器自定義配置文件路徑,該文件每隔10秒就會被加載一次,這樣就可以在集群運行過程中改變隊列的配置
  • yarn.scheduler.fair.user-as-default-queue當(dāng)應(yīng)用程序未指定隊列名時,是否指定用戶名作為應(yīng)用程序所在的隊列名。如果設(shè)置為false或者未設(shè)置,所有 未知隊列的應(yīng)用程序?qū)⒈惶峤坏絛efault隊列中,默認(rèn)值為true
  • yarn.scheduler.fair.preemption如果一個隊列占用的資源量少于最小資源量限制,是否啟用資源搶占,默認(rèn)false。搶占機制可以使其他隊列的作業(yè)容器終止,從而使占用的資源讓出,將資源分配給占用資源量少于最小資源量限制的隊列

fair-scheduler.xml參數(shù)說明

  • queue name:配置隊列名
  • minResources :分配給該隊列的最小資源量,設(shè)置格式為“X mb, Y vcores”,當(dāng)調(diào)度策略屬性schedulingPolicy的屬性值是fair時,其cores值會被忽略,僅按照申請的內(nèi)存大小來調(diào)度。
  • maxResources:分配給該隊列的最大資源量。設(shè)置格式為“X mb, Y vcores”,當(dāng)調(diào)度策略屬性schedulingPolicy的屬性值是fair時,其cores值會被忽略,僅按照申請的內(nèi)存大小來調(diào)度。
  • maxRunningApps:最多同時運行的應(yīng)用程序數(shù)目。通過限制該數(shù)目,可防止超量MapTask同時運行時產(chǎn)生的中間輸出結(jié)果撐爆磁盤。
  • weight:標(biāo)記了資源池的權(quán)重,當(dāng)資源池中有任務(wù)等待,并且集群中有空閑資源時候,每個資源池可以根據(jù)權(quán)重獲得不同比例的集群空閑資源,默認(rèn)值是1

title: Hadoop MapReduce優(yōu)化和資源調(diào)度器

Hadoop Shuffle過程

1.Hadoop MapReduce Shuffle過程

Hadoop Shuffle過程

Map Shuffle過程圖2

2.Shuffle過程要點記錄

  1. 每個Map Task把輸出結(jié)果寫到內(nèi)存中的環(huán)形緩沖區(qū)。
  2. 當(dāng)內(nèi)存環(huán)形緩沖區(qū)寫入的數(shù)據(jù)量達到一定閾值時,后臺線程會把 數(shù)據(jù)溢寫到磁盤。
    • 根據(jù)Partitioner,把數(shù)據(jù)寫入到不同的partition
    • 對于每個partition的數(shù)據(jù)進行排序
  3. 隨著Map Task的不斷運行,磁盤上的溢出文件越來越多
    • 將這些溢出文件合并
    • 對于一個partition下的不同分片,使用歸并排序,同一分區(qū)內(nèi)數(shù)據(jù)有序
  4. Reduce Task通過網(wǎng)絡(luò)遠程拷貝MapTask的結(jié)果文件中的屬于它的分區(qū)數(shù)據(jù)
    • 合并所有已拷貝過來的數(shù)據(jù)文件
    • 采用歸并排序算法,對文件數(shù)據(jù)內(nèi)容整理排序,將相同key的數(shù)據(jù)分 為一組,不同key之間有序
    • 最終生成一個key對應(yīng)一組值的數(shù)據(jù)集,一個key對應(yīng)的一組數(shù)據(jù)會調(diào)用一次reduce方法

3. Combinery優(yōu)化總結(jié)

Combiner優(yōu)化
  1. Combiner調(diào)用的地方
    • MapTask的環(huán)形緩沖區(qū)向磁盤溢寫文件之前調(diào)用Combiner
    • Map階段在合并本地多個文件寫入一個大文件之前調(diào)用Combiner
  2. 使用Combiner的好處
    • 減少Map Task輸出數(shù)據(jù)量,由于臨時結(jié)果寫入到本地磁盤,所以能 夠減少磁盤IO
    • 減少Reduce-Map網(wǎng)絡(luò)傳輸數(shù)據(jù)量,由于reduce需要遠程通過網(wǎng)絡(luò)從 Map拷貝數(shù)據(jù),提高拷貝速度
  3. 應(yīng)用場景
    • 針對結(jié)果可以疊加的場景
    • SUM(YES) Average(NO)
  4. 設(shè)置方法(local reducer)
    • job.setCombinerClass(WordCountReducer.class)

4.YARN 資源調(diào)度器

1. YARN-FIFO Scheduler

將所有應(yīng)用程序放入到一個隊列中

  • 先進入隊里排在前面的程序先獲得資源
    局限性
  • 資源利用率低,無法交叉運行作業(yè)
  • 不夠靈活,比如緊急的作業(yè)無法插隊,耗時長作業(yè)拖慢耗時短作業(yè)

2. YARN-多隊列分開調(diào)度器

所有資源按照比例劃分到不同的隊列

每個隊列可以實現(xiàn)單獨的調(diào)度策略

優(yōu)點

  • 按照不同的資源使用情況將資源劃分到不同隊列
  • 能夠讓更多的應(yīng)用程序獲得資源
  • 使用靈活,資源利用率高

調(diào)度器

  • CapacityScheduler調(diào)度器
  • FairScheduler調(diào)度器

CapacityScheduler

  • 由Yahoo開源,共享集群調(diào)度器
  • 以隊列方式組織作業(yè)
  • 每個隊列內(nèi)部采用FIFO調(diào)度策略
  • 每個隊列分配一定比例資源
  • 可限制每個用戶使用資源量
    CapacityScheduler.png

    CapacityScheduler 配置方法

在yarn-site.xml 設(shè)置使用CapacityScheduler調(diào)度器

<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創(chuàng)建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參數(shù)說明
  • capacity:隊列占用的集群資源容量百分比,所有隊列的容量 之和應(yīng)小于100
  • maximum-capacity:由于存在資源共享,因此一個隊列使用 的資源量可能超過其容量,而最多使用資源量可通過該參數(shù) 限制
  • 配置完成無需重啟YARN,使用管理命令刷新調(diào)度配置 bin/yarn rmadmin -refreshQueues

FairScheduler

公平調(diào)度器的目的:

  • 允許多用戶共享集群資源。
  • 允許短時的臨時作業(yè)與長時作業(yè)共享集群資源
  • 根據(jù)比例來管理集群資源,確保集群資源的有效利用'

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>

新建一個公平調(diào)度配置文件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 用戶名作為公平調(diào)度的隊列名稱。

yarn-site.xml參數(shù)說明

  • yarn.resourcemanager.scheduler.class配置yarn使用的調(diào)度器類型
  • yarn.scheduler.fair.allocation.file配置公平調(diào)度器自定義配置文件路徑,該文件每隔10秒就會被加載一次,這樣就可以在集群運行過程中改變隊列的配置
  • yarn.scheduler.fair.user-as-default-queue當(dāng)應(yīng)用程序未指定隊列名時,是否指定用戶名作為應(yīng)用程序所在的隊列名。如果設(shè)置為false或者未設(shè)置,所有 未知隊列的應(yīng)用程序?qū)⒈惶峤坏絛efault隊列中,默認(rèn)值為true
  • yarn.scheduler.fair.preemption如果一個隊列占用的資源量少于最小資源量限制,是否啟用資源搶占,默認(rèn)false。搶占機制可以使其他隊列的作業(yè)容器終止,從而使占用的資源讓出,將資源分配給占用資源量少于最小資源量限制的隊列

fair-scheduler.xml參數(shù)說明

  • queue name:配置隊列名
  • minResources :分配給該隊列的最小資源量,設(shè)置格式為“X mb, Y vcores”,當(dāng)調(diào)度策略屬性schedulingPolicy的屬性值是fair時,其cores值會被忽略,僅按照申請的內(nèi)存大小來調(diào)度。
  • maxResources:分配給該隊列的最大資源量。設(shè)置格式為“X mb, Y vcores”,當(dāng)調(diào)度策略屬性schedulingPolicy的屬性值是fair時,其cores值會被忽略,僅按照申請的內(nèi)存大小來調(diào)度。
  • maxRunningApps:最多同時運行的應(yīng)用程序數(shù)目。通過限制該數(shù)目,可防止超量MapTask同時運行時產(chǎn)生的中間輸出結(jié)果撐爆磁盤。
  • weight:標(biāo)記了資源池的權(quán)重,當(dāng)資源池中有任務(wù)等待,并且集群中有空閑資源時候,每個資源池可以根據(jù)權(quán)重獲得不同比例的集群空閑資源,默認(rèn)值是1

補充說明

如果Hadoop啟動時,2個名稱節(jié)點均無法啟動,且namenode日志出現(xiàn)如下錯誤:

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 (權(quán)限不夠)

是由于使用了root曾啟動過hadoop HDFS,因此hadoop用戶沒有權(quán)限訪問此文件,因此可以采用以下操作進行恢復(fù)。

1.關(guān)閉Hadoop服務(wù)。
2.定位到 hadoop dfs/name文件夾下 刪除文件in_use.lock。
3.重新啟動hadoop集群,問題得到解決
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容