一、优化准备

优化需要根据实际情况综合分析


1、关闭系统swap分区(如果未关闭的话)


在Hadoop中,如果使用系统默认设置,会导致swap分区被频繁使用,集群会不断发出警告。


对于每个作业处理的数据量和每个Task中用到的各种缓冲,用户都是完全可控的。


echo "vm.swappiness = 0" >> /etc/sysctl.conf


说明:尽量不使用交换分区,注意不是禁用


2、资源和配置信息

2台namenode,5台datanode资源和配置信息


服务分布表如下所示:

记录一次生产环境hadoop集群优化以及pid文件缺失处理_ 优化


软件版本:

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(192.168.10.103: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