hadoop之调优简介
一、HDFS核心参数
HDFS一般由NameNode(NN)、DataNode(DN)、SecondaryNameNode(2NN)等组成,NameNode是HDFS的核心管理者,DataNode是HDFS每个节点的管理者。
1、NameNode内存配置
通过以下命令可以查看NameNode的占用内存
jmap -heap 进程号
通过以下命令可以查看节点运行的进程:
$ jps
3088 NodeManager
2611 NameNode
3271 JobHistoryServer
2744 DataNode
3579 Jps
# 查看NameNode占用内存
jmap -heap 2611
# 查看DataNode占用内存
jmap -head 2744
NameNode的默认内存是2000M,在hadoop-env.sh文件中配置如下:
HADOOP_NAMENODE_OPTS=-Xmx3072m
如果想将其修改为1G,则可以通过以下文件,添加内容如下:
etc/hadoop/hadoop-env.sh
export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS -Xmx1024m"
按照一般的经验值:
NameNode最小值为1G,且每增加百万个Block,增加1G内存;
DataNode最小值为4G,副本数低于四百万时为4G,超过4百分每增加100万个副本,增加1G内存。
2、NameNode心跳并发配置
NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。默认值在 hdfs-site.xml 中配置为10.
<property>
<name>dfs.namenode.handler.count</name>
<value>10</value>
</property>
一般的经验是根据DataNode的台数来配置,配置公式为:
dfs.namenode.handler.count = 20 x loge为底台数的对数
比如DataNode的台数为3,则为 201.0986 = 21线程;DataNode的台数为200,则为205.298 = 106线程。
3、开启回收站配置
回收功能配置:
我们默认在HDFS删除文件时,是不可以恢复的,但可以开启HDFS的回收站功能,在删除文件不超时的情况下,可以恢复数据,起到防止误删的效果。
回收站的配置在 core-site.xml 中配置,fs.trash.interval 的默认值是0,表示不开启回收功能,如果为其他数字,表示垃圾回收的保存时间,单位是分钟,下面是垃圾回收保存1分钟:
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
参数值 fs.trash.checkpoint.interval 表示检查回收站的间隔时间,如果该值为0,则该值设置和fs.trash.interval 的参数值相等。要求是 fs.trash.checkpoint.interval <= fs.trash.interval 。
回收功能路径:
回收站目录在HDFS集群中的路径:/user/mrlin/.Trash/….
回收功能注意事项:
通过Web端删除的文件,不会进入回收站;
通过程序端,需要调用 moveToTrash() 接口才会进入回收站;
只有通过命令行利用hadoop fs -rm命令删除的文件才会走回收站。
恢复回收站数据:
hadoop fs -mv /user/mrlin/.Trash/Current/user/mrlin/input /user/mrlin/input
需要手动将会在站里面的文件移动或者复制出来HDFS的政策目录。
二、HDFS集群压测
一个集群搭建完成后,不能立刻投入使用,必须对集群做一定的压测,了解集群大概能承受多大的访问量和集群的大概性能。HDFS的读写性能主要受磁盘和网络的影响,测试可以使用hadoop自带的测试程序。
测试网络性能:
# 可以在 /opt/module/sortware 中测试:
python -m SimpleHTTPServer
测试集群写性能:
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
其中 nrFiles n为生成mapTask的数量,生产环境一般可通过hadoop103:8088查看CPU核数,设置为(CPU核数 - 1)
生成信息解读:
Number of files:生成mapTask数量,一般是集群中(CPU核数-1),我们测试虚拟机就按照实际的物理内存-1分配即可
Total MBytes processed:单个map处理的文件大小
Throughput mb/sec:单个mapTak的吞吐量
计算方式:处理的总文件大小/每一个mapTask写数据的时间累加
集群整体吞吐量:生成mapTask数量*单个mapTak的吞吐量
Average IO rate mb/sec:平均mapTak的吞吐量
计算方式:每个mapTask处理文件大小/每一个mapTask写数据的时间全部相加除以task数量
IO rate std deviation:方差、反映各个mapTask处理的差值,越小越均衡
由于副本在hadoop102本地,因此不参与测试,上面每个服务器写10个文件,共2个服务器,压测速度大概是Throughput mb/sec:1.61,因此实际为1021.61 = 32M/s 左右,而服务器的带宽为 30M/s,表示所有的网络资源都已经用满,因为瓶颈就在网络或者磁盘的最小值。
如果实测速度远远小于网络,并且实测速度不能满足工作需求,可以考虑采用固态硬盘或者增加磁盘个数。
测试集群的读性能:
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB
读取的结果为:Throughput mb/sec: 200.28
这里读取的结果远大于写入的结果,是因为每个数据都是存3个副本,且只有3台服务器,所以所有的数据都是本地读取的,也就是没有用到网络,瓶颈就是网络磁盘的读取速度。
删除测试生成数据:
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -clean
三、HDFS多目录
1、NameNode多目录配置
NameNode 的本地目录可以配置成多个,且每个目录存放内容相同,增加了系统的可靠性。
在 hdfs-site.xml 文件中添加如下内容:
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.dir}/dfs/name2</value>
</property>
配置 NameNode 必须重新初始化集群,或者在集群创建开始就要设置多目录的配置,重新初始化集群的话,必须先删除所有节点的 data 和 logs 中所有数据。
rm -rf data/ logs/
rm -rf data/ logs/
rm -rf data/ logs/
bin/hdfs namenode -format
sbin/start-dfs.sh
2、DataNode多目录配置
不同于 NameNode 的多目录,DataNode 设置多目录是每个目录存储的数据是不一样的,它是防止单块硬盘的空间不够用,给 NameNode 配多一个目录。
具体配置在 hdfs-site.xml 文件中添加如下内容:
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value>
</property>
3、集群数据均衡之磁盘间数据均衡
当集群新增磁盘时,可以使用磁盘均衡命令,将各个磁盘的负载均衡配置。
(1)生成均衡计划
hdfs diskbalancer -plan hadoop103
(2)执行均衡计划
hdfs diskbalancer -execute hadoop103.plan.json
(3)查看当前均衡任务的执行情况
hdfs diskbalancer -query hadoop103
(4)取消均衡计划任务
hdfs diskbalancer -cancel hadoop103.plan.json
四、HDFS集群扩容及缩容
1、配置白名单
白名单:表示在白名单的主机IP地址可以用来存储数据。
黑名单:表示在黑名单的主机IP地址不可以用来存储数据,常用来缩容服务器的数量。
(1)在NameNode节点的/opt/module/hadoop-3.1.3/etc/hadoop目录下分别创建whitelist 和blacklist文件
创建白名单:并写入白名单服务器
vim whiltelist
# 并写入以下内容:
hadoop102
hadoop103
touch blacklist
(2)在 hdfs-site.xml 里面增加白名单和黑名单的文件路径
<!-- 白名单 -->
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>
</property>
<!-- 黑名单 -->
<property>
<name>dfs.hosts.exclude</name>