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閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374