Hbase优化(二)Hadoop的通用性优化
1) NameNode元数据备份使用SSD
固态驱动器(Solid State Disk或Solid State Drive,简称SSD),俗称固态硬盘。
2) 定时备份NameNode上的元数据
每小时或者每天备份,如果数据极其重要,可以5~10分钟备份一次。备份可以通过定时任务复制元数据目录即可。
3) 为NameNode指定多个元数据目录
使用dfs.name.dir或者dfs.namenode.name.dir指定。这样可以提供元数据的冗余和健壮性,以免发生故障。
4) NameNode的dir自恢复
设置dfs.namenode.name.dir.restore为true,允许尝试恢复之前失败的dfs.namenode.name.dir目录,在创建checkpoint时做此尝试,如果设置了多个磁盘,建议允许。
5) HDFS保证RPC调用-远程过程调用会有较多的线程数
hdfs-site.xml
属性:dfs.namenode.handler.count 解释:该属性是NameNode服务默认线程数,的默认值是10,根据机器的可用内存可以调整为50~100
属性:dfs.datanode.handler.count 解释:该属性默认值为10,是DataNode的处理线程数,如果HDFS客户端程序读写请求比较多,可以调高到15~20,设置的值越大,内存消耗越多,不要调整的过高,一般业务中,5~10即可。 |
6) HDFS副本数的调整
hdfs-site.xml
属性:dfs.replication 解释:如果数据量巨大,且不是非常之重要,可以调整为2~3,如果数据非常之重要,可以调整为3~5。 |
7) HDFS文件块大小的调整
hdfs-site.xml
属性:dfs.blocksize 解释:块大小定义,该属性应该根据存储的大量的单个文件大小来设置,如果大量的单个文件都小于100M,建议设置成64M块大小,对于大于100M或者达到GB的这种情况,建议设置成256M,一般设置范围波动在64M~256M之间。 |
8) MapReduce Job任务服务线程数调整
mapred-site.xml
属性:mapreduce.jobtracker.handler.count 解释:该属性是Job任务线程数,默认值是10,根据机器的可用内存可以调整为50~100 |
9) Http服务器工作线程数
mapred-site.xml
属性:mapreduce.tasktracker.http.threads 解释:定义HTTP服务器工作线程数,默认值为40,对于大集群可以调整到80~100 |
10) 文件排序合并优化
mapred-site.xml
属性:mapreduce.task.io.sort.factor 解释:文件排序时同时合并的数据流的数量,这也定义了同时打开文件的个数,默认值为10,如果调高该参数,可以明显减少磁盘IO,即减少文件读取的次数(在资源允许的情况下)。 |
11) 设置任务并发
mapred-site.xml
属性:mapreduce.map.speculative 解释:该属性可以设置任务是否可以并发执行,如果任务多而小,该属性设置为true可以明显加快任务执行效率,但是对于延迟非常高的任务,建议改为false,这就类似于迅雷下载。 |
12) MR输出数据的压缩
mapred-site.xml
属性:mapreduce.map.output.compress、mapreduce.output.fileoutputformat.compress 解释:对于大集群而言,建议设置Map-Reduce的输出为压缩的数据(建议Map端的),而对于小集群,则不需要。 |
13) 优化Mapper和Reducer的个数
mapred-site.xml
属性: mapreduce.tasktracker.map.tasks.maximum mapreduce.tasktracker.reduce.tasks.maximum 解释:以上两个属性分别为一个单独的Job任务可以同时运行的Map和Reduce的数量。 设置上面两个参数时,需要考虑CPU核数、磁盘和内存容量。 假设一个8核的CPU,业务内容非常消耗CPU,那么可以设置map数量为4,如果该业务不是特别消耗CPU类型的,那么可以设置map数量为40,reduce数量为20。 这些参数的值修改完成之后,一定要观察是否有较长等待的任务,如果有的话,可以减少数量以加快任务执行,如果设置一个很大的值,会引起大量的上下文切换,以及内存与磁盘之间的数据交换,这里没有标准的配置数值,需要根据业务和硬件配置以及经验来做出选择。 在同一时刻,不要同时运行太多的MapReduce,这样会消耗过多的内存,任务会执行的非常缓慢,我们需要根据CPU核数,内存容量设置一个MR任务并发的最大值,使固定数据量的任务完全加载到内存中,避免频繁的内存和磁盘数据交换,从而降低磁盘IO,提高性能。 一定要经过测试才可以确定合适的值。 |
大概估算公式:
map = 2 + ⅔cpu_core
reduce = 2 + ⅓cpu_core