一、HDFS调优
1.设置合理块大小(dfs.block.size)
如果块过小,产生的元数据大,会增加namenode的压力;如果块过大可能会随时磁盘空间
2.将中间结果分布多个磁盘上,提高写入速度(mapred.local.dir)
配置mapred-site.xml
<property >
<name>mapred.local.dir</name>
<value>/var/hadoop/hdfs_folder/mapred/local/,/home/hadoop/data1/mapred/local/</value>
</property>
3.设置namenode能同时处理请求数(dfs.namenode.handler.count)
dfs.namenode.handler.count=20 * log2(Cluster Size),比如集群规模为8台时,此参数设置为60
4.编辑日志存储路径dfs.namenode.edits.dir设置与镜像文件存储路径dfs.namenode.name.dir尽量分开,达到最低写入延迟
二、yarn调优
容器内存
yarn.nodemanager.resource.memory-mb
最小容器内存
yarn.scheduler.minimum-allocation-mb
容器内存增量
yarn.scheduler.increment-allocation-mb
最大容器内存
yarn.scheduler.maximum-allocation-mb
1.服务器节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。yarn.nodemanager.resource.memory-mb
2.单个任务可申请的最多物理内存量,默认是8192(MB)。yarn.scheduler.maximum-allocation-mb
3.如果想资源分配灵活一些,可以把最大容器内存配置和容器内存一样;如果想资源分配严格,把最小容器内存和最大容器内存配置一样的数值,这样单个机器的内存就是一个固定值,如果单个机器内存是120G,可以设为资源使用100G
容器虚拟CPU内核
yarn.nodemanager.resource.cpu-vcores
最小容器虚拟CPU内核数量
yarn.scheduler.minimum-allocation-vcores
容器虚拟CPU内核增量
yarn.scheduler.increment-allocation-vcores
最大容器虚拟CPU内核数量
yarn.scheduler.maximum-allocation-vcores
vcore :虚拟cpu的core ,是yarn自己引入的概念,因为每台机器的性能不一样,每台机器的core代表的资源也不一样,yarn为了标准化这些有差异的机器,于是引入Vcore的概念。
一个物理core默认对应两个vcore
在生产上,一般会预留两个core,也就是少了4个vcore
yarn调度器
FIFO 先进先出,作业的等待时间比较长
capacity 计算(x)
yarn判断任务的大小,分配到不同的队列
B队列是小任务队列,预先占用集群的资源
让多个任务可以并行运行。
Job1拿到的资源没有公平方式多。因为它一部分需要分配给小队列。
Fair 公平 生产中用该调度器
为job动态调整系统资源。
运行的一些任务释放部分资源
给第二个任务运行。
当job2运行完之后,将资源释放后
job1会将资源重新占用
三、mr调优
1.增大环形缓冲区大小。由100m扩大到200m
2.增大环形缓冲区溢写的比例。由80%扩大到90%
3.设置Map、Reduce共存:调整slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间
4.改变输入分片与块大小一样,减少网络IO
5.MapTask默认内存大小为1G,可以增加MapTask内存大小为4-5g
6.ReduceTask默认内存大小为1G,可以增加ReduceTask内存大小为4-5g
7.map端压缩,reduce端压缩,小文件合并
四、Hadoop运维
利用SecondaryNamenode恢复Namenode
1.确保新的namenode {dfs.name.dir}目录存在,并移除其内容
2.把SecondaryNamenode节点中{fs.checkpoint.dir}的所有内容复制到新的namenode节点的{fs.checkpoint.dir}目录中,就是复制快照
3.在新的namenode上执行:
hadoop namenode -importCheckpoint
该步会从{fs.checkpoint.dir}中恢复{dfs.name.dir},并启动namenode
4.检查文件块完整性,执行: hadoop fsck /
5.停止Namenode
6.删除新的namenode{fs.checkpoint}目录下的文件
7.正式启动namenode