1.Hadoop MapReduce Shuffle過程
2.Shuffle過程要點記錄
- 每個Map Task把輸出結果寫到內存中的環形緩沖區。
- 當內存環形緩沖區寫入的數據量達到一定閾值時,后臺線程會把 數據溢寫到磁盤。
- 根據Partitioner,把數據寫入到不同的partition
- 對于每個partition的數據進行排序
- 隨著Map Task的不斷運行,磁盤上的溢出文件越來越多
- 將這些溢出文件合并
- 對于一個partition下的不同分片,使用歸并排序,同一分區內數據有序
- Reduce Task通過網絡遠程拷貝MapTask的結果文件中的屬于它的分區數據
- 合并所有已拷貝過來的數據文件
- 采用歸并排序算法,對文件數據內容整理排序,將相同key的數據分 為一組,不同key之間有序
- 最終生成一個key對應一組值的數據集,一個key對應的一組數據會調用一次reduce方法
3. Combinery優化總結
- Combiner調用的地方
- MapTask的環形緩沖區向磁盤溢寫文件之前調用Combiner
- Map階段在合并本地多個文件寫入一個大文件之前調用Combiner
- 使用Combiner的好處
- 減少Map Task輸出數據量,由于臨時結果寫入到本地磁盤,所以能 夠減少磁盤IO
- 減少Reduce-Map網絡傳輸數據量,由于reduce需要遠程通過網絡從 Map拷貝數據,提高拷貝速度
- 應用場景
- 針對結果可以疊加的場景
- SUM(YES) Average(NO)
- 設置方法(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優化和資源調度器
1.Hadoop MapReduce Shuffle過程
2.Shuffle過程要點記錄
- 每個Map Task把輸出結果寫到內存中的環形緩沖區。
- 當內存環形緩沖區寫入的數據量達到一定閾值時,后臺線程會把 數據溢寫到磁盤。
- 根據Partitioner,把數據寫入到不同的partition
- 對于每個partition的數據進行排序
- 隨著Map Task的不斷運行,磁盤上的溢出文件越來越多
- 將這些溢出文件合并
- 對于一個partition下的不同分片,使用歸并排序,同一分區內數據有序
- Reduce Task通過網絡遠程拷貝MapTask的結果文件中的屬于它的分區數據
- 合并所有已拷貝過來的數據文件
- 采用歸并排序算法,對文件數據內容整理排序,將相同key的數據分 為一組,不同key之間有序
- 最終生成一個key對應一組值的數據集,一個key對應的一組數據會調用一次reduce方法
3. Combinery優化總結
- Combiner調用的地方
- MapTask的環形緩沖區向磁盤溢寫文件之前調用Combiner
- Map階段在合并本地多個文件寫入一個大文件之前調用Combiner
- 使用Combiner的好處
- 減少Map Task輸出數據量,由于臨時結果寫入到本地磁盤,所以能 夠減少磁盤IO
- 減少Reduce-Map網絡傳輸數據量,由于reduce需要遠程通過網絡從 Map拷貝數據,提高拷貝速度
- 應用場景
- 針對結果可以疊加的場景
- SUM(YES) Average(NO)
- 設置方法(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集群,問題得到解決