集羣規模大概260多臺,TSC10機型,機型參數以下:java
> 1個8核CPU(E5-2620v4) > 64G內存 > HBA,12*4T SATA,1*240G SSD, > 2*10G網口
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 |
角色 | 版本 |
---|---|
HBase | 1.2.5 |
Hadoop | 2.7.2 |
Zookeeper | 3.4.6 |
配置參數主要是內存方面,對於主結點來講,機型爲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
涉及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
混布MR的主要目的是在未接入業務的前期過程當中,利用集羣空閒資源經過MR方式將老集羣數據同步至新集羣。對於HBase而言,集羣間數據拷貝若是想高效率,有兩種方式可考慮,一類就是直接文件拷貝方式,經過distcp
將HFile進行拷貝,拷貝完後再經過bulkload
方式將數據Load到新集羣HBase表中;另外一類是snapshot
快照方式,先在老集羣建立錶快照,經過ExportSnapshot
將快照數據拷貝到新集羣臨時目錄,快照數據在新集羣上線也能夠用bulkload方式將臨時目錄下的hfile文件load到線上,也可經過restore_snapshot
的方式將快照表恢復到線上正式表,不過還須要做major_compact
纔算正式完成load。 這兩種方式都須要借用MR才能完成數據拷貝,同時又沒有額外的機器資源來單獨部署MR,因此須要在現有集羣上混布MR。框架
MR的配置主要涉及2個以下:webapp
mapred-site.xml yarn-site.xml
在引言中提到,在部署過程當中遇到最多的問題出如今配置Cgroup中出現。至於什麼是Cgroup,簡單講是用於做資源隔離的,具體是基於物理資源Linux 內核提供的一種能夠限制、記錄、隔離進程組 (process groups) 所使用的物理資源 (如 cpu memory i/o 等等) 的機制。網上有不少關於Cgroup的介紹,是目前像docker,虛擬化等技術的基石,你們能夠網上自行查找相關資料。
Yarn也是支持Cgroup隔離的,因此重點說下關於這部分的配置。
關於這個配置的配置項說明以下:
配置項 | 說明 |
---|---|
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>
這個配置項比較關鍵,涉及不少,這裏將幾個主要的配置項進行說明。
指定資源調度器相關地址。
<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>
指定調度器相關資源使用限制
<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>
這部分由於配置採用的是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配置,策略申請等,這些也是須要提早準備的。部署過程當中,問題也是很多的,下面分別介紹下。
cgroup 目錄掛載錯了,經過mount命令發現,默認掛載到了/sys/fs/cgroup/systemd,以下圖所示。
因咱們集羣參數配置的是cgroup掛載到/cgroup
目錄,掛載異常致使hdfs沒法識別到/cgroup目錄,天然會提示目錄文件不存在。上面截圖只是提示/cgroup/memory這個下的目錄不存在,在實際過程當中一開始也遇到了/cgroup/cpu目錄不存在,因此要一併處理,同時注意目錄屬主和權限,否則也會有問題。
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
在做業運行過程當中,出現找不到filecache,usercache,nmPrivate子目錄的錯誤,這個子目錄是在由參數yarn.nodemanager.local-dirs
配置的/data1/yarnenv/local相似這種目錄,分別存儲在12塊盤中。
上述問題主要是因在做業啓動以前,集羣全部結點機器沒有預先建立好/data1/yarnenv/local/目錄下的filecache, usercache, nmPrivate目錄。
提早建立好這些子目錄就行,同時權限這塊也要設置ok,不然會提示permission denied問題。對於filecache,usercache
,目錄權限爲755
,而對於nmPrivate
子目錄,權限則要爲700
, 即只容許hdfsadmin用戶往裏寫數據。
在啓動做業過程當中,提示fs異常,以下圖所示。做業報錯日誌:
這個運行日誌看不出啥,具體還要看container日誌,這個日誌路徑是在yarn.nodemanager.log-dirs
配置的目錄下。不一樣application日誌放在以application命名的目錄下。具體以下:
container日誌會更詳細,從截圖中可看出,提示的是wrong Fs錯誤,這個錯誤已經把提示的wrong fs的路徑出來了。
最終分析是jobhistory的相關配置參數有問題,mapreduce.jobhistory.userlocaldir
這個參數一開始配置是True,表示用的是本地目錄,也建了相關的本地目錄,但一直提示wrong fs問題。這個問題和配置的jobhistory的目錄有關,若是用本地目錄,然而實際仍是去獲取的Hdfs路徑 ,根源在運行做業時,沒法識別到fs.defaultFS配置的路徑。
修改mapred-site.xml,將mapreduce.jobhistory.uselocaldir設置爲false。
<property> <name>mapreduce.jobhistory.uselocaldir</name> <value>false</value> </property>
在執行快照導出過程當中,出現以下錯誤。
主要是Export過程當中,內存配置太少,用的默認值 ,致使出現內存不足現象,致使沒法支持做業完成。
在ExportSnapshot過程當中,增長一個參數,以下:
-Dmapred.child.java.opts=-Xmx3072M
上面從MR集羣部署方面展開介紹,並對MR任務執行過程當中出現的一些問題進行分析。但願能對你們有所幫助。