HADOOP调优与运维问题汇总

时间:2024-11-21 20:24:55

一、Hadoop调优

1、调整操作系统打开文件描述符的上限

通过命令“ ulimit -a”可以看到所有系统资源参数,这里面需要重点设置的是“open files”和“max user processes”,其它可以酌情设置。

要永久设置资源参数,主要是通过下面几个文件来实现:

  1. /etc/security/limits.conf 
  2. /etc/security/limits.d/90-(centos6.x)
  3. /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的启用状态:

  1. [root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
  2. [always] madvise never
  3. [root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
  4. [always] madvise never

这里显示always,表示THP目前是启用状态。

要禁用THP,可打开/etc//文件,然后添加如下内容: 

  1. if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  2. echo never > /sys/kernel/mm/transparent_hugepage/enabled
  3. fi
  4. if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  5. echo never > /sys/kernel/mm/transparent_hugepage/defrag
  6. fi

然后保存退出,最后,赋予文件执行权限,执行如下命令:

  1. [root@localhost ~]# chmod +x /etc// 
  2. [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/文件如下选项: 

  1. <property>    
  2. <name></name>     
  3. <value>/etc/hadoop/conf/hosts-exclude</value> 
  4. </property> 

2. 修改hosts-exclude文件

hosts-exclude中添加需要下线的datanode主机名,执行如下操作: 

  1. vi /etc/hadoop/conf/hosts-exclude 
  2. 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/文件,找到如下内容:

  1. <property>
  2.   <name></name>
  3.   <value>/etc/hadoop/conf/hosts</value>
  4. </property>

3. 修改hosts文件

在namenode上修改/etc/hadoop/conf/hosts文件,添加新增的节点主机名,操作如下:

  1. vi /etc/hadoop/conf/hosts
  2. 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上这个文件,因此此文件元数据丢失,无法恢复,所以只能删除。