HDFS多目录
在hdfs-site.xml文件中配置多目录:
Namenode多目录配置,namenode本地目录可以配置成多个,且每个目录的内容相同,提高可靠性。
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.dir}/dfs/name2</value>
</property>
Datanode多目录配置,每个目录存储的数据不同(不是副本)。目的是随着数据量增多,磁盘容量不够的情况下,需要扩容。
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value>
</property>
HDFS参数调优
Hadoop3.x中内存是动态分配的,不是很合理。后面追加配置,比如1G
export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS-Xmx1024m"
namenode最小1GB,每增加100W个block,增加1GB内存。
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS-Xmx1024m"
datanode最小4GB,当datanode上副本数超过400w时,每增加100w,增加1GB
以上还要考虑服务器的实际内存
Namenode有一个工作线程池,用来处理不同的datanode的并发心跳以及客户端并发的元数据操作。默认值是10,通常需要增大该参数,在hdfs-site.xml中配置:
dfs.namenode.handler.count = 20 × logeClusterSize
开启回收站
开启回收站后,hadoop fs -rm命令删除的文件、代码中调用moveToTrash()会进入收回站,其他情况不会进入回收站。
在core-site.xml文件中配置:
<property>
<name>fs.trash.interval</name>
<value>0</value> 默认为0,表示未开始,大于0表示存活时间,单位为分钟
</property>
恢复数据利用命令 hadoop fs -mv /user/admin/.Trash/xxxx
Yarn参数调优(在yarn-site.xml修改)
情景描述:数据统计用hiveSQL,没有数据倾斜,小文件合并处理,开启JVM重用,没有IO阻塞,内存用了不到50%,但是跑的非常慢,数据量洪峰过来时,整个集群会宕掉。
优化方法:检查nodemanager的内存是多少,以及cpu核数是否接近服务器的配置,如果服务器内存很大,nodemanager设置的物理内存过小(一般虚拟内存/物理内存=2.1,表示每使用1MB物理内存,最多可以使用2.1MB的虚拟内存,虚拟内存就是实际运行所需要的内存量),那么就调大物理内存参数。服务器节点上yarn可使用的物理内存默认是8G,如果节点内存资源小于8G,则需要调小这个值,yarn不会智能的探测节点的物理内存总量。
- 选择调度器,默认是容量调度器。要设置资源的最低下限和最高上限,目的是防止同一用户的作业独占队列中的资源。(内存不足可以适当调高最高上限值)
- Yarn默认是开启对虚拟内存的检查,如果当前集群job提交情况所需要的内存超出所设定的虚拟内存量,那么该任务会被直接kill掉。这种情况属于少数,如果真的出现这种情况,可以关闭yarn对虚拟内存的检查。但是这种方法并不推荐,因为这个参数影响面比较大。即使出现虚拟内存不足,推荐调整物理内存大小。