1. 程式人生 > >Hadoop高可用、Yarn的資源分配

Hadoop高可用、Yarn的資源分配

hadoop概述:Hadoop實現了一個分散式檔案系統(HadoopDistributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬體上;而且它提供高吞吐量(high throughput)來訪問應用程式的資料,適合那些有著超大資料集(large data set)的應用程式。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)檔案系統中的資料。

Hadoop框架最核心的設計就是:HDFS和MapReduce,HDFS為海量的資料提供了儲存,則MapReduce為海量的資料提供了計算。

名稱空間

分散式儲存:分散式檔案系統管理的是一個伺服器叢集。在這個叢集中,資料儲存在叢集的節點(即叢集中的伺服器)中,但是該檔案系統把伺服器的差異遮蔽了。那麼,我們就可以像使用普通的檔案系統一樣使用,但是資料卻分散在不同的伺服器中。

Namespace:在分散式儲存系統中,分散在不同節點中的資料可能屬於同一個檔案,為了組織眾多的檔案,把檔案可以放到不同的資料夾中,資料夾可以一級一級的包含。我們把這種組織形式稱為名稱空間Namespace;名稱空間管理著整個伺服器叢集中的所有檔案,名稱空間的職責與儲存真實資料的職責是不一樣的,負責名稱空間職責的節點稱為主節點master node,負責儲存真實資料職責的節點稱為從節點slave node。

主、從節點:主節點負責管理檔案系統的檔案結構,從節點負責儲存真實的資料,合稱為主從式結構master-slaves,使用者操作時,也應該先和主節點打交道,查詢資料在哪些從節點上儲存,然後再從從節點讀取。在主節點上,為了加快使用者訪問的速度,會把整個名稱空間資訊都放在記憶體中,當儲存的檔案越多時,那麼主節點就需要越多的記憶體空間。

塊(block):在從節點儲存資料時,有的原始資料檔案可能很大,有的可能很小,大小不一的檔案不容易管理,那麼可以抽象出一個獨立的儲存檔案單位,稱為塊(block)。

容災

容災:資料存放在叢集中,可能因為網路原因或者伺服器硬體原因造成訪問失敗,最好採用副本(replication)機制,把資料同時備份到多臺伺服器中,這樣資料就安全了,資料丟失或者訪問失敗的概率就小了。

分散式計算角色:

主節點稱為作業節點(jobtracker)

從節點稱為任務節點(tasktracker)

在任務節點中,執行第一階段的程式碼稱為 map 任務(map task),執行第二階段的程式碼稱為 reduce任務(reduce task)。

名詞解釋

Hadoop:Apache 開源的分散式框架。

HDFS:Hadoop 的分散式檔案系統。 

NameNode:Hadoop HDFS 元資料主節點伺服器,負責儲存 DataNode 檔案儲存元資料資訊,這個伺服器是單點的。 

JobTracker:Hadoop 的 Map/Reduce 排程器,負責與TaskTracker 通訊分配計算任務並跟蹤任務迚度,這個伺服器也是單點的。

DataNode:Hadoop 資料節點,負責儲存資料。

TaskTracker:Hadoop 排程程式,負責 Map,Reduce 任務的啟動和執行。

Zkfc:DFS故障轉移控制器

RM:資源管理程式,負責叢集中所有資源的統一管理和分配

注:Namenode 記錄著每個檔案中各個塊(block)所在的資料節點的位置資訊。

hadoop ha安裝配置

(先把/app/hadoop2.7/etc/hadoop目錄下的mapred-site.xml.template 進行重新命名方便後續查詢。命令# mv mapred-site.xml.template mapred-site.xml)

注意:bigdata241是主機,bigdata242是備份,bigdata243/244/245是計算節點配置zk

配置如下檔案

core-site.xml Hadoop核心配置檔案

<configuration>
 <property>
        <name>fs.defaultFS</name>
        <value>hdfs://cluster</value>
 <description>hadoop ha 部署方式下namenode訪問地址,cluster是名字可自定義,後面hdfs-site.xml會用到</description>
 </property>
 <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/app/hadoop2.7/tmp</value>
        <description>指定hadoop臨時目錄</description>
  </property>
<property>
        <name>ha.zookeeper.quorum</name>
        <value>bigdata243:2181,bigdata244:2181,bigdata245:2181</value>
        <description>指定zookeeper地址</description>
 </property>
<property>
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>300000</value>
        <description>zk的超時時間,單位為毫秒,預設為5000,這個值比較小。建議設定得大一些,zk過於敏感,避免因為網路抖動等原因引起NameNode進行無所謂的>主備切換</description>
     </property>
<property>
        <name>fs.trash.interval</name>
        <value>1440</value>
        <description>開啟垃圾回收站功能,防止誤刪除檔案,HDFS檔案刪除後先放入回收站,單位為分,垃圾回收站最長保留資料時間為1天,超過一天後刪除</description>
</property>
<property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
        <description>設定SequenceFile中用到的讀/寫快取大小,合理設定快取大>小有利於提高資料傳輸效率,單位為byte,預設為4KB,這裡設定為128KB</description>
</property>
</configuration>

hdfs-site.xml 分散式檔案系統HDFS的配置檔案

<configuration>
<property>  
        <name>dfs.nameservices</name>  
        <value>cluster</value>
        <description>指定hdfs的nameservice為cluster,需要和core-site.xml檔案中的保持一致</description>
    </property>  
    <property>  
        <name>dfs.ha.namenodes.cluster</name>  
        <value>bigdata241,bigdata242</value>
        <description>cluster下有兩個NameNode,分別為bigdata241和bigdata242</description>
    </property>
    <property>  
        <name>dfs.namenode.rpc-address.cluster.bigdata241</name>  
        <value>bigdata241:9000</value>
        <description>NameNode1的RPC通訊地址,埠要和core-site.xml中fs.defaultFS的一致</description>
    </property>  
    <property>  
        <name>dfs.namenode.http-address.cluster.bigdata241</name>  
        <value>bigdata241:50070</value>
        <description>NameNode1的HTTP通訊地址</description>
    </property>  
    <property>  
        <name>dfs.namenode.rpc-address.cluster.bigdata242</name>  
        <value>bigdata242:9000</value>
        <description>NameNode2的RPC通訊地址,埠要和core-site.xml中fs.defaultFS的一致</description>
    </property>  
    <property>  
        <name>dfs.namenode.http-address.cluster.bigdata242</name>  
        <value>bigdata242:50070</value>
        <description>NameNode2的HTTP通訊地址</description>
    </property>  
    <property>  
        <name>dfs.namenode.shared.edits.dir</name>  
        <value>qjournal://bigdata243:8485;bigdata244:8485;bigdata245:8485/cluster</value>
        <description>指定NameNode的元資料在JournalNode上的存放位置</description>
    </property>  
    <property>  
        <name>dfs.journalnode.edits.dir</name>  
        <value>/home/hadoop/app/hadoop2.7/journaldata</value>
        <description>指定NameNode的元資料在JournalNode上的存放位置</description>
    </property>  
    <property>  
        <name>dfs.ha.automatic-failover.enabled</name>  
        <value>true</value>
        <description>指定支援高可用自動切換機制</description>
    </property>  
    <property>  
        <name>dfs.client.failover.proxy.provider.cluster</name>  
   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <description>配置失敗自動切換實現方式</description>
    </property>  
    <property>  
        <name>dfs.ha.fencing.methods</name>  
        <value>  
            sshfence  
            shell(/bin/true)  
        </value>
        <description>配置隔離機制,主要用於遠端管理監聽其他機器相關服務</description>
    </property>  
    <property>  
        <name>dfs.ha.fencing.ssh.private-key-files</name>  
        <value>/home/hadoop/.ssh/id_rsa</value>
        <description>使用隔離機制時需要ssh免密碼登陸,/home/hadoop/為使用者目錄</description>
    </property>  
    <property>  
        <name>dfs.ha.fencing.ssh.connect-timeout</name>  
        <value>30000</value>
        <description>使用隔離機制時需要ssh免密碼登陸時的超時時間,單位為毫秒</description>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/home/hadoop/app/hadoop2.7/tmp/name</value>
        <description>NameNode結點儲存hadoop檔案系統資訊的本地系統路徑</description>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/hadoop/app/hadoop2.7/tmp/data</value>
        <description>DataNode結點被指定要儲存資料的本地檔案系統路徑,這個值只對NameNode有效,DataNode並不需要使用到它</description>
    </property>
    <property>   
        <name>dfs.webhdfs.enabled</name>   
        <value>true</value>
        <description>指定可以通過web訪問hdfs目錄</description>
    </property>
<property>
		<name>dfs.permissions.enabled</name>
		<value>false</value>
		<description>設定不啟用 HDFS 檔案系統的許可權檢查</description>
	</property>
</configuration>

 

mapred-site.xml 分散式計算框架MapReduce的配置檔案

<configuration>
     <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
 	 <description>配置MapReduce運行於yarn中</description>
     </property>
<property> 
<name>mapreduce.jobhistory.address</name> 
<value>bigdata241:10020</value> 
</property>
 
<property> 
<name>mapreduce.jobhistory.webapp.address</name> 
<value>bigdata241:19888</value> 
</property> 

<property>
<name>mapreduce.jobhistory.address</name>
<value>bigdata242:10020</value>                  
</property>

<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>bigdata242:19888</value>                  
</property>

 <property>
  <name>yarn.app.mapreduce.am.staging-dir</name>
  <value>/tmp/yarn/MR-History</value>
<description>配置ApplicationMaster的jobhistory在hdfs儲存路徑</description>
 </property>
<property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
</property>

<property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>${yarn.app.mapreduce.am.staging-ir}/history/done_intermediate</value>
</property>
</configuration>

 

yarn-site.xml 分散式資源管理系統YARN的配置檔案

Hadoop 2.4之前的版本,Yarn的ResourceManager是單點的。在Hadoop 2.4版本中,引入了ResourceManager HA。

  • ResourceManager是主備模式。
  • 可以一個主用RM、一個備用RM。也可以是一個主用RM,多個備用RM。
  • 客戶端可以看到多個RM。客戶端連線時,需要輪循各個RM,直到找到主用RM。

主備模式切換有兩種模式:

  1. 自動切換
  2. 手工切換

對於手工切換模式:

yarn rmadmin -transitionToActive rm1 yarn rmadmin -transitionToStandby rm1

對於自動切換模式,可以強制手工切換:

yarn rmadmin -transitionToActive rm1 --forcemanual

yarn rmadmin -transitionToStandby rm1 --forcemanual

<property>
  <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>

<property> 
   <name>yarn.resourcemanager.connect.retry-interval.ms</name> 
   <value>2000</value>
</property>

<property>
  <name>yarn.resourcemanager.recovery.enabled</name> 
  <value>true</value> 
</property>

<property> 
  <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name> 
  <value>5000</value> 
</property> 

<property> 
  <name>yarn.client.failover-proxy-provider</name> 
  <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value> 
</property> 

<property>
    <name>yarn.resourcemanager.ha.automatic-failover.zk-base-path</name>
    <value>/yarn-leader-election</value>
</property>
 <!-- 資源排程模型  -->
<property> 
  <name>yarn.nodemanager.aux-services</name> 
  <value>mapreduce_shuffle,spark_shuffle</value> 
</property> 

<property> 
  <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> 
  <value>org.apache.hadoop.mapred.ShuffleHandler</value> 
</property> 

 <!-- spark on yarn 動態資源分配排程模型類  -->
<property> 
  <name>yarn.nodemanager.aux-services.spark_shuffle.class</name> 
  <value>org.apache.spark.network.yarn.YarnShuffleService</value> 
</property> 
 <!-- spark on yarn 動態資源分配服務介面  -->
<property> 
  <name>spark.shuffle.service.port</name> 
  <value>7337</value> 
</property> 

<property> 
  <name>yarn.nodemanager.local-dirs</name> 
  <value>/home/hadoop/app/hadoop/tmp</value> 
</property> 

<property> 
  <name>yarn.nodemanager.log-dirs</name> 
  <value>/home/hadoop/app/hadoop/logs</value> 
</property>   
<!-- 一個container可申請的最小記憶體  -->
<property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>512</value>
</property>

 <!-- 一個container可以申請的最大記憶體  -->
<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>4096</value>
</property>

 <!-- nodemanager可使用記憶體資源大小  -->
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>16384</value>
</property>
 <!--  虛擬記憶體倍數  -->
<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4.2</value>
    <description>允許的虛擬記憶體倍數</description>
</property>

 <!-- nodemanager可使用的最大cpu個數
      是個虛數並不一定需要跟物理cpu個數匹配可以更多  -->
<property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>8</value>
</property>
 <!-- 開啟mapreduce中間過程壓縮  -->
<property>
  <name>mapreduce.map.output.compress</name>  
  <value>true</value>
</property>

<property>
  <name>mapreduce.map.output.compress.codec</name>  
  <value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>

<property>
    <name>mapreduce.output.fileoutputformat.compress</name>
    <value>true</value>
 </property>

  <property>
    <name>mapreduce.output.fileoutputformat.compress.codec</name>
    <value>org.apache.hadoop.io.compress.SnappyCodec</value>
    <description>資料的壓縮型別,這裡使用Snappy壓縮</description>
  </property>

  <property>
    <name>mapreduce.output.fileoutputformat.compress.type</name>
    <value>BLOCK</value>
    <description>資料的壓縮級別,這裡設定按資料塊壓縮</description>
  </property>
<property>
    <name>yarn.log.server.url</name>
    <value>http://bigdata241:19888/jobhistory/logs</value>
    <description>歷史日誌對應路徑</description>
  </property>

  <!-- 開啟容量排程模式 -->
  <property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
    <description>
    配置yarn啟用容量排程模式(預設即是容量排程),配置檔案為capacity-scheduler.xml
    </description>
  </property>
<configuration>
    <!-- 日誌聚合功能yarn.log  start --> 
    <property>   
        <name>yarn.log-aggregation-enable</name>   
        <value>true</value>   
        <description>開啟日誌聚合功能,預設為false</description>
    </property>         
    <property>   
        <name>yarn.log-aggregation.retain-seconds</name>   
        <value>259200</value>   
        <description>在HDFS上聚合的日誌最長保留多少秒,這裡配置為3天</description>
    </property> 
 <property>
    <name>一天yarn.log-aggregation.retain-check-interval-seconds</name>
    <value>86400</value>
    <description>清理過期聚合日誌程式的執行間隔時間一天</description>
  </property>
<property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/tmp/logs</value>
    <description>聚合日誌在hdfs上的目錄</description>
  </property> 
<!-- 日誌聚合功能yarn.log  end --> 

    <!-- 配置resourcemanager  start
                           在YARN中,ResourceManager負責叢集中所有資源的統一管理和分配,它接收來自各個節點(NodeManager)的資源彙報資訊,並把這些資訊按照一定的策略分配給各個應用程式(實際上是ApplicationManager)-->
    <property>  
       <name>yarn.resourcemanager.ha.enabled</name>  
       <value>true</value>  
       <description>開啟resourcemanager ha,預設為false</description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.cluster-id</name>  
       <value>yrc</value>  
       <description></description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.ha.rm-ids</name>  
       <value>rm1,rm2</value>  
       <description></description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.hostname.rm1</name>  
       <value>bigdata241</value>  
       <description>node1</description>
    </property>     
    <property>  
       <name>yarn.resourcemanager.hostname.rm2</name>  
       <value>bigdata242</value>  
       <description>node2</description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.zk-address</name>  
       <value>bigdata243:2181,bigdata244:2181,bigdata245:2181</value> 
    </property>  
    <!-- 配置resourcemanager  end -->

    <!-- 配置nodemanager  start
                           NodeManager是執行在單個節點上的代理,它管理Hadoop叢集中單個計算節點 -->
    <property>  
       <name>yarn.nodemanager.aux-services</name>  
       <value>mapreduce_shuffle</value>  
    </property> 
    <property>    
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>    
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>    
    </property>
    <!-- 配置nodemanager  end -->
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>51200</value>
    <descrition>叢集中機器都有100/200GB的RAM。部分RAM應保留用於作業系統。在每個節點上,我們將為YARN分配50GB RAM。以下屬性設定YARN可在節點上使用的最大記憶體</descrition>
</property>
<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>2.1</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>bigdata241:8088</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>bigdata242:8088</value>
</property>
</configuration>

 

slaves(子機名對應子機個數)

bigdata243
bigdata244
bigdata245

 

 

啟動Hadoop叢集準備 :root使用者下,可以省略,阿里雲伺服器預設關閉防火牆

關閉防火牆(子機照做)

# systemctl disable firewalld

# systemctl stop firewalld

程序守護(子機照做)

# setenforce 0

# vi /etc/selinux/config 設定SELINUX=disabled

Yarn的資源分配

配置
配置FairScheduler一般需要配置兩個檔案。首先排程器相關的選項可以在yarn-site.xml檔案中配置。其次,大多數情況下使用者希望建立一個分配檔案來列出哪些佇列用來分配以及對應的權重和容量。這個分配檔案會每10秒鐘重新載入一次,從而支援執行時配置變更。
yarn-site.xml中的配置屬性
yarn.scheduler.fair.allocation.file
分配檔案的路徑地址。分配檔案是一個XML檔案來描述佇列和佇列的屬性以及特定的策略。這個檔案必須是一個XML格式的檔案。如果配置一個相對路徑,那麼該檔案會在classpath中被搜尋到。預設是fair-scheduler.xml。
yarn.scheduler.fair.user-as-default-queue
是否使用使用者名稱關聯分配的預設佇列名稱,如果是false或者未設定,所有的作業都有一個共享的預設佇列,叫做default。預設是true。如果佇列分配策略在分配檔案中配置過,那麼這個屬性會被忽略。
yarn.scheduler.fair.preemption
是否搶佔。預設false。
yarn.scheduler.fair.preemption.cluster-utilization-threshold
當搶佔式配置後,配置使用閾值。該閾值計算是按照所有資源的容量使用量的最大比例來算的。預設是0.8f。
yarn.scheduler.fair.sizebasedweight
是否分配資源給獨立的作業,基於作業的size而不是均等的分配所有的資源。設定為true時,應用的權重通過1+請求資源記憶體大小的自然對數來計算。預設是false。
yarn.scheduler.fair.assignmultiple
是否允許在一次心跳中進行多次容器分配。預設是false。
yarn.scheduler.fair.max.assign
如果上個屬性設定為true,這個屬性明確一次心跳中能分配的最大的容器數。預設是-1,表示沒有限制。
yarn.scheduler.fair.locality.threshold.node
對於特定node上請求容器的應用作業,該屬性代表了自從上次容器分配等待排程到其他節點node上的機會的次數。表示為0到1之間的一個浮點數,該數字表達了叢集規模的比例,代表了向上傳遞的排程機會數。預設值是-1.0,代表不傳遞任何排程機會。
yarn.scheduler.fair.locality.threshold.rack
對於特定rack上請求容器的作業,該屬性代表了自從上次容器分配等待排程到其他rack上的機會的次數。表示為0到1之間的一個浮點數,該數字表達了叢集規模的比例,代表了向上傳遞的排程機會數。預設值是-1.0,代表不傳遞任何排程機會。
yarn.scheduler.fair.allow-undeclared-pools
如果為true,新的佇列可以在作業提交時建立,無論是提交者指定的應用作業的佇列還是default的佇列。如果為false,應用作業在任何時間都會被分配到一個沒有在分配檔案張宣告過的佇列中,相反就只會分配到default佇列。該屬性預設是true。如果佇列分配策略在分配檔案中設定過,那麼這個屬性失效。
yarn.scheduler.fair.update-interval-ms
鎖定排程器和重新計算資源分配和需求,檢查是否有搶佔的時間間隔屬性。預設是500ms。