HBase混布MapReduce集羣學習記錄

1、準備工做

1.1 部署環境

集羣規模大概260多臺,TSC10機型,機型參數以下:java

> 1個8核CPU(E5-2620v4)
> 64G內存
> HBA,12*4T SATA,1*240G SSD,
> 2*10G網口

1.2 機器分配

HBase和Hadoop的主結點共用,子結點也共用。node

角色 機型 數量
HBase Master&Hadoop Namenode B6 2
HBase RegionServer&Hadoop Datanode TSC10 265
ZooKeeper B6 5
ResourceManager(MR) B6 1
HistoryServer(MR) B6 1
NodeManager(MR) TSC10 265

1.3 版本說明

角色 版本
HBase 1.2.5
Hadoop 2.7.2
Zookeeper 3.4.6

1.4 配置說明

1.4.1 內存參數配置說明

配置參數主要是內存方面,對於主結點來講,機型爲B6,給主結點分配的內存是50G。數據結點方面,RegionServer分配了24G內存,DataNode分配2G內存。這樣,對於混布的MR來講,主要是NodeManager,也還有24G內存, MR的ResourceManager單獨部署在B6,內存分配24G。linux

1 HBase內存配置web

HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xms10g -Xmx10g -Xmn4g"
HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms24g -Xmx24g -Xmn4g"

2 Hadoop內存參數docker

HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote -server -Xmx50g -Xms50g -Xmn4g
HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote -server -Xmx3g -Xmn1g

3 Yarn內存參數apache

YARN_RESOURCEMANAGER_OPTS="-Dcom.sun.management.jmxremote -server -Xmx24g -Xmn16g
YARN_NODEMANAGER_OPTS="-Dcom.sun.management.jmxremote -Xmx24g

1.4.2 系統參數說明

涉及swap方面,主要以下:bash

vm.swappiness=1 
vm.dirty_background_ratio=1
vm.dirty_ratio=4

這裏面採過一個坑,因爲咱們老集羣機器內在只有32G,內存的限制,因此咱們配置是打開swap內存。但tlinux不一樣版本這個參數的含義是不同的,對於tlinux1.2版本,vm.swappinesss=0表示開啓swap內存,但在tlinux2.2版本,這個參數若是設置爲0則表示禁用swap內存,設置爲1才表示開啓swap內存。因此對於不少新tlinux版本的機器一開始這個參數被設置成了0,在運行一段時間發現,結點極不穩定,GC頻繁,機器負載也較高,regionserver容易掉,阻塞集羣讀寫,影響仍是比較大的。後面將vm.swappiness設置成1後,集羣才比較穩定。app

2、MR部署過程

2.1 部署需求

混布MR的主要目的是在未接入業務的前期過程當中,利用集羣空閒資源經過MR方式將老集羣數據同步至新集羣。對於HBase而言,集羣間數據拷貝若是想高效率,有兩種方式可考慮,一類就是直接文件拷貝方式,經過distcp將HFile進行拷貝,拷貝完後再經過bulkload方式將數據Load到新集羣HBase表中;另外一類是snapshot快照方式,先在老集羣建立錶快照,經過ExportSnapshot將快照數據拷貝到新集羣臨時目錄,快照數據在新集羣上線也能夠用bulkload方式將臨時目錄下的hfile文件load到線上,也可經過restore_snapshot的方式將快照表恢復到線上正式表,不過還須要做major_compact纔算正式完成load。 這兩種方式都須要借用MR才能完成數據拷貝,同時又沒有額外的機器資源來單獨部署MR,因此須要在現有集羣上混布MR。框架

2.2 部署步驟

2.2.1 配置準備

MR的配置主要涉及2個以下:webapp

mapred-site.xml
yarn-site.xml

在引言中提到,在部署過程當中遇到最多的問題出如今配置Cgroup中出現。至於什麼是Cgroup,簡單講是用於做資源隔離的,具體是基於物理資源Linux 內核提供的一種能夠限制、記錄、隔離進程組 (process groups) 所使用的物理資源 (如 cpu memory i/o 等等) 的機制。網上有不少關於Cgroup的介紹,是目前像docker,虛擬化等技術的基石,你們能夠網上自行查找相關資料。

Yarn也是支持Cgroup隔離的,因此重點說下關於這部分的配置。

2.2.1.1 mapred-site.xml

關於這個配置的配置項說明以下:

配置項 說明
mapreduce.framework.name 指定MR所使用的調度框架,通常爲yarn
fs.defaultFS 指定hadoop的文件系統名稱,與dfs.nameservices的要保持一致
dfs.nameservices HDFS NN的邏輯名稱
mapreduce.jobhistory.webapp.address 歷史做業web頁面查詢地址端口
mapreduce.jobhistory.address 歷史做業啓動地址
mapreduce.jobhistory.uselocaldir 歷史做業本地存儲目錄

上面大部分是關於historyserver的配置項,那做業日誌生成過程是怎麼樣的呢,主要涉及以下步驟:

  • 1 yarn的資源調度器resourcemanager會啓動一個MRAppMaster的進程,這個進程存在於具體執行做業的結點機器上;
  • 2 MRAppMaster這個進程會將做業運行日誌存儲到yarn.app.mapreduce.am.staging-dir所配置的目錄下,這個目錄的默認值是/tmp/hadoop-yarn/staging/[username]/.staging
  • 3 做業運行完後,會將上述目錄下相應做業的日誌拷貝到mapreduce.jobhistory.intermediate-done-dir配置的目錄中, 並按期啓動掃描線程去將此目錄下日誌再拷貝到/history/done-dir目錄下,並把原目錄相應日誌刪除;
  • 4 MRAppMaster進程將staging目錄相應做業目錄移除。

對於NodeManager來講,其執行過程當中所產生的日誌是保存在本地磁盤的,保存目錄由yarn.nodemanager.local-dirs參數來控制。完整的mapred-site.xml配置以下。

<configuration>
<property>
         <name>mapreduce.framework.name</name>
         <value>yarn</value>
</property>
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://hbase-hdfs-yarn</value>
</property>

<property>
        <name>dfs.nameservices</name>
        <value>hbase-hdfs-yarn</value>
</property>
<property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>mr-master-host:19888</value>
</property>

<property>
       <name>mapreduce.jobhistory.address</name>
       <value>mr-master-host:10020</value>
</property>

<property>
       <name>mapreduce.jobhistory.uselocaldir</name>
       <value>false</value>
</property>

<property>
       <name>mapreduce.jobhistory.intermediate-done-dir</name>
       <value>/history/intermediate-done-dir</value>
</property>

<property>
       <name>mapreduce.jobhistory.done-dir</name>
       <value>/history/done-dir</value>
</property>

2.2.1.2 yarn-site.xml

這個配置項比較關鍵,涉及不少,這裏將幾個主要的配置項進行說明。

1) resourcemanager部分

指定資源調度器相關地址。

<property>
        <name>yarn.resourcemanager.address</name>
        <value>mr-historyserver-host:8090</value>
</property>

<property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>mr-historyserver-host:8091</value>
</property>

<property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>mr-historyserver-host:8093</value>
</property>

<property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>mr-historyserver-host:8088</value>
</property>
<property>
  <name>yarn.nodemanager.address</name>
        <value>0.0.0.0:8041</value>
</property>

2) scheduler部分

指定調度器相關資源使用限制

<property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>128</value>
</property>
<property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>51200</value>
</property>

<property>
        <name>yarn.scheduler.increment-allocation-mb</name>
        <value>128</value>
</property>

<property>
        <name>yarn.scheduler.minimum-allocation-vcores</name>
        <value>1</value>
</property>

<property>
        <name>yarn.scheduler.maximum-allocation-vcores</name>
        <value>8</value>
</property>

<property>
        <name>yarn.scheduler.increment-allocation-vcores</name>
        <value>1</value>
</property>

3) cgroup部分

這部分由於配置採用的是LinuxContainerExecutor方式。涉及的配置比較複雜,須要配置不少額外的東西。配置步驟以下:

  • 1 建立cgroup目錄,根據yarn.nodemanager.linux-container-executor.cgroups.mount-path配置的目錄先建立好,如/cgroup,這裏主要是指定MR所使用的隔離組,若是不指定,默認是用/sys/fs/cgroup中的隔離參數。
  • 2 將系統cgroup中的cpu和memory mount到自定義的/cgroup目錄,以下命令所示:
mount -t cgroup -o memory cgroup /cgroup/memory
mount -t cgroup -o cpu cgroup /cgroup/cpu
  • 3 mount以後,會在/cgroup下生成兩個目錄,cpu,memory,以下所示:
root@node1:/cgroup#ll
total 0
drwxrwx--x 3 hdfsadmin users 0 Jun 14 16:13 cpu
drwxrwx--x 3 hdfsadmin users 0 Jun 14 16:13 memory
  • 4 建立子目錄,目錄名由參數yarn.nodemanager.linux-container-executor.cgroups.hierarchy指定,這裏是hadoop-yarn, 並指定771權限和MR運行用戶屬主,如MR相關進程是運行在hdfsadmin用戶下,須要把相關目錄賦予hdfsadmin 屬主;
mkdir -p /cgroup/cpu/hadoop-yarn 
mkdir -p /cgroup/memory/hadoop-yarn
chmod -R 771 /cgroup/cpu/hadoop-yarn
chmod -R 771 /cgroup/memory/hadoop-yarn
chown -R hdfsadmin.users /cgroup/cpu
chown -R hdfsadmin.users /cgroup/memory
  • 5 將users組的MR運行用戶hdfsadmin的屬組增長root屬性, 這個主要是由於cgroup必須在root組用戶下才能運行,修改以下:
usermod -G users,root hdfsadmin
  • 6 建立資源調度相關目錄,這個主要是由參數`yarn.nodemanager.local-dirs確認,本集羣中配置是的/data1/yarnenv/local,/data2/yarnenv/local,......,/data12/yarnenv/local; 同時還須要在這些目錄下建立三個子目錄,分別爲filecache,usercache和nmPrivate,並對filecache和usercache目錄權限設置爲755,對nmPrivate目錄權限設置爲700,這裏的權限很關鍵,否則做業是執行不成功的。
mkdir -p /data1/yarnenv/local/filecache ....... /data12/yarnenv/local/filecache  
mkdir -p /data1/yarnenv/local/usercache ........ /data12/yarnenv/local/usercache
mkdir -p /data1/yarnenv/local/nmPrivate ........ /data12/yarnenv/local/nmPrivate
chown -R hdfsadmin.users /data1/yarnenv/local....../data12/yarnenv/local
chmod -R 755 /data1/yarnenv/local/filecache....../data12/yarnenv/local/filecache
chmod -R 755 /data1/yarnenv/local/usercache....../data12/yarnenv/local/usercache
chmod -R 700 /data1/yarnenv/local/nmPrivate....../data12/yarnenv/local/nmPrivate

關於Cgroup os層面的部署步驟就以下所未,下面介紹關於Cgroup 集羣層面的配置。
其中,yarn-env.xml中的關於cgroup的配置項以下:

<property>
        <name>yarn.nodemanager.emc.enable</name>
        <value>true</value>
</property>
<property>
        <name>yarn.nodemanager.container-executor.class</name>
        <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
<property>
        <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name>
        <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler</value>
</property>

<property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.delete-timeout-ms</name>
        <value>30000</value>
</property>

<property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.memory-control.enabled</name>
        <value>true</value>
</property>

<property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.oom.policy</name>
        <value>true</value>
</property>

<property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.hierarchy</name>
        <value>/hadoop-yarn</value>
</property>

<property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.mount</name>
        <value>true</value>
</property>

<property>
        <name>yarn.nodemanager.resource.cpu.enabled</name>
        <value>true</value>
</property>

<property>
        <name>yarn.nodemanager.resource.memory.enabled</name>
        <value>true</value>
</property>

<property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.mount-path</name>
        <value>/cgroup</value>
</property>

<property>
        <name>yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users</name>
        <value>false</value>
</property>

<property>
        <name>yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user</name>
        <value>yarn</value>
</property>

<property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name>
        <value>false</value>
</property>

<property>
            <name>yarn.nodemanager.linux-container-executor.group</name>
            <value>users</value>
</property>

若是用LinuxContainerExecutor做爲容器隔離方式的話,還須要配置另外一個文件:container-executor.cfg。主要 配置項以下:

yarn.nodemanager.linux-container-executor.group=users
banned.users=root
min.user.id=1000
allowed.system.users=hdfsadmin,hbaseadmin,yarn

這個配置文件在配置過程當中也遇到一些問題,主要是解析格式問題,須要把原來的配置後面帶#號的註釋刪除,否則會提示沒法找到group。

關於配置部分就說到這,剩下的就是啓動nodemanager進程和resourcemanager進程和historyserver進程。啓動方式以下:

登陸datanode結點機器,執行以下命令:

su - hdfsadmin #切換至mr運行用戶
cd [hadoop-home]/sbin
./yarn-daemon.sh start nodemanager

登陸MR資源管理調度機器,執行以下命令:

su - hdfsadmin
cd [hadoop-home]/sbin
./yarn-daemon.sh start resourcemanager
./mr-jobhistory-daemon.sh start historyserver

到此,MR部署層面已經介紹完了,固然 這裏面還涉及好比DNS配置,策略申請等,這些也是須要提早準備的。部署過程當中,問題也是很多的,下面分別介紹下。

3、問題記錄

3.1 問題1:cgroup目錄找不到文件錯誤

3.1.1 問題描述

3.1.2 問題緣由

cgroup 目錄掛載錯了,經過mount命令發現,默認掛載到了/sys/fs/cgroup/systemd,以下圖所示。

因咱們集羣參數配置的是cgroup掛載到/cgroup目錄,掛載異常致使hdfs沒法識別到/cgroup目錄,天然會提示目錄文件不存在。上面截圖只是提示/cgroup/memory這個下的目錄不存在,在實際過程當中一開始也遇到了/cgroup/cpu目錄不存在,因此要一併處理,同時注意目錄屬主和權限,否則也會有問題。

3.1.3 解決方案

mount -t cgroup -o memory cgroup /cgroup/memory
mount -t cgroup -o cpu cgroup /cgroup/cpu
mkdir -p /cgroup/cpu/hadoop-yarn /cgroup/memory/hadoop-yarn; 
chown hdfsadmin.users /cgroup/cpu/hadoop-yarn /cgroup/memory/hadoop-yarn;
chmod -R 771 /cgroup/cpu /cgroup/memory

3.2 filecache&usercache&nmPrivate目錄找不到錯誤

3.2.1問題描述

在做業運行過程當中,出現找不到filecache,usercache,nmPrivate子目錄的錯誤,這個子目錄是在由參數yarn.nodemanager.local-dirs配置的/data1/yarnenv/local相似這種目錄,分別存儲在12塊盤中。

3.2.2 問題緣由

上述問題主要是因在做業啓動以前,集羣全部結點機器沒有預先建立好/data1/yarnenv/local/目錄下的filecache, usercache, nmPrivate目錄。

3.2.3 解決方案:

提早建立好這些子目錄就行,同時權限這塊也要設置ok,不然會提示permission denied問題。對於filecache,usercache,目錄權限爲755,而對於nmPrivate子目錄,權限則要爲700, 即只容許hdfsadmin用戶往裏寫數據。

3.3 問題3-Wrong FS問題

3.3.1 問題描述

在啓動做業過程當中,提示fs異常,以下圖所示。做業報錯日誌:

這個運行日誌看不出啥,具體還要看container日誌,這個日誌路徑是在yarn.nodemanager.log-dirs配置的目錄下。不一樣application日誌放在以application命名的目錄下。具體以下:

container日誌會更詳細,從截圖中可看出,提示的是wrong Fs錯誤,這個錯誤已經把提示的wrong fs的路徑出來了。

3.3.2 問題緣由

最終分析是jobhistory的相關配置參數有問題,mapreduce.jobhistory.userlocaldir這個參數一開始配置是True,表示用的是本地目錄,也建了相關的本地目錄,但一直提示wrong fs問題。這個問題和配置的jobhistory的目錄有關,若是用本地目錄,然而實際仍是去獲取的Hdfs路徑 ,根源在運行做業時,沒法識別到fs.defaultFS配置的路徑。

3.3.3 解決方案

修改mapred-site.xml,將mapreduce.jobhistory.uselocaldir設置爲false。

<property>
       <name>mapreduce.jobhistory.uselocaldir</name>
       <value>false</value>
</property>

3.4 ExportSnapshot問題

3.4.1 問題描述

在執行快照導出過程當中,出現以下錯誤。

3.4.2 問題緣由

主要是Export過程當中,內存配置太少,用的默認值 ,致使出現內存不足現象,致使沒法支持做業完成。

3.4.3 解決方案

在ExportSnapshot過程當中,增長一個參數,以下:

-Dmapred.child.java.opts=-Xmx3072M

4、總結

上面從MR集羣部署方面展開介紹,並對MR任務執行過程當中出現的一些問題進行分析。但願能對你們有所幫助。

相關文章
相關標籤/搜索