本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系
Hadoop 调优之 HDFS 调优篇
Hadoop 调优之 MapReduce 调优篇
Hadoop 调优之 YARN 调优篇
Hive 如何进行企业级调优?
管理员通常会保持 Linux 服务器内核的默认设置,这并不是一个明智的做法,因为这有可能对集群的性能产生不利的影响!
下表给出了在 Hadoop 生产集群中推荐使用的 Linux 内核参数配置。
Linux 内核参数配置 | 参数说明 |
---|---|
fs.file-mx=6815744 | 文件描述符总数 |
fs.aio-max-nr=1048576 | 最大并发I/O请求数 |
net.core.rmem_default=262144 | 操作系统接收缓冲区的默认大小 |
net.core.wmem_default=262144 | 操作系统发送缓冲区的默认大小 |
net.core.rmem_max=16777216 | 系统接收缓冲区最大值 |
net.core.wmem_max=16777216 | 系统发送缓冲区最大值 |
net.ipv4.tcp_rmem=409626214416777216 | 接收窗口尺寸的最小、默认、最大值 |
net.ipv4.tcp_wmem=409626214416777216 | 发送窗口尺寸的最小、默认、最大值 |
为了避免集群中的任何文件描述符错误,需要增加单个用户或进程一次可以打开的文件数量的限制。
默认值只有 128 。
可以使用以下命令检査当前限制(第一个为软限制第二个为硬限制)。
[root@hadoop ~]# ulimit -Sn
1024
[root@hadoop ~]# ulimit -Hn
4096
[root@hadoop ~]#
需要将 ulimit 值至少提高至4096( Hortonworks等推荐10000或者更多)。
可以通过编辑 /etc/security/limits.conf 文件来执行此操作,如下所示:
Soft nofile 4096
Hard nofile 4096
且更改了内核设置,则可以通过执行以下命令来动态加载新设置
[root@hadoop ~]# sysctl -p
可以通过发出以下命令来确认新的内核设置:
[root@hadoop ~]# sysctl -a
确保在挂载所有磁盘时使用 noatime 时间以及挂载所有目录时使用 nodir 时间。
这样, 可以避免在对 Linux 文件系统中的文件或目录进行读取操作时的不必要写入操作,从而提高集群性能。
使用 hdparm -t命令测试磁盘速度,如下所示
$ hdparm -t /dev/sdal
如果没有看到 70MB/S 以上的速度,这意味着有一个潜在的问题存在
通过确保不启用磁盘驱动器的 IDE 仿真等功能来保证服务器 BIOS 为最佳性能配置。
存储和系统管理员会关注这个配置。
注意:在挂磁盘驱动器之前,将所有 Hadoop 目录下的文件权限更改为 700 这样在却驱动器时,向这些驱动器写入的任何进程都不会占满操作系统。
为了提高吞吐量和弹性,最好通过执行NC绑定来组合网络接口。
确保集群所有节点的时钟是同步的。
如果集群无法访问 Intenet ,则必须将集群中的一个服务器设置为 NTP 服务器。
通过编辑/etc/sysconfig/ntpd 文件启用 NTP 守护进程来同步所有集群节点上的网络时间同步所有集群节点上的网络时间对于诸如 ZooKeeper 、 Kerberos 和 HBase 之类的应用程序至关重要。
当通过日志文件对集群进行故障排除时,在集群中使用同步时间也很重要。
注意尽管不是必须的,但最好使用单独的虚拟局域网( VLAN )为 Hadoop 提供专用交换基础设施。
在 CentOS8 中默认不再支持 ntp 软件包,时间同步将由 chrony 来实现,可以通过修改 /etc/chrony.conf 实现。
使用主机名而不是 IP 地址来标识集群节点。
在理想情况下,集群中的所有节点都必须被配置 DNS 和反向 DNS 。
确保将所有主机名设置为完全限定域名( FQDN )。
以下是一个例子
# hostname -- fqdn
hadoop1.localdomain
#
如果由于某些原因无法配置 DNS ,确保编辑所有节点的 /etc/hosts 文件,将集群中的所有节点列入其中。
每个主机必须能够执行正向查找(利用主机名)和反向査找(利用 IP 地址)。
主机命令可帮助验证正向和反向查找,如下所示
# host hadoop1
hadoop1.localdomain has address 10.192.2.29
# host 10.192.2.29
10.192.2.29 in-addr.arpa domain name pointer hadoop1.localdomain
#
由于 Hadoop 大量使用基于网络的服务(如 DNS ),因此启用名称服务器缓存守护程序( nscd )以降低名称解析延迟是个好主意
理想情况下,服务器都不应该 swap ,尤其是 DataNode 。
可以使用以下命令在这些服务器上完全禁用该功能。
# swapoff - a
可以使用以下命令检查服务器上的 swap 状态
# swapon - s
默认情况下,大多数 Linux 操作系统的 swappiness 被设置为 60 。
如果 swappiness 设置为零,除非内存不足, Linux 将避免使用磁盘,而设置为 100 表示操作系统立即将程序切换到磁盘。
我们知道,设置为 60 意味着从内存使用量达到操作系统分配的内存的半左右的时间开始,操作系统会相当频繁地使用磁盘上的交换文件。
例如,如果将 swappiness 调低到 10 ,则只有当 RAM 占用率达到 90 %左右时,操作系统才会使用磁盘上的交换文件。
Linux 管理员可以将以下设置添加到 /etc/sysctl.conf 文件中来更改系统的 swappiness
vm.swappiness=10
管理员必须重新启动服务器才能使新的 swappiness 设置生效。
对于将 swappiness 值设置为多低,没有特别明确的强制规定。
Cloudera 专家建议将其设置为 1。
虽然这并不是一个绝对的要求,但 SELinux 有时会干扰 Hadoop 的安装,所以在开始安装 Hadoop 之前最好禁用 SELinux 。
此外, SELinux 会对集群造成 7 %~ 10 %的性能损失。
可以执行以下命令获取当前的 SELinux 状态
# getenforce
如果当前模式的值为 enforcing ,则 SELinux 处于启用状态。
可以将状态更改为 permissive 来禁用它,如下所示:
# setenforce 0
需要为某些网络相关的 Hadoop 配置参数设置值 0.0.0.0 ,将 Hadoop 绑定到服务器的 IPv6 地址。
如果没有连接到 IPv6 网络,则可以简单地禁用集群节点上的 IPv6 。
可以通过编辑 /etc/sysctl.conf 文件并在文件末尾添加以下行来禁用 IPv6 :
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.io.disable_ipv6 = 1
对 sysctl.conf 文件进行更改后,必须重新启动服务器。
重新启动后,执行以下命令来检查更改是否成功:
$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
如果禁用 IPv6 ,输出应该为 1 ,否则为 0 。
也可以通过为环境变量 HADOOP_OPTS 添加以下值来禁用 Hadoop 的 IPv6 。
将此行添加到集群的 hadoop-env.sh 文件中:
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
在安装 Hadoop 时,最好关掉网络防火墙(并进行检査),如下所示
# service iptables stop
# service iptables status
安装完成后,可以重新启用 IP 表。
可以通过 shell 来限制用户能利用的集群资源。
为此,可以编辑 /etc/security/limits.conf 文件,该文件规定了如何限制用户使用资源。
limits . conf 文件用于配置重要的操作系统属性的“软”和“硬”限制,如文件大小、堆栈大小和进程的优先级(精度)等,如下所示。
将以下行添加到 /etc/security/limits.conf 文件中:
soft nofile 32768
hard nofile 32768
soft nproc 32768
soft nproc 32768
nofile 属性限制每个用户进程打开的文件描述符的数量, nproc指定最大进程数。
软限制设置意味着警告,硬限制设置是实际的资源限制。
据 Cloudera 和 Hortonworks 的专家介绍,THP压缩会降低 Hadoop的性能。
所以,禁用碎片整理是一个很好的做法,具体方法如下所示(将此行添加到 /etc/rc.local 文件):
$ echo 'never'; defrag_file_pathname
检查节点之间的无密码连接,以确保对SSH进行了正确的配置。