記錄一次生產環境hadoop集群優化以及pid文件缺失處理
優化需要根據實際情況綜合分析
1、關閉系統swap分區(如果未關閉的話)
在Hadoop中,如果使用系統默認設置,會導致swap分區被頻繁使用,集群會不斷發出警告。
對於每個作業處理的數據量和每個Task中用到的各種緩沖,用戶都是完全可控的。
echo "vm.swappiness = 0" >> /etc/sysctl.conf
說明:盡量不使用交換分區,註意不是禁用
2、資源和配置信息
2臺namenode,5臺datanode資源和配置信息
服務分布表如下所示:
軟件版本:
hadoop(hdfs+yarn) 2.7.3
hbase 1.2.4
查看CPU信息的命令:
查看CPU型號
# cat /proc/cpuinfo | grep name | cut -d: -f2 | uniq
查看物理CPU個數
# cat /proc/cpuinfo |grep "physical id" | sort | uniq -c | wc -l
查看沒有物理CPU中的core的個數,也就是核數
# cat /proc/cpuinfo | grep "cpu cores" | uniq
查看邏輯CPU的個數
# cat /proc/cpuinfo | grep "processor" | wc -l
CPU總核數= 物理CPU個數 * 每顆物理CPU的核數
總邏輯CPU數 = 物理CPU個數 * 每顆物理CPU的核數 * 超線程數
資源情況:
內存 16G
CPU8(8個物理CPU,單核,單線程)
3、dfs.datanode.max.xcievers (dfs.datanode.max.transfer.threads)
這兩個是一個參數,只不過前邊一個是hadoop1.0之前的參數,表示datanode上負責進行文件操作的線程數。如果需要處理的文件過多,而這個參數設置得過低就會有一部分文件處理不過來,就會報下面這個異常:
ERROR org.apache.hadoop.dfs.DataNode: DatanodeRegistration(10.10.10.53:50010,storageID=DS-1570581820-10.10.10.53-50010-1224117842339,infoPort=50075, ipcPort=50020):DataXceiver: java.io.IOException: xceiverCount 258 exceeds the limit of concurrent xcievers 256
linux系統中所有的文件操作都被綁定到一個socket上,進一步具體可以把他看做是一個線程。而這個參數就是指定這種線程的個數。在datanode裏面有一個專門的線程組來維護這些線程,同時有一個守護線程來監視這個線程組的體量,它負責監測線程數量是否到達上線,超過就拋出異常。因為如果這樣的線程過多,系統內存就會暴掉。
對於參數dfs.datanode.max.transfer.threads還依照現有配置 8192
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
</property>
默認值:4096
4、dfs.namenode.handler.count
NameNode用來處理來自DataNode的RPC請求的線程數量
NameNode有一個工作線程池用來處理客戶端的遠程過程調用及集群守護進程的調用。處理程序數量越多意味著要更大的池來處理來自不同DataNode的並發心跳以及客戶端並發的元數據操作。對於大集群或者有大量客戶端的集群來說,通常需要增大參數dfs.namenode.handler.count的默認值10。設置該值的一般原則是將其設置為集群大小的自然對數乘以20,即20logN,N為集群大小。如果該值設的太小,明顯的狀況就是DataNode在連接NameNode的時候總是超時或者連接被拒絕,但NameNode的遠程過程調用隊列很大時,遠程過程調用延時就會加大。
集群大小是7,7的自然對數約等於2,所以這裏的配置就是 20*log7 = 40
<property>
<name>dfs.namenode.handler.count</name>
<value>40</value>
</property>
默認值:10
5、dfs.datanode.handler.count
DataNode用來連接NameNode的RPC請求的線程數量
保守設置為20
<property>
<name>dfs.datanode.handler.count</name>
<value>20</value>
</property>
默認值:10
二、PID相關準備
hadoop 及 hbase的pid文件默認是放在/tmp下面的,這個你可以從啟動關閉腳本中看出,不過這個目錄會定時清理。這就產生一個問題,當再次關閉服務的時候,服務pid文件丟失就會產生jps不顯示服務,但是web的管理頁面可以正常訪問的情況。我的解決辦法就是手動生成缺水的pid文件,然後修改配置文件,重啟服務。
1、NameNode 、DataNode 以及SecondaryNameNode 的pid配置
hadoop-env.sh
export HADOOP_PID_DIR=/data/hadoop_data/pids
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}
JobHistory的pid配置
mapred-env.sh
export HADOOP_MAPRED_PID_DIR=/data/hadoop_data/pids
NodeManager和ResourceManager的pid配置
yarn-env.sh
export YARN_PID_DIR=/data/hadoop_data/pids
HMaster和HRegionServer 的pid配置
hbase-env.sh
export HBASE_PID_DIR=/data/hadoop_data/pids
PID文件的命令規則大家可以從腳本中找到
我這裏並不是所有的pid文件路徑都沒有配置,需要配置的是MapReduce和yarn
2、集群中各節點服務啟動情況以及PID文件存在情況
192.168.10.101:
$ jps
194921 HMaster
194352 DFSZKFailoverController
539317 JobHistoryServer
193972 NameNode
存在的pid文件:
目錄/data/hadoop_data/pids
hadoop-hduser-namenode.pid
hadoop-hduser-zkfc.pid
hbase-hduser-master.pid
192.168.10.102:
$ jps
371963 DFSZKFailoverController
371811 NameNode
372121 HMaster
存在的pid文件:
目錄/data/hadoop_data/pids
hadoop-hduser-namenode.pid
hadoop-hduser-zkfc.pid
hbase-hduser-master.pid
192.168.10.103:
$ jps
500043 JournalNode
500164 NodeManager
522618 HRegionServer
499932 DataNode
存在的pid文件:
目錄/data/hadoop_data/pids
hadoop-hduser-datanode.pid
hadoop-hduser-journalnode.pid
hbase-hduser-regionserver.pid
192.168.10.104:
$ jps
234784 NodeManager
234636 JournalNode
235070 HRegionServer
234525 DataNode
存在的pid文件:
目錄/data/hadoop_data/pids
hadoop-hduser-datanode.pid
hadoop-hduser-journalnode.pid
hbase-hduser-regionserver.pid
192.168.10.105:
$ jps
310371 HRegionServer
48404 NodeManager
48285 JournalNode
48174 DataNode
存在的pid文件:
目錄/data/hadoop_data/pids
hadoop-hduser-datanode.pid
hadoop-hduser-journalnode.pid
hbase-hduser-regionserver.pid
192.168.10.106:
$ jps
100855 HRegionServer
435319 DataNode
435456 NodeManager
存在的pid文件:
目錄/data/hadoop_data/pids
hadoop-hduser-datanode.pid
hbase-hduser-regionserver.pid
192.168.10.107:
$ jps
410010 NodeManager
484955 HRegionServer
409847 DataNode
存在的pid文件:
目錄/data/hadoop_data/pids
hadoop-hduser-datanode.pid
hbase-hduser-regionserver.pid
三、下面是具體的操作步驟
以下所有操作都是在hadoop集群服務管理用戶hduser下操作的
1、生成PID文件
根據實際情況創建相應的PID文件
jps命令可以查看起著哪些服務,然後查看pid文件目錄/data/hadoop_data/pids,如果服務啟動但是沒有相應的pid文件,則需要創建該服務的pid文件。
echo PID > /tmp/mapred-hduser-historyserver.pid
/tmp/yarn-hduser-resourcemanager.pid
/tmp/yarn-hduser-nodemanager.pid
2、停止服務
這裏需要說的是hadoop+hbase+zookeeper集群服務啟動關閉順序
啟動順序
zookeepeer->hadoop->hbase
停止順序
hbase->hadoop->zookeepeer
登錄到192.168.10.101(主hbase服務器,主namenode服務器)
停止hbase集群
$ cd /data/hbase/bin
$ ./stop-hbase.sh
停止hadoop集群
$ cd /data/hadoop/sbin
$ ./stop-all.sh
停止MapReduce歷史記錄服務
$ cd /data/hbase/bin
$ ./mr-jobhistory-daemon.sh stop historyserver
3、修改配置文件
備份要修改的配置文件
修改配置文件
vim /data/hadoop/etc/hadoop/mapred-env.sh
添加:
export HADOOP_MAPRED_PID_DIR=/data/hadoop_data/pids
vim /data/hadoop/etc/hadoop/yarn-env.sh
添加:
export YARN_PID_DIR=/data/hadoop_data/pids
vim /data1/hadoop/etc/hadoop/hdfs-site.xml
修改如下:
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
</property>
添加如下:
<property>
<name>dfs.namenode.handler.count</name>
<value>40</value>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>20</value>
</property>
vim /data/hbase/conf/hbase-env.sh
添加如下:
export HADOOP_HOME=/data/hadoop
vim /data/hbase/conf/hbase-site.xml
修改如下:
<property>
<name>hbase.rootdir</name>
<value>hdfs://masters/hbase</value>
</property>
在相應的配置文件目錄把配置文件拷貝到其他節點
$ for ip in 102 103 104 105 106 107;do scp /data/hadoop/etc/hadoop/mapred-env.sh 192.168.10.$ip:/data/hadoop/etc/hadoop/;done
$ for ip in 102 102 104 105 106 107;do scp /data/hadoop/etc/hadoop/yarn-env.sh 192.168.10.$ip:/data/hadoop/etc/hadoop/;done
$ for ip in 102 102 104 105 106 107;do scp /data/hadoop/etc/hadoop/hdfs-site.xml 192.168.10.$ip:/data/hadoop/etc/hadoop/;done
$ for ip in 102 102 104 105 106 107;do scp /data/hbase/conf/hbase-env.sh 192.168.10.$ip:/data/hbase/conf/;done
$ for ip in 102 102 104 105 106 107;do scp /data/hbase/conf/hbase-site.xml 192.168.10.$ip:/data/hbase/conf/;done
移除 HBase 裏面的不必要 log4j 的 jar 包
cd /data/hbase/lib
mv slf4j-log4j12-1.7.5.jar slf4j-log4j12-1.7.5.jar.bak
4、啟動服務
啟動hadoop集群
$ cd /data/hadoop/sbin
$ ./start-all.sh
啟動hbase集群
$ cd /data/hbase/bin
$ ./start-hbase.sh
啟動MapReduce歷史記錄服務
$ cd /data/hbase/bin
$ ./mr-jobhistory-daemon.sh start historyserver
5、驗證
查看pid文件
192.168.10.101
$ cd /data/hadoop_data/pids
$ ll
total 24
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-namenode.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-zkfc.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:49 hbase-hduser-master.pid
-rw-r--r-- 1 hduser hadoop 33 Jun 6 22:49 hbase-hduser-master.znode
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:49 mapred-hduser-historyserver.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 yarn-hduser-resourcemanager.pid
192.168.10.102
$ ll
total 12
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-namenode.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-zkfc.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:49 hbase-hduser-master.pid
192.168.10.103
$ ll
total 20
-rw-r--r-- 1 hduser hadoop 6 Jun 6 22:48 hadoop-hduser-datanode.pid
-rw-r--r-- 1 hduser hadoop 6 Jun 6 22:48 hadoop-hduser-journalnode.pid
-rw-r--r-- 1 hduser hadoop 6 Jun 6 22:49 hbase-hduser-regionserver.pid
-rw-r--r-- 1 hduser hadoop 43 Jun 6 22:49 hbase-hduser-regionserver.znode
-rw-r--r-- 1 hduser hadoop 6 Jun 6 22:48 yarn-hduser-nodemanager.pid
192.168.10.104
$ ll
total 20
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-datanode.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-journalnode.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:49 hbase-hduser-regionserver.pid
-rw-r--r-- 1 hduser hadoop 43 Jun 6 22:49 hbase-hduser-regionserver.znode
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 yarn-hduser-nodemanager.pid
192.168.10.105
$ ll
total 20
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-datanode.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-journalnode.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:49 hbase-hduser-regionserver.pid
-rw-r--r-- 1 hduser hadoop 43 Jun 6 22:49 hbase-hduser-regionserver.znode
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 yarn-hduser-nodemanager.pid
192.168.10.106
$ ll
total 16
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-datanode.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:49 hbase-hduser-regionserver.pid
-rw-r--r-- 1 hduser hadoop 43 Jun 6 22:49 hbase-hduser-regionserver.znode
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 yarn-hduser-nodemanager.pid
192.168.10.107
$ ll
total 16
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 hadoop-hduser-datanode.pid
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:49 hbase-hduser-regionserver.pid
-rw-r--r-- 1 hduser hadoop 43 Jun 6 22:49 hbase-hduser-regionserver.znode
-rw-r--r-- 1 hduser hadoop 7 Jun 6 22:48 yarn-hduser-nodemanager.pid
查看調用是否正常
參考:
官網文檔:
http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/ClusterSetup.html
官網配置參考:
http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml參考文章:
https://blog.csdn.net/qq_26091271/article/details/50411383
https://www.cnblogs.com/hanganglin/p/4563716.html
https://blog.csdn.net/odailidong/article/details/79656188
記錄一次生產環境hadoop集群優化以及pid文件缺失處理