一、Hadoop调优
1、调整操作系统打开文件描述符的上限
通过命令“ ulimit -a”可以看到所有系统资源参数,这里面需要重点设置的是“open files”和“max user processes”,其它可以酌情设置。
要永久设置资源参数,主要是通过下面几个文件来实现:
-
/etc/security/limits.conf
-
/etc/security/limits.d/90-(centos6.x)
-
/etc/security/limits.d/20-(centos7.x)
2、修改参数
此内核参数对应的具体文件路径为/proc/sys/net/core/somaxconn,它用来设置socket监听(listen)的backlog上限。
什么是backlog呢?
backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。如何server处理请求较慢,以至于监听队列被填满时,新来的请求会被拒绝。所以必须增大这个值,此参数默认值为128。
作为网络参数的基础优化,建议修改为如下值:
echo 4096 >/proc/sys/net/core/somaxconn
3、调整操作系统使用swap的比例
swap本意是作为物理内存的扩展来使用的,但是在内存充足的今天,使用swap的场景越来越少,主要是使用swap会极大降低应用性能,在hadoop中,如果数据交换到swap,会导致操作超时,非常影响hadoop的读写以及数据分析性能。
可以通过系统内核参数/proc/sys/vm/swappiness来调整使用swap的比例。swappiness=0的时候表示最大限度使用物理内存,然后才是swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
linux的基本默认设置为60,表示你的物理内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。此值在一些对内存需求高的服务器上,需要设置的足够小,比如hadoop、redis、hbase机器上,应该设置0-10之间,表示最大限度使用物理内存。
4、禁用THP(Transparent Huge Pages)功能
THP的本意是为提升内存的性能,但是在hadoop环境中发现,此功能会带来CPU占用率增大,影响hadoop性能,因此建议将其关闭。
首先检查THP的启用状态:
-
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
-
[always] madvise never
-
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
-
[always] madvise never
这里显示always,表示THP目前是启用状态。
要禁用THP,可打开/etc//文件,然后添加如下内容:
-
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
-
echo never > /sys/kernel/mm/transparent_hugepage/enabled
-
fi
-
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
-
echo never > /sys/kernel/mm/transparent_hugepage/defrag
-
fi
然后保存退出,最后,赋予文件执行权限,执行如下命令:
-
[root@localhost ~]# chmod +x /etc//
-
[root@localhost ~]# source /etc/
5、大数据平台网络架构设计
Hadoop基础网络架构:
6、大数据平台硬件选型
在一个典型Hadoop架构中,通常有5个角色,分别是NameNode(和Standby NameNode)、ResourceManager、NodeManager、DataNode以及外围机。其中NameNode负责协调集群上的数据存储,ResourceManager则是负责协调计算分析、而Standby NameNode属于NameNode的热备份,这三者属于管理角色,一般需要部署在独立的服务器上,而NodeManager和DataNode角色主要用于计算和存储,为了获得更好的性能,通常将NodeManager和DataNode部署在一起。
推荐对NameNode、ResourceManager及其Standby NameNode节点选择统一的硬件配置,基础配置推荐如下:
- CPU:推荐2路8核、2路10核或2路12核等,主频至少2-2.5GHz;
- 内存:推荐64-256GB;
- 磁盘:分为2组,系统盘和数据盘,系统盘2T*2,做raid1,数据盘2-4T左右,数据盘的数量取决于你想冗余备份元数据的份数;
- 网卡:万兆网卡(光纤卡);
- 电源:均配置冗余电源;
下面再说下企业通用和主流的NodeManager、DataNode节点服务器硬件配置,如下表所示:
- CPU:推荐2路10核、2路12核或2路14核等,主频至少2-2.5GHz;
- 内存:推荐64-512GB;
- 磁盘:分为2组,系统盘和数据盘,系统盘2T*2,做raid1,数据盘4-8T左右,数据盘单盘使用,无需做raid;
- 网卡:万兆网卡(光纤卡),存储越多,网络吞吐就要求越高;
- 电源:最好配置冗余电源,如预算不足,也可使用单电源;
7、大数据平台架构设计要点
典型大数据平台拓扑:
在构建大数据平台之前,首先要考虑需要的存储容量、计算能力、是否有实时分析的需求、数据的存储周期等,然后再根据这些需求进行平台的架构设计。
同时,还要考虑平台的健壮性,例如任意一个节点宕机都不会影响平台的正常使用、任何一个磁盘的损坏都不会导致数据丢失等。
8、大数据平台存储、计算节点规划
这里以我们之前的一个实际案例来进行介绍,我们目前有数据量500TB,每天数据量增长2T左右,数据块副本为3,所有数据存储周期为2年,根据这个需求,就可以算出需要的存储节点数。
- 2年数据量需要的存储空间:(2*3)*(365*2)=4380TB;
- 总共需要的存储空间:4380TB+(500*3)TB=5880TB;
如果以一个存储节点12块4T硬盘来计算,需要约(5880TB/48TB=147)123个存储节点,而如果采用一个存储节点10块8T硬盘来计算,需要约(5880TB/80TB=147)74个存储节点即可。
大数据平台对硬件的规划原则是:如果能够确切的知道存储和计算的资源需要,那么就按照这个需求来配置即可,而如果无法准确的评估出存储和计算资源需求量,那么一定要留下可扩展的余地,比如留下足够的的机柜位置、网络接口、磁盘接口等,在实际应用中,存储容量一般很好预估,但计算资源很难预估,因此留下足够的扩展接口,是必须要考虑的一个问题。
二、HADOOP日常运维问题汇总
1、如何下线一个datanode节点(集群缩容)
1. 修改文件
找到namenode节点配置文件/etc/hadoop/conf/文件如下选项:
-
<property>
-
<name></name>
-
<value>/etc/hadoop/conf/hosts-exclude</value>
-
</property>
2. 修改hosts-exclude文件
在hosts-exclude中添加需要下线的datanode主机名,执行如下操作:
-
vi /etc/hadoop/conf/hosts-exclude
-
172.16.213.188
3. 刷新配置
在namenode上以hadoop用户执行下面命令,刷新hadoop配置:
[hadoop@namenodemaster ~]$hdfs dfsadmin -refreshNodes
4. 检查是否完成下线
通过执行如下命令检查下线是否完成:
[hadoop@cdh5master ~]$hdfs dfsadmin -report
也可以通过查看NameNode的50070端口访问web界面,查看HDFS状态,需要重点关注退役的节点数以及复制的块数和进度。
2、某个datanode节点磁盘坏掉怎么办
如果某个datanode节点的磁盘出现故障,将会出现此节点不能写入操作而导致datanode进程退出,针对这个问题,首先在故障节点上查看/etc/hadoop/conf/文件中对应的参数设置,去掉故障磁盘对应的目录挂载点。
然后,在故障节点查看/etc/hadoop/conf/文件中对应的-dirs参数设置,去掉故障磁盘对应的目录挂载点。最后,重启此节点的datanode服务和nodemanager服务即可。
3、Namenode服务器故障了怎么办
在HDFS集群中,Namenode主机上存储了所有的元数据信息,如果此信息丢失,那么整个HDFS上面的数据将不可用,而如果Namenode服务器发生了故障无法启动,解决的方法分为两种情况:如果Namenode做了高可用服务,那么在主Namenode故障后,Namenode服务会自动切换到备用的Namenode上,这个过程是自动的,无需手工介入。
如果你的Namenode没做高可用服务,那么还可以借助于SecondaryNameNode服务,在SecondaryNameNode主机上找到元数据信息,然后直接在此节点启动Namenode服务即可,当然这种方式可能会丢失部分数据,因为SecondaryNameNode实现的是Namenode的冷备份。
由此可知,对Namenode进行容灾备份至关重要,在生产环境下,建议通过standby Namenode实现Namenode的高可用热备份。
4、datanode存储节点数据倾斜怎么解决
在HDFS集群中,磁盘损坏是家常便饭,磁盘故障后,我们一般的策略是更换新的硬盘,而当新硬盘更换后,只有新数据会写入这个硬盘,而之前的老数据不会自动将数据平衡过来,如此下去,更换的硬盘越多,节点之间、每个节点的各个磁盘之间的数据将越来越不平衡。
如何解决这个问题呢,此时可以使用hadoop提供的Balancer程序得HDFS集群达到一个平衡的状态,执行命令如下:
[hadoop@namenodemaster sbin]$ $HADOOP_HOME/bin/ –t 5%
或者执行如下命令:
[hadoop@namenodemaster sbin]$ hdfs balancer -threshold 5
这个命令中-t参数后面跟的是HDFS达到平衡状态的磁盘使用率偏差值。如果节点与节点之间磁盘使用率偏差小于5%,那么我们就认为HDFS集群已经达到了平衡的状态。
5、hadoop集群如何实现扩容
1. 新节点部署hadoop环境
新增节点在系统安装完成后,要进行一系列的操作,比如系统基本优化设置,hadoop环境的部署和安装,jdk的安装等等,这些基础工作需要事先完成。
2. 修改文件
在namenode上查看/etc/hadoop/conf/文件,找到如下内容:
-
<property>
-
<name></name>
-
<value>/etc/hadoop/conf/hosts</value>
-
</property>
3. 修改hosts文件
在namenode上修改/etc/hadoop/conf/hosts文件,添加新增的节点主机名,操作如下:
-
vi /etc/hadoop/conf/hosts
-
slave0191.
最后,将配置同步到所有datanode节点的机器上。
4. 使配置生效
新增节点后,要让namenode识别新的节点,需要在namenode上刷新配置,执行如下操作:
[hadoop@namenodemaster ~]$hdfs dfsadmin -refreshNodes
5. 在新节点启动dn服务
在namenode上完成配置后,最后还需要在新增节点上启动datanode服务,执行如下操作:
[hadoop@ ~]$ hdfs --daemon start datanode
这样,一个新的节点就增加到集群中了,hadoop的这种机制可以在不影响现有集群运行的状态下,任意新增或者删除某个节点,非常方便。
6、发现HDFS下有missing blocks,怎么解决
这个问题也经常发生,并且会有数据丢失,因为一旦HDFS集群出现missing blocks错误,那意味着有元数据丢失或者损坏,要恢复的难度很大,或者基本无法恢复,针对这种情况,解决的办法就是先执行如下命令:
[hadoop@namenodemaster sbin]$ hdfs fsck /blocks-path/
此命令会检查HDFS下所有块状态,并给出那些文件出现了块丢失或损坏,最后执行如下命令删除这些文件即可:
[hadoop@namenodemaster sbin]$ hdfs fsck -fs hdfs://bigdata/logs/ -delete
上面是删除HDFS上这个文件,因此此文件元数据丢失,无法恢复,所以只能删除。