
1.Hadoop MapReduce Shuffle過程


2.Shuffle過程要點記錄
- 每個Map Task把輸出結(jié)果寫到內(nèi)存中的環(huán)形緩沖區(qū)。
- 當(dāng)內(nèi)存環(huán)形緩沖區(qū)寫入的數(shù)據(jù)量達到一定閾值時,后臺線程會把 數(shù)據(jù)溢寫到磁盤。
- 根據(jù)Partitioner,把數(shù)據(jù)寫入到不同的partition
- 對于每個partition的數(shù)據(jù)進行排序
- 隨著Map Task的不斷運行,磁盤上的溢出文件越來越多
- 將這些溢出文件合并
- 對于一個partition下的不同分片,使用歸并排序,同一分區(qū)內(nèi)數(shù)據(jù)有序
- 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調(diào)用的地方
- MapTask的環(huán)形緩沖區(qū)向磁盤溢寫文件之前調(diào)用Combiner
- Map階段在合并本地多個文件寫入一個大文件之前調(diào)用Combiner
- 使用Combiner的好處
- 減少Map Task輸出數(shù)據(jù)量,由于臨時結(jié)果寫入到本地磁盤,所以能 夠減少磁盤IO
- 減少Reduce-Map網(wǎng)絡(luò)傳輸數(shù)據(jù)量,由于reduce需要遠程通過網(wǎng)絡(luò)從 Map拷貝數(shù)據(jù),提高拷貝速度
- 應(yīng)用場景
- 針對結(jié)果可以疊加的場景
- SUM(YES) Average(NO)
- 設(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)度器

1.Hadoop MapReduce Shuffle過程


2.Shuffle過程要點記錄
- 每個Map Task把輸出結(jié)果寫到內(nèi)存中的環(huán)形緩沖區(qū)。
- 當(dāng)內(nèi)存環(huán)形緩沖區(qū)寫入的數(shù)據(jù)量達到一定閾值時,后臺線程會把 數(shù)據(jù)溢寫到磁盤。
- 根據(jù)Partitioner,把數(shù)據(jù)寫入到不同的partition
- 對于每個partition的數(shù)據(jù)進行排序
- 隨著Map Task的不斷運行,磁盤上的溢出文件越來越多
- 將這些溢出文件合并
- 對于一個partition下的不同分片,使用歸并排序,同一分區(qū)內(nèi)數(shù)據(jù)有序
- 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調(diào)用的地方
- MapTask的環(huán)形緩沖區(qū)向磁盤溢寫文件之前調(diào)用Combiner
- Map階段在合并本地多個文件寫入一個大文件之前調(diào)用Combiner
- 使用Combiner的好處
- 減少Map Task輸出數(shù)據(jù)量,由于臨時結(jié)果寫入到本地磁盤,所以能 夠減少磁盤IO
- 減少Reduce-Map網(wǎng)絡(luò)傳輸數(shù)據(jù)量,由于reduce需要遠程通過網(wǎng)絡(luò)從 Map拷貝數(shù)據(jù),提高拷貝速度
- 應(yīng)用場景
- 針對結(jié)果可以疊加的場景
- SUM(YES) Average(NO)
- 設(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集群,問題得到解決
